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

 
 
> 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
Ответов
Владимир_2010
сообщение Mar 5 2009, 06:54
Сообщение #2


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

Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087



Diz спасибо за ссылку на книги. В сети также есть «Samek Miro, Practical UML Statecharts in C/C++. 2008».
Diz писал:
Цитата
Другое дело – визуализация уже написанного на низком уровне конечного автомата

Нельзя ли в этом месте поподробней?! Задачи по дискретным системам автоматики я решал в основном по методе/идее изложено в книге «Юдицкий С.А. Проектирование дискретных систем автоматики. 1980». На русском искал, но больше ничего не встречал по этой теме. Встречались книги просто про конечные автоматы, без приложений к автоматике. Но там одна математика.
Вот как я решал задачки по автоматике: по методе вначале рисовал конечный автомат (графы с переходами) в пакете Stateflow от Matlab, затем проверял логику работы автомата моделируя различные состояния, далее записывал граф в виде уравнений/формул (вручную на бумажке), оптимизировал (вручную на бумажке) если требовалось конечный автомат с применением методов дискретной математики. Потом формулы рисовал в виде релейно-контакторной схемы (или функционально-логической схемы – триггеры, или, и, не), писал программу на Step7 (софт для программирования логических контроллеров Siemens) или на CX-Programmer (софт плк Omron) и прогонял логику работы с использованием симулятора для этих контроллеров.
Применяя эту методу к нескольким различным задачам, убедил себя (возможно зря) что самое главное для любой задачи по автоматике на плк это нарисовать правильно конечный автомат (графы с переходами) и проверить его работу средствами моделирования – все остальное дело техники, рутинный труд, все можно делать по одному шаблону/правилам, выключив мозг, нужно только время. Хотел даже весь этот процесс автоматизировать и написать автоматический генератор из графов всех этих формул и схем. Но потом подумал, что не надо горячиться: наверняка все это давным-давно уже сделано кем-то. Теперь вот вижу что на языке Си IAR реализует этот подход в VisualState, Telelogiс, великий ученый Шалыто А. А. и его друзья.
Вопросы:
1) Какие инструменты для моделирования/визуализации абстрактного конечного автомата есть кроме VisualState, Stateflow? Кто чем пользуется, опишите пожалуйста и поделитесь впечатлениями.
2) Какие инструменты для визуализация/моделирования/отладки уже написанного на языке С алгоритма есть?! Если применительно к мк AVR: в Proteus если загнать hex файл – не видно кода на Си и видны только входы/выходы с мк, при отладке в AVRStudio – код на Си виден, но не наглядно – нет временных диаграмм. И еще: может есть другие инструменты, без приложениям к мк?!
3) Есть ли что-нибудь из книг наподобие Miro Samek на русском для Cи?!

TMX писал
Цитата
Про реализацию напишу позже

Ждем, интересны детали – уверен, что каждый по-разному генерирует код из графов.

Diz писал
Цитата
Если интересно, могу рассказать и про вариант с иерархией

Интересно все и с иерархией и без. Если это возможно – то с простыми примерами, постановка задачи, с графом на 3-4 состояния, с кодом и с комментариями, желательно на Си для микроконтроллеров. Все в форум не войдет – может быть в rar(е) куда-нибудь выложите.
Спасибо.

Сообщение отредактировал Владимир_2010 - Mar 5 2009, 07:17
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 5 2009, 15:17
Сообщение #3


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

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



Цитата(Владимир_2010 @ Mar 5 2009, 10:54) *
Интересно все и с иерархией и без. Если это возможно – то с простыми примерами, постановка задачи, с графом на 3-4 состояния, с кодом и с комментариями, желательно на Си для микроконтроллеров. Все в форум не войдет – может быть в rar(е) куда-нибудь выложите.
Спасибо.


C для микроконтроллеров не бывает. Потому-то он так популярен, что где алгоритм не запусти, если стандарту соответствует, то работать будет.

К сожалению, на русском языке можно почитать Шалыто и Парондажанова. На английском есть пяток книг, но там самые азы - только Самек предлагает интересную реализацию.

Если нужно протокол сваять, то можно взять реализацию COCO/R для С и написать в L1 грамматике правила обработки, там генерится автомат, работает очень быстро. Правила обработки распознанных пакетов тоже удобно описывать автоматом, но на другом уровне.

Продолжаю про автоматы - светофор как я думаю, вы и сами создать сможете, достаточно будет одного состояния.
Простейшая реализация:
состояния автомата нумеруются.
пишется функция, в которой выбирается текущее состояние, в этом состоянии опрашиваются условия перехода в другое состояние.
функция периодически вызывается.
Код
enum (RED, GREEN, YELLOW);

static char automaton_state = RED;

void super_auto(void)
{
  switch (automaton_state)
  {
    case RED:
      if (timer_flag)
      {
        output_control(RED_LAMP, OFF);
        output_control(GREEN_LAMP, ON);
        start_timer (GREEN_DELAY);
        automaton_state = GREEN;
      }
      break;
    case YELLOW:
...
...
  }
}


преимущества: просто и понятно, минимальное использование стека, что для процессоров HOLTEK, например, весьма важно.
недостатки: если состояний много, то они могут перебираться долго. На самом деле здесь помог бы переход по изменяемой метке, типа GOTO STATE, но в С такого нет.

есть несколько модернизированных реализаций такого типа.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 15:38
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(TMX @ Mar 5 2009, 18:17) *
недостатки: если состояний много, то они могут перебираться долго. На самом деле здесь помог бы переход по изменяемой метке, типа GOTO STATE, но в С такого нет.
есть несколько модернизированных реализаций такого типа.

Позволю себе немного поправить Вас:

С недавних пор реализация оператора switch() отдана на откуп оптимизатору, т.е если структура приводится к таблице переходов - никакого перебора не будет. За таким подходом - будущее. В принципе, компиляторы смогут даже патчить входные значения, например


Код
switch(state)

{

case 1:

case 2:

case 14:

case 15:

}


Что мешает  в "рваных" вариантах и вычислять адрес в таблице перехода по какому-нибудь вспомогательному алгоритму?


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


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

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



Цитата(_Pasha @ Mar 5 2009, 18:38) *
Позволю себе немного поправить Вас:

С недавних пор реализация оператора switch() отдана на откуп оптимизатору, т.е если структура приводится к таблице переходов - никакого перебора не будет. За таким подходом - будущее. В принципе, компиляторы смогут даже патчить входные значения, например


Встречал такое в аппнотах для PIC.
Но это не бесплатно: таблица переходов тоже место занимает, кроме того, если вычисляемое значение, то компилятор может пустыми операциями забивать место.
Реально проблема встает в дешевых контроллерах, где мало памяти, стека, скорости и т.п. или при реализации автомата в обработчике прерываний.

Чтобы не полагаться на компилятор используются модернизированные методы:

выше упоминалась ссылка http://www.embedded.com/2000/0012/0012feat1.htm
там Martin Gomez вручную забивает таблицу переходов: http://i.cmpnet.com/embedded/gifs/2000/001...t1_listing1.gif
Недостатки: во-первых, надо записывать в трех местах и легко ошибиться.
Во-вторых, вообще не понятно, зачем такая громоздкая реализация: состояние храниться в виде номера, функции и указателя на функцию. по номеру выбирается ссылка на функцию состояний и вызывается сама функция. Реализация требует и память и стек.
Гораздо проще хранить состояние в виде ссылки на функцию. Память не используется, стек используется. Ошибиться при переходе сложнее.

Цитата(Diz @ Mar 5 2009, 19:55) *
Что касается визуализации, то я имел в виду следующее. Автомат описывается на С.
Перед компляцией запускается утилита, которая парсит C-файл, находит все, относящееся к автомату - состояния, события, переходы, иерархию - после чего рисует красивый statechart. Который можно окинуть взглядом и убедиться, что все в порядке.
Вот, для примера Pelican (светофор) от Самека:
[attachment=30421:pelican.pdf]

не слышал о таком, есть программа, которая flowchart генерирует.
Писать программу без картинки - если получается, тогда зачем картинка?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 17:50
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(TMX @ Mar 5 2009, 20:09) *
там Martin Gomez вручную забивает таблицу переходов


no comment smile.gif


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


Писать программу без картинки - если получается, тогда зачем картинка?


1. А что? Дорого? Зато может способствовать уменьшению количества функций

2.Например, для повышения уровня языка реализации до проблемно-ориентированного  http://www.citforum.ru/internet/xml/graphml/
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 6 2009, 07:35
Сообщение #7


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

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



Цитата(_Pasha @ Mar 5 2009, 20:50) *
no comment smile.gif


Возможно, я не совсем понятно выразился - Gomez забивает не всю таблицу переходов автомата, а только одномерный массив jump table, указателей на функции состояний. Там в самом начале листинга можно ее увидеть.
В любом случае это не дает преимуществ по сравнению с прямым присвоением:
Код
void(*state_pointer)(void) = RED_state;
void main (void)
{
  while(1)
  {
    state_pointer();
  }
}

void RED_state (void)
{
      if (timer_flag)
      {
        output_control(RED_LAMP, OFF);
        output_control(GREEN_LAMP, ON);
        start_timer (GREEN_DELAY);
        state_pointer = GREEN_state;
        return;
      }
              if (button_flag)
......................
}


Преимущества: работает быстро, фактически как вычисляемое GOTO
Недостатки: требует стек для вызова функций, при реализации в прерываниях вызова по ссылке компилятор обычно сохраняет весь контекст, это долго и требует много стека.

По поводу объема: в 8-битных процессорах если указатель занимает 2 байта, то каждое присвоение требует 2 команды ассемблера. Соответственно для автомата на 50 состояний и 150 переходов потребуется 300 команд в ПЗУ (600Б для AVR), для switch с переменной состояния типа char потребуется 300Б ПЗУ на переходы, для Gomez-технологии потребуется 300Б на переходы и 100Б на jump_table, итого 400Б. Для 16-ти и 32-х битных объем switch и присвоения указателей практически одинаков, а для Gomeza все равно дополнительно требуется место для jump table.
Цитата
1. А что? Дорого? Зато может способствовать уменьшению количества функций
2.Например, для повышения уровня языка реализации до проблемно-ориентированного http://www.citforum.ru/internet/xml/graphml/


1. За счет чего? C использованием switch вообще одна функция.
2.Обычно проблему снаала описывают, а потом реализуют.

если еще есть интерес, могу продолжить про реализации...
Go to the top of the page
 
+Quote Post
TMX
сообщение Mar 10 2009, 13:42
Сообщение #8


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

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



Недостатки прямого присваивания значения переменной состояния, типа
Код
state = NEW_state
в том, что при большом количестве ветвлений можно случайно пропустить присваивание.
Одним из методов контроля на этапе компиляции является следующий:
функция состояния возвращает значение следующего состояния
Код
void main (void)
{
static char state = STATE_X;
  while(1)
  {
    state = state_function(state);
  }
}

char state_function (char state)
{
  switch(state)
  {
      case STATE_X:
        if (event)
        {
          return STATE_Y;
        }
        else
          return STATE_X;
      case STATE_Y:
        ...
      case STATE_Z:
        ...
  }
}


кроме некоторого контроля за присваиванием, такой подход не дает никаких премуществ.
Просто на практике не всегда бывает возможно обеспечить полноту тестов.
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
|- - TMX   Цитата(Владимир_2010 @ Mar 5 2009, 10:54)...   Mar 5 2009, 14:29
|- - Diz   Цитата(TMX @ Mar 5 2009, 20:09) не слышал...   Mar 5 2009, 17:31
|- - _Pasha   Цитата(TMX @ Mar 6 2009, 10:35) если еще ...   Mar 6 2009, 13:42
- - _Pasha   А что-нибудь есть в ту же тему, но с текстовым вво...   Mar 5 2009, 14:35
- - Diz   Что касается визуализации, то я имел в виду следую...   Mar 5 2009, 16:55
- - Diz   Наверное, jumptable может быть полезен для сохране...   Mar 6 2009, 13:20
|- - TMX   Цитата(Diz @ Mar 6 2009, 16:20) Наверное,...   Mar 6 2009, 14:35
|- - 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
|- - Diz   Цитата(TMX @ Mar 6 2009, 17:35) сомнитель...   Mar 11 2009, 08:24
|- - TMX   Цитата(Diz @ Mar 11 2009, 11:24) Пример в...   Mar 11 2009, 09:06
|- - Dog Pawlowa   Цитата(TMX @ Mar 11 2009, 12:06) то есть,...   Mar 11 2009, 10:12
|- - TMX   Цитата(Dog Pawlowa @ Mar 11 2009, 13:12) ...   Mar 11 2009, 13:22
|- - _Pasha   Цитата(TMX @ Mar 11 2009, 17:22) Тестиров...   Mar 11 2009, 13:45
|- - Dog Pawlowa   Цитата(TMX @ Mar 11 2009, 17:22) А вот на...   Mar 11 2009, 13:46
|- - TMX   Цитата(Dog Pawlowa @ Mar 11 2009, 16:46) ...   Mar 12 2009, 12:14
|- - 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 Текстовая версия Сейчас: 24th June 2025 - 06:41
Рейтинг@Mail.ru


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