0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
1 | |
Шаблон конечного автомата. Си18.04.2015, 22:11. Показов 38239. Ответов 33
Метки нет (Все метки)
0
|
18.04.2015, 22:11 | |
Ответы с готовыми решениями:
33
Быстродействие конечного автомата в QUARTUS|| Xilinx ISE 14.1. Реализация конечного автомата генератора последовательностей Построение конечного автомата Минимизация конечного автомата |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
21.04.2015, 11:05 | 21 |
Я об этом писал неоднократно. Называю эту фишку самоинициализацией. Компилятор в начале программы встраивает блок очистки озу и инициализацию переменных. Это позволяет нулевое состояние КА сделать состоянием самоинициализации модуля или всего устройства. Кстати, если в модулях применяются флаги, также можно сделать модуль с самоинициализацией. Сброшен флаг, инициализируем все что требуется и взводим флаг. При следующем вызове функции проверяем флаг, если взведен, выполняем код.
По поводу default, именно так и делаю. Забыл указать это в примерах.
0
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
21.04.2015, 13:34 | 22 |
Очень хорошо. Благодарю.
Рад, что пишу в нормальном стиле.
0
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
26.04.2015, 08:05 | 23 |
Я пользуюсь IAR для STM8
Попробовал воспользоваться макросами для определения массива функций. Есть проблема. Файл вложения: Код
//======================================================================== STATE (MAIN_OFF, proc_main_off) STATE (MAIN_OFF_WAIT, proc_main_off_woyt) STATE (MAIN_ON, proc_main_on) STATE (MAIN_ON_WAIT, proc_main_on_woyt) //======================================================================== Код
//======================================================================== typedef enum _main_states { #define STATE(name, func) name, #include "main_states.h" #undef STATE NUMBERS_MAIN_STATES } main_states; main_states main_index = MAIN_OFF; А второй макрос не компилируется: Код
void (*const main_states_func[NUMBERS_MAIN_STATES]) (void) = { #define STATE(name, func) func, #include "main_states.h" #undef STATE }; Если вручную вставляю названия состояний и имена функций, то всё в порядке. И второе. Мне очень не нравится смешивать enum тип в описании состояний и целочисленный индекс при вызове функции состояния из массива. К тому же, номер начального элемента в enum отдан на откуп компилятору, а не задан в явном виде. Он обязательно должен быть нулём, чтобы сошлись индекс указателя и значение состояния. Здесь могут быть проблемы. Нужно думать над более правильным решением.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
26.04.2015, 08:16 | 24 |
typedef.h
Код
#ifndef TYPEDEF_H #define TYPEDEF_H #include "typedef.h" //======================================================================== typedef void (*FUNC)(void); //======================================================================== //======================================================================== typedef void (*VECTORS)(); //======================================================================== #endif Код
//======================================================================== typedef enum proc_eds_states { #define STATE(name, func) name, #include "_proc_eds_main.h" #undef STATE PROC_EDS_MAIN_STATES } proc_eds_states; //------------------------------------------------------------------------ extern __flash VECTORS proc_eds_func [PROC_EDS_MAIN_STATES]; //------------------------------------------------------------------------ Код
#include "typedef.h" // !!!!!!!!!!!!!!!!!!!!!!! //======================================================================== __flash VECTORS proc_eds_func [PROC_EDS_MAIN_STATES] = { #define STATE(name, func) func, #include "_proc_eds_main.h" #undef STATE }; //------------------------------------------------------------------------ Код
//************************************************************************ //************************ Главный автомат ******************************* //************************************************************************ //======================================================================== STATE (PROC_EDS_MAIN_INIT, Proc_Eds_Main_Init) STATE (PROC_EDS_MAIN_STOP, Proc_Eds_Main_Stop) STATE (PROC_EDS_MAIN_MANUAL, Proc_Eds_Main_Manual) STATE (PROC_EDS_MAIN_AUTOMAT, Proc_Eds_Main_Automat) STATE (PROC_EDS_MAIN_EMERG_STOP, Proc_Eds_Main_Emerg_Stop) //========================================================================
0
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
26.04.2015, 12:25 | 25 |
Извиняюсь, вы в какой среде пишете?
Есть подозрение, что "VECTORS" расширяется во что - то стандартное.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
26.04.2015, 12:32 | 26 |
IAR. В предыдущем сообщении раскройте все spoiler. В typedef увидите:
//======================================================================== typedef void (*VECTORS)(); //======================================================================== Этот момент я никак не мог победить. Иногда лечится вписыванием в сишный файл #include "typedef.h". Если никак не лечится, тогда я для каждого автомата делаю void (*VECTORS)(); Вместо vectors свое уникальное имя.
0
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
26.04.2015, 14:26 | 27 |
Благодарю, поработаю вечером над этим.
0
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
27.05.2015, 15:04 | 28 |
Пока проверил размер кода на STM8.
Самый компактный - простой switch - case. второй по компактности - вызывание функции по указателю proc_func() и изменение указателя в зависимости от состояния КА. самый громоздкий - вызывание функции из массива указателей p_proc_func[state]() за счёт умножения индекса при получении указателя.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
27.05.2015, 19:13 | 29 |
Сообщение от SOVO
В случае большого кол-ва состояний выгоден способ по индексу состояния. Массив адресов функций, а не указателей. Лично меня полностью устраивает переход по индексу состояния. Программа собирается как конструктор. Каждый обработчик состояния можно проверить отдельно, потому что это самостоятельная функция.
0
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
27.05.2015, 21:49 | 30 |
Компилятор действительно сворачивает switch-case в компактную конструкцию с выделением каждой ветке своего адреса и переходами по условию. Тогда нет накладных условий на вызов функции.
0
|
0 / 0 / 0
Регистрация: 21.08.2014
Сообщений: 64
|
|
28.05.2015, 17:18 | 32 |
Мне понравилось!
А, не сочтите за наглость, можно примерчик коротенький для МК, а то люди им в основном искуственные языки разбирают. Спасибо.
0
|
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
|
|
28.05.2015, 18:25 | 33 |
Примерчик простого робота на МК постараюсь найти/выложить в понедельник, когда буду дома.
Но сначала нужно прочитать документацию, чтобы понять как это работает. Там правда больше 50 страниц, но стоит потратить пару часов на это. После чего можно распечатать себе шпаргалку.
0
|
Moki_Pys
|
|
14.07.2015, 02:09 | 34 |
Сообщение от orm999
|
14.07.2015, 02:09 | |
14.07.2015, 02:09 | |
Помогаю со студенческими работами здесь
34
Построение конечного автомата Построение конечного автомата... Создание конечного автомата Реализация конечного автомата Синтез конечного автомата синтез конечного автомата Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |