реклама на сайте
подробности

 
 
> State machine, Приведите примеры реализации
sat
сообщение Feb 2 2005, 12:29
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 6-07-04
Пользователь №: 265



Где можно почитать по теме/посмотреть примеры на С, асме
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Diz
сообщение Mar 6 2009, 13:20
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Наверное, jumptable может быть полезен для сохранения текущего состояния в eeprom и восстановления после сбоя. Пишем лишь индекс, а не потенциально
опасный указатель.
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 6 2009, 14:35
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(Diz @ Mar 6 2009, 16:20) *
Наверное, jumptable может быть полезен для сохранения текущего состояния в eeprom и восстановления после сбоя. Пишем лишь индекс, а не потенциально
опасный указатель.

сомнительно. все равно потом по указателю функция вызывается,
для таких случаев обычно пишут лог переходов в том или ином виде, ну и список разрешенных переходов (собственно, он у Гомеса есть).

реализовать кооперативную многозадачность с помощью конечных автоматов - собственно, этим я хотел закончить про реализации.
Go to the top of the page
 
+Quote Post
Diz
сообщение Mar 11 2009, 08:24
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Цитата(TMX @ Mar 6 2009, 17:35) *
сомнительно. все равно потом по указателю функция вызывается,
для таких случаев обычно пишут лог переходов в том или ином виде, ну и список разрешенных переходов (собственно, он у Гомеса есть).


Пример взят из реальной задачи - нужно было при каждой смене состояния сохранять
его во внешней eeprom, чтобы восстановить при пропадании питания. Лог переходов писать смысла нет, так как не важно, каким путем мы попали в данное состояние - важен сам факт попадания.
Индекс - один байт, пишется атомарно. При загрузке легко его проверить на попадание
в диапазон разрешенных состояний. Если будет восстановлено неверное состояние,
неприятно, но не так разрушительно как вызов функции по неверному указателю.
Еще одна особенность - прошивка могла быть обновлена, и обработчики
могли бы лежать на других адресах.
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 11 2009, 09:06
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(Diz @ Mar 11 2009, 11:24) *
Пример взят из реальной задачи - нужно было при каждой смене состояния сохранять
его во внешней eeprom, чтобы восстановить при пропадании питания. Лог переходов писать смысла нет, так как не важно, каким путем мы попали в данное состояние - важен сам факт попадания.
Индекс - один байт, пишется атомарно. При загрузке легко его проверить на попадание
в диапазон разрешенных состояний. Если будет восстановлено неверное состояние,
неприятно, но не так разрушительно как вызов функции по неверному указателю.
Еще одна особенность - прошивка могла быть обновлена, и обработчики
могли бы лежать на других адресах.


я не уверен в содержимом eeprom, если запись ведется в момент пропадания питания. В свое время тестировали - операция записи атомарна с точки зрения программирования. А так она занимает довольно большое время и содержимое слетает. К тому же eeprom может быть внешним.
Поэтому писали лог (из двух последовательных состояний) - запись на входе и на выходе. Тут даже проверка может быть очень простой - значения совпадают, значит состояние валидное. Не совпадают - брать предыдущую пару.

Цитата(Dog Pawlowa @ Mar 10 2009, 20:36) *
Да все тупо...

то есть, если надо убрать одну функцию из центра списка, придется перенумеровывать все последующие?

с событиями не совсем ясно:
насколько я понял, функции опроса событий возвращают 0, если события нет и номер события, если событие есть. Как происходит нумерация событий?
Получается, что события имеют приоритет, в порядке которого они опрашиваются. Из этого следует, что в любом состоянии приоритет событий одинаков. Более того, каждое состояние должно реагировать на все события.
А если, допустим, первое событие - кнопка нажата, а второе - таймер сработал. Тогда при нажатой кнопке даже в состоянии "ждать таймер" система не будет не него реагировать.
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 11 2009, 10:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(TMX @ Mar 11 2009, 12:06) *
то есть, если надо убрать одну функцию из центра списка, придется перенумеровывать все последующие?

Вовсе нет. Если это состояние не используется, есть два пути:
1) не делать ничего, разместив указатель на пустую функцию

#define stSelfTest 1 >> #define st1 1
#define f1 fSelfTest >> #define f1 fEmpty

2) или, если два байта в таблице вдруг понадобились, перенести сюда функцию, последнюю в списке.

Цитата(TMX @ Mar 11 2009, 12:06) *
с событиями не совсем ясно:
насколько я понял, функции опроса событий возвращают 0, если события нет и номер события, если событие есть. Как происходит нумерация событий?
Получается, что события имеют приоритет, в порядке которого они опрашиваются. Из этого следует, что в любом состоянии приоритет событий одинаков. Более того, каждое состояние должно реагировать на все события.
А если, допустим, первое событие - кнопка нажата, а второе - таймер сработал. Тогда при нажатой кнопке даже в состоянии "ждать таймер" система не будет не него реагировать.

Разумеется, тут есть ограничения, которые закладываются на уровне проектирования системы. Они всегда есть, реализовывать, например, подавление дребезга с помощью такого автомата бессмысленно. Точнее, можно, но в отдельном автомате, и события для отдельного автомата должны быть другие. Я обычно предусматриваю отдельно до написания автомата все входящие события с запасом по ресурсам, все, требующее быстрой реакции, выносится в background (прерывания и общий цикл).

Состояние не должно реагировать на все события, тут Вы не правы.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 11 2009, 13:22
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(Dog Pawlowa @ Mar 11 2009, 13:12) *
Состояние не должно реагировать на все события, тут Вы не правы.

Возможно, я не совсем понял про функции опроса событий. Если они работают как написано ниже, то я был не прав:
Все события обрабатываются однократно - функция опроса возвращает номер каждого события один раз.
По окончании обработки переменная сбрасывается в ноль.
При следующем опросе функция возвращает ноль - т.к. событие уже было отослано.

Фактически, это модель с монитором однократных событий. Сложно сказать, какие преимущества и недостатки у моделей.
А вот насчет вашей реализации - похоже на реализацию Gomez, но event driven, и те же недостатки.

Простой switch по состояниями имеет меньше источников ошибок, поскольку там нет нумерации и перечисление событий только в одном месте.

Цитата(_Pasha @ Mar 11 2009, 14:40) *
Здесь и далее - плюспицот за каждое слово smile.gif К тому же, состояний, критичных к пропаданию питания, не должно быть много.

В приличных девайсах надо закладывать раннюю диагностику пропадания питания. sad.gif


А "много" это сколько? "Плюспицот" - это много? Тестировали атомарность записи в eeprom? А если да, то как?

Я имею дело со всякими девайсами и разными процессорами. В различных средах разработки, кстати. Поэтому молиться на IAR как-то не тянет.
Например, были готовые серийные девайсы с внешней EEPROM на программном SPI. Именно с проблемой восстановления.
Я - за рациональные решения. Объясните, пожалуйста, зачем нужна ранняя диагностика питания и как она сказывается на приличности? Если результата можно добиться программными средствами - это красиво и целесообразно.
Уточняю - это не для всех случаев. Я не против диагностики, я даже за резевный ионистор в НЕОБХОДИМЫХ случаях. А вопросы о приличности оставляю на рассмотрение депутатов.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 11 2009, 13:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(TMX @ Mar 11 2009, 17:22) *
А вот насчет вашей реализации - похоже на реализацию Gomez, но event driven, и те же недостатки.

Мне важно иметь механизм, а с недостатками можно смириться. Для сведения - в устройстве более 100 состояний.

Цитата(TMX @ Mar 11 2009, 17:22) *
Простой switch по состояниями имеет меньше источников ошибок, поскольку там нет нумерации и перечисление событий только в одном месте.

Когда "одно место" растягивается на много страниц, меня лично это раздражает, и я делаю больше ошибок.
А со списком я вижу на три строчки, в которых перечислено название состояния (с суффиксами номера и функции) и текст, который выводится в терминал (или на дисплей) для его идентификации.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 12 2009, 12:14
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(Dog Pawlowa @ Mar 11 2009, 16:46) *
Мне важно иметь механизм, а с недостатками можно смириться. Для сведения - в устройстве более 100 состояний.

Странно люди относятся к инструментам, которыми пользуются.
К примеру, просто машину (не состояний) они тщательно выбирают, взвешивают все за и против, смотрят на внешний вид и удобство посадки. Тратят на это немало времени, читают журналы, просматривают интернет. Пожалуй, стоит взять на вооружение фразу "мне важно иметь механизм, а с недостатками можно смириться, для сведения - я проезжаю 100 км за раз" a14.gif
В то же время, с помощью методов и средств программирования мы зарабатываем деньги, в том числе, на автомобили. Почему бы не потратить время на поиск удачных решений?

По поводу списка:
в случае switch все состояния тоже переименовываются с помощью enum. Так что, вот и список (1 шт.).
Кстати, для основных автоматов я использую не switch, а возврат функцией состояния указателя на следующую функцию состояния. Там тоже список прототипов функций (1 шт.).

В одном из устройств у меня в фоновом процессе крутилось параллельно около 10 взаимосвязанных автоматов от 10 до 60 состояний в каждом. Плюс протокол обмена - порядка 100 состояний.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sat   State machine   Feb 2 2005, 12:29
- - bialix   Сайты: http://is.ifmo.ru http://softcraft.ru - раз...   Feb 2 2005, 12:41
- - -Tумблер-   Цитата(sat @ Feb 2 2005, 15:29)...посмотреть ...   Feb 3 2005, 12:02
- - ALys   1. IAR VisualSTATE - в пакете примеры (под разные ...   Feb 3 2005, 15:52
|- - ig_z   Цитата(ALys @ Feb 3 2005, 18:52)2. TS Control...   Feb 4 2005, 12:44
|- - sat   Что то не ставится на ХР. Или это аддон к чему - ...   Feb 7 2005, 11:50
||- - maegg   Может коротенько объясните, зачем это нужно и в ка...   Feb 7 2005, 13:17
||- - vet   Цитата(maegg @ Feb 7 2005, 16:17)Может короте...   Feb 7 2005, 19:54
|- - ALys   Что то не ставится на ХР. Или это аддон к чему - ...   Feb 8 2005, 13:07
- - basileus   SWITCH MACRO local MYP CLR ZH ADZ (MYP>>1)...   Feb 17 2005, 12:50
- - Tran   Уважаемые, подскажите, пожалуйста, среды разработк...   Sep 9 2005, 09:30
- - BVU   Можно почитать теорию графов, там заложен базовый ...   Sep 9 2005, 11:20
- - Sergu   Вот хорошие объяснения с примерами есть: State-O...   Sep 12 2005, 03:27
|- - TMX   Код/**********************************************...   Sep 12 2005, 10:29
|- - Tran   Этот код Вы наверняка писали руками. А есть ли про...   Sep 12 2005, 11:14
|- - TMX   Цитата(Tran @ Sep 12 2005, 14:14)Этот код Вы ...   Sep 15 2005, 16:34
- - lolikandr   Если интересует интересный инструмент, то посмотри...   Sep 13 2005, 09:35
- - Владимир_2010   Применение теории конечных автоматов к программиро...   Mar 4 2009, 12:54
|- - TMX   Цитата(Владимир_2010 @ Mar 4 2009, 16:54)...   Mar 4 2009, 17:31
- - Diz   Рекомендую ознакомиться с реализацией иерархически...   Mar 4 2009, 17:33
|- - _Pasha   Цитата(Diz @ Mar 4 2009, 20:33) Рекоменду...   Mar 4 2009, 18:20
|- - Alex B._   Цитата(_Pasha @ Mar 4 2009, 21:20) УПС. Т...   Mar 4 2009, 21:41
- - Владимир_2010   Diz спасибо за ссылку на книги. В сети также есть ...   Mar 5 2009, 06:54
|- - TMX   Цитата(Владимир_2010 @ Mar 5 2009, 10:54)...   Mar 5 2009, 14:29
|- - TMX   Цитата(Владимир_2010 @ Mar 5 2009, 10:54)...   Mar 5 2009, 15:17
|- - _Pasha   Цитата(TMX @ Mar 5 2009, 18:17) недостатк...   Mar 5 2009, 15:38
|- - TMX   Цитата(_Pasha @ Mar 5 2009, 18:38) Позвол...   Mar 5 2009, 17:09
|- - Diz   Цитата(TMX @ Mar 5 2009, 20:09) не слышал...   Mar 5 2009, 17:31
|- - _Pasha   Цитата(TMX @ Mar 5 2009, 20:09) там Marti...   Mar 5 2009, 17:50
|- - TMX   Цитата(_Pasha @ Mar 5 2009, 20:50) no com...   Mar 6 2009, 07:35
|- - _Pasha   Цитата(TMX @ Mar 6 2009, 10:35) если еще ...   Mar 6 2009, 13:42
|- - TMX   Недостатки прямого присваивания значения переменно...   Mar 10 2009, 13:42
- - _Pasha   А что-нибудь есть в ту же тему, но с текстовым вво...   Mar 5 2009, 14:35
- - Diz   Что касается визуализации, то я имел в виду следую...   Mar 5 2009, 16:55
|- - Dog Pawlowa   Цитата(TMX @ Mar 6 2009, 18:35) сомнитель...   Mar 10 2009, 16:14
||- - TMX   Цитата(Dog Pawlowa @ Mar 10 2009, 19:14) ...   Mar 10 2009, 16:57
||- - Dog Pawlowa   Цитата(TMX @ Mar 10 2009, 20:57) с первым...   Mar 10 2009, 17:36
|- - _Pasha   Цитата(TMX @ Mar 11 2009, 17:22) Тестиров...   Mar 11 2009, 13:45
|- - Dog Pawlowa   Цитата(TMX @ Mar 12 2009, 15:14) К пример...   Mar 13 2009, 09:21
|- - TMX   Цитата(Dog Pawlowa @ Mar 13 2009, 12:21) ...   Mar 13 2009, 10:07
|- - Dog Pawlowa   Цитата(TMX @ Mar 13 2009, 14:07) Просто м...   Mar 13 2009, 14:59
|- - _Pasha   Цитата(Dog Pawlowa @ Mar 13 2009, 17:59) ...   Mar 13 2009, 15:21
|- - TMX   Цитата(Dog Pawlowa @ Mar 13 2009, 17:59) ...   Mar 13 2009, 16:08
|- - _Pasha   Цитата(TMX @ Mar 13 2009, 19:08) Если авт...   Mar 13 2009, 16:23
|- - TMX   это я показал round-robin с постоянным приоритетом...   Mar 13 2009, 16:55
|- - _Pasha   Цитата(TMX @ Mar 13 2009, 20:55) Вопрос в...   Mar 13 2009, 17:14
- - -=TRO=-   Внутри программируемой логики собирают микропроцес...   Mar 10 2009, 16:47
- - _Pasha   Весь смех в том, что сишная или иная ЯВУ-программа...   Mar 10 2009, 18:17
- - Rst7   Цитатапри помощи переменной state эмулирует счетчи...   Mar 10 2009, 19:15
|- - ReAl   Цитата(Rst7 @ Mar 10 2009, 21:15) Я давно...   Mar 10 2009, 19:51
|- - Dog Pawlowa   Цитата(ReAl @ Mar 10 2009, 22:51) Тада, и...   Mar 11 2009, 07:18
|- - ReAl   Цитата(Dog Pawlowa @ Mar 11 2009, 09:18) ...   Mar 13 2009, 21:30
- - _Pasha   Цитата(Diz @ Mar 11 2009, 11:24) Индекс -...   Mar 11 2009, 11:40
- - Diz   Интересно, а как сделать с набором параллельно раб...   Mar 14 2009, 09:13
|- - Dog Pawlowa   Цитата(Diz @ Mar 14 2009, 13:13) Интересн...   Mar 14 2009, 13:07
|- - singlskv   Цитата(Diz @ Mar 14 2009, 12:13) Интересн...   Mar 14 2009, 22:23
||- - Diz   Цитата(singlskv @ Mar 15 2009, 01:23) Раз...   Mar 15 2009, 09:26
||- - _Pasha   Цитата(Diz @ Mar 15 2009, 13:26) Вообщем,...   Mar 16 2009, 06:17
||- - singlskv   Цитата(Diz @ Mar 15 2009, 12:26) Вообщем,...   Mar 19 2009, 20:12
|- - defunct   Цитата(Diz @ Mar 14 2009, 11:13) Интересн...   Mar 22 2009, 04:53
|- - Dog Pawlowa   Цитата(defunct @ Mar 22 2009, 07:53) Раск...   Mar 23 2009, 09:57
|- - _Pasha   Цитата(Dog Pawlowa @ Mar 23 2009, 13:57) ...   Mar 23 2009, 11:23
|- - Dog Pawlowa   Не нашел, чтобы эта ссылка была упомянута в теме. ...   Mar 24 2009, 11:52
- - Diz   Еще один интересный вариант реализации машины сост...   Mar 17 2009, 20:14
- - Diz   Цитата(singlskv @ Mar 19 2009, 23:12) Как...   Mar 19 2009, 21:32
- - Dog Pawlowa   Цитата(Diz @ Mar 20 2009, 00:32) Ну, это ...   Mar 20 2009, 09:05
- - singlskv   Цитата(Dog Pawlowa @ Mar 20 2009, 12:05) ...   Mar 20 2009, 20:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 15:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01552 секунд с 7
ELECTRONIX ©2004-2016