Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/200: Рейтинг темы: голосов - 200, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
1

Шаблон конечного автомата. Си

18.04.2015, 22:11. Показов 38239. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задавался ли кто подобной темой. Поделитесь примерами, наработками.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2015, 22:11
Ответы с готовыми решениями:

Быстродействие конечного автомата в QUARTUS||
Здравствуйте. Не могу найти место, где пишутся цифры быстродействия. Есть подозрения,что где то в...

Xilinx ISE 14.1. Реализация конечного автомата генератора последовательностей
Всем привет. Стоит задача построения конечного автомата (КА) - генератора последовательности....

Построение конечного автомата
Не знаю туда ли я обратился? ну кто может помочь мне в "Построение конечного автомата-...

Минимизация конечного автомата
Помогите пожалуйста найти ошибки в программе!...

33
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
21.04.2015, 11:05 21
Author24 — интернет-сервис помощи студентам
Я об этом писал неоднократно. Называю эту фишку самоинициализацией. Компилятор в начале программы встраивает блок очистки озу и инициализацию переменных. Это позволяет нулевое состояние КА сделать состоянием самоинициализации модуля или всего устройства. Кстати, если в модулях применяются флаги, также можно сделать модуль с самоинициализацией. Сброшен флаг, инициализируем все что требуется и взводим флаг. При следующем вызове функции проверяем флаг, если взведен, выполняем код.
По поводу 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;
за счёт дополнительной строчки NUMBERS_MAIN_STATES, которая оканчивается без запятой.

А второй макрос не компилируется:
Код
void (*const main_states_func[NUMBERS_MAIN_STATES]) (void)  =
{
#define STATE(name, func) func,
#include "main_states.h"
#undef STATE
};
именно из-за последней запятой после аргумента func,
Если вручную вставляю названия состояний и имена функций, то всё в порядке.

И второе. Мне очень не нравится смешивать 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
*.h
Код
//========================================================================
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];
//------------------------------------------------------------------------
*.c
Код
#include "typedef.h" // !!!!!!!!!!!!!!!!!!!!!!!

//========================================================================
__flash VECTORS proc_eds_func [PROC_EDS_MAIN_STATES] =
{
#define STATE(name, func) func,
#include "_proc_eds_main.h"
#undef STATE
};
//------------------------------------------------------------------------
_proc_eds_main.h
Код
//************************************************************************
//************************ Главный автомат *******************************
//************************************************************************

//========================================================================
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
...
Switch-case компактен, пока кол-во состояний немного. Я слышал, компилятор в случае большого кол-ва состояний, делает переход по индексу.

В случае большого кол-ва состояний выгоден способ по индексу состояния.

Массив адресов функций, а не указателей.

Лично меня полностью устраивает переход по индексу состояния. Программа собирается как конструктор. Каждый обработчик состояния можно проверить отдельно, потому что это самостоятельная функция.
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
27.05.2015, 21:49 30
Компилятор действительно сворачивает switch-case в компактную конструкцию с выделением каждой ветке своего адреса и переходами по условию. Тогда нет накладных условий на вызов функции.
0
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
28.05.2015, 13:12 31
Может кому поможет - лично я конечные автоматы пишу с помощью отличной программы Ragel, который на выходе дает правильный и компактный С код.
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
Примерчик простого робота на МК постараюсь найти/выложить в понедельник, когда буду дома.

Но сначала нужно прочитать документацию, чтобы понять как это работает. Там правда больше 50 страниц, но стоит потратить пару часов на это. После чего можно распечатать себе шпаргалку.
Уже *цать понедельников прошло, а примерчика так и не видать...
14.07.2015, 02:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2015, 02:09
Помогаю со студенческими работами здесь

Построение конечного автомата
Помогите пожалуйста-Построить конечный автомат, допускающий все цепочки в алфавите {a,b}, не...

Построение конечного автомата...
Задали лабу, но ничего не обьяснили. Что тут нужно вообще делать, пожалуйста, подскажите...

Создание конечного автомата
проблема в двух переменных: open, close. Они всегда равны нулю. В чем может быть проблема?

Реализация конечного автомата
Написать программу на Прологе реализующую конечный автомат, который распознает слова, имеющие...

Синтез конечного автомата
Предположим что у меня имеется таблица функции перехода и выходного сигнала. Каждому внутреннему...

синтез конечного автомата
Автомат для продажи билетов работает при получении монет достоинством 5 и 10 коп. В первом случае...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru