|
State machine, Приведите примеры реализации |
|
|
|
Feb 2 2005, 12:29
|
Группа: Новичок
Сообщений: 10
Регистрация: 6-07-04
Пользователь №: 265

|
Где можно почитать по теме/посмотреть примеры на С, асме
|
|
|
|
|
 |
Ответов
|
Mar 6 2009, 14:35
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(Diz @ Mar 6 2009, 16:20)  Наверное, jumptable может быть полезен для сохранения текущего состояния в eeprom и восстановления после сбоя. Пишем лишь индекс, а не потенциально опасный указатель. сомнительно. все равно потом по указателю функция вызывается, для таких случаев обычно пишут лог переходов в том или ином виде, ну и список разрешенных переходов (собственно, он у Гомеса есть). реализовать кооперативную многозадачность с помощью конечных автоматов - собственно, этим я хотел закончить про реализации.
|
|
|
|
|
Mar 11 2009, 08:24
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250

|
Цитата(TMX @ Mar 6 2009, 17:35)  сомнительно. все равно потом по указателю функция вызывается, для таких случаев обычно пишут лог переходов в том или ином виде, ну и список разрешенных переходов (собственно, он у Гомеса есть). Пример взят из реальной задачи - нужно было при каждой смене состояния сохранять его во внешней eeprom, чтобы восстановить при пропадании питания. Лог переходов писать смысла нет, так как не важно, каким путем мы попали в данное состояние - важен сам факт попадания. Индекс - один байт, пишется атомарно. При загрузке легко его проверить на попадание в диапазон разрешенных состояний. Если будет восстановлено неверное состояние, неприятно, но не так разрушительно как вызов функции по неверному указателю. Еще одна особенность - прошивка могла быть обновлена, и обработчики могли бы лежать на других адресах.
|
|
|
|
|
Mar 11 2009, 09:06
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(Diz @ Mar 11 2009, 11:24)  Пример взят из реальной задачи - нужно было при каждой смене состояния сохранять его во внешней eeprom, чтобы восстановить при пропадании питания. Лог переходов писать смысла нет, так как не важно, каким путем мы попали в данное состояние - важен сам факт попадания. Индекс - один байт, пишется атомарно. При загрузке легко его проверить на попадание в диапазон разрешенных состояний. Если будет восстановлено неверное состояние, неприятно, но не так разрушительно как вызов функции по неверному указателю. Еще одна особенность - прошивка могла быть обновлена, и обработчики могли бы лежать на других адресах. я не уверен в содержимом eeprom, если запись ведется в момент пропадания питания. В свое время тестировали - операция записи атомарна с точки зрения программирования. А так она занимает довольно большое время и содержимое слетает. К тому же eeprom может быть внешним. Поэтому писали лог (из двух последовательных состояний) - запись на входе и на выходе. Тут даже проверка может быть очень простой - значения совпадают, значит состояние валидное. Не совпадают - брать предыдущую пару. Цитата(Dog Pawlowa @ Mar 10 2009, 20:36)  Да все тупо... то есть, если надо убрать одну функцию из центра списка, придется перенумеровывать все последующие? с событиями не совсем ясно: насколько я понял, функции опроса событий возвращают 0, если события нет и номер события, если событие есть. Как происходит нумерация событий? Получается, что события имеют приоритет, в порядке которого они опрашиваются. Из этого следует, что в любом состоянии приоритет событий одинаков. Более того, каждое состояние должно реагировать на все события. А если, допустим, первое событие - кнопка нажата, а второе - таймер сработал. Тогда при нажатой кнопке даже в состоянии "ждать таймер" система не будет не него реагировать.
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Mar 11 2009, 10:12
|
Гуру
     
Группа: Свой
Сообщений: 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 (прерывания и общий цикл). Состояние не должно реагировать на все события, тут Вы не правы.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Mar 11 2009, 13:22
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(Dog Pawlowa @ Mar 11 2009, 13:12)  Состояние не должно реагировать на все события, тут Вы не правы. Возможно, я не совсем понял про функции опроса событий. Если они работают как написано ниже, то я был не прав: Все события обрабатываются однократно - функция опроса возвращает номер каждого события один раз. По окончании обработки переменная сбрасывается в ноль. При следующем опросе функция возвращает ноль - т.к. событие уже было отослано. Фактически, это модель с монитором однократных событий. Сложно сказать, какие преимущества и недостатки у моделей. А вот насчет вашей реализации - похоже на реализацию Gomez, но event driven, и те же недостатки. Простой switch по состояниями имеет меньше источников ошибок, поскольку там нет нумерации и перечисление событий только в одном месте. Цитата(_Pasha @ Mar 11 2009, 14:40)  Здесь и далее - плюспицот за каждое слово  К тому же, состояний, критичных к пропаданию питания, не должно быть много. В приличных девайсах надо закладывать раннюю диагностику пропадания питания.  А "много" это сколько? "Плюспицот" - это много? Тестировали атомарность записи в eeprom? А если да, то как? Я имею дело со всякими девайсами и разными процессорами. В различных средах разработки, кстати. Поэтому молиться на IAR как-то не тянет. Например, были готовые серийные девайсы с внешней EEPROM на программном SPI. Именно с проблемой восстановления. Я - за рациональные решения. Объясните, пожалуйста, зачем нужна ранняя диагностика питания и как она сказывается на приличности? Если результата можно добиться программными средствами - это красиво и целесообразно. Уточняю - это не для всех случаев. Я не против диагностики, я даже за резевный ионистор в НЕОБХОДИМЫХ случаях. А вопросы о приличности оставляю на рассмотрение депутатов.
|
|
|
|
|
Mar 11 2009, 13:46
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(TMX @ Mar 11 2009, 17:22)  А вот насчет вашей реализации - похоже на реализацию Gomez, но event driven, и те же недостатки. Мне важно иметь механизм, а с недостатками можно смириться. Для сведения - в устройстве более 100 состояний. Цитата(TMX @ Mar 11 2009, 17:22)  Простой switch по состояниями имеет меньше источников ошибок, поскольку там нет нумерации и перечисление событий только в одном месте. Когда "одно место" растягивается на много страниц, меня лично это раздражает, и я делаю больше ошибок. А со списком я вижу на три строчки, в которых перечислено название состояния (с суффиксами номера и функции) и текст, который выводится в терминал (или на дисплей) для его идентификации.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Mar 12 2009, 12:14
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(Dog Pawlowa @ Mar 11 2009, 16:46)  Мне важно иметь механизм, а с недостатками можно смириться. Для сведения - в устройстве более 100 состояний. Странно люди относятся к инструментам, которыми пользуются. К примеру, просто машину (не состояний) они тщательно выбирают, взвешивают все за и против, смотрят на внешний вид и удобство посадки. Тратят на это немало времени, читают журналы, просматривают интернет. Пожалуй, стоит взять на вооружение фразу "мне важно иметь механизм, а с недостатками можно смириться, для сведения - я проезжаю 100 км за раз" В то же время, с помощью методов и средств программирования мы зарабатываем деньги, в том числе, на автомобили. Почему бы не потратить время на поиск удачных решений? По поводу списка: в случае switch все состояния тоже переименовываются с помощью enum. Так что, вот и список (1 шт.). Кстати, для основных автоматов я использую не switch, а возврат функцией состояния указателя на следующую функцию состояния. Там тоже список прототипов функций (1 шт.). В одном из устройств у меня в фоновом процессе крутилось параллельно около 10 взаимосвязанных автоматов от 10 до 60 состояний в каждом. Плюс протокол обмена - порядка 100 состояний.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|