|
Автоматный подход (SWITCH), Поделитесь опытом использования |
|
|
|
Jul 2 2006, 17:17
|
Участник

Группа: Участник
Сообщений: 37
Регистрация: 20-03-05
Пользователь №: 3 533

|
Решил в последнее время освоить более строгие-формальные методы проектирования программ для МК (да и для ПК). Делаю уже третий проект с помощью КА. правда, я использую некую смесь из того, что где-то прочитал и того, что сам придумываю по ходу. При этом всё выполняется на бумаге (проектирование КА), а далее ложится на код, по моим личным предпочтениям.
Результаты положительные, но тут хотелось бы спросить совета профессионалов, каким путём дальше идти, стоит ли использовать кодогенераторы и прочее ПО и т. д.
Интересно было бы узнать, насколько часто микроконтроллерщики используют автоматный подход к проектированию программ. Какое ПО при этом используется (Visual State etc.), каковы результаты (увеличение скорости разработки, надёжности, улучшение взаимопонимания в коллективе разарботчиков).
|
|
|
|
|
 |
Ответов
|
Jul 4 2006, 14:54
|

Частый гость
 
Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046

|
Хотел бы пару слов сказать в ответ исходному посту.
Вижуал Стейт пробовал-смотрел. Мне не понравилось. Хотя идея с виду красивая, но есть ряд ограничений, которые не переплюнешь никак. Поэтому в дальнейшем отказался.
Вижуал Стейт предлагает практически замкнутый процесс разработки -- от проектирования и симуляции, до отладки на прототипе или реальном железе. Их символ -- колесо, как отображение идеи замкнутого цикла разработки. Или итеративного цикла.
Сами по себе диаграммы состояний IVS (Iar Visual State) -- это часть стандарта UML, слегка модифицированные под нужды IVS (чего-то добавлено, даже кажется полезного). В итоге получаем проектирование жесткой системы. Наиболее вероятным кандидатом в качестве целевой платформы для генерируемой системы являются ПЛК. На это указывает многое. В частности, так любимый в ПЛК принцип "сначал читаем все входы - затем обновляем все выходы".
Генерируемая система хоть и представляет собой си-код, но на самом деле это табличный жесткозашитый автомат, т.е. руками сгенерированный код не отредактируешь даже при большом желании. Плохо это тем, что IVS нельзя использовать для кодогенерации отдельных разнообразных автоматов для нетипичных с точки зрения IVS задач. Так, например, IVS определяет понятие параллельных автоматов, но желание создать массив однотипных параллельных автоматов в количестве N штук не позволяет, т.е. необходимо как-то выкручиваться с copy-paste и не факт, что вам это удастся. По крайней мере для меня это стало одним из главных препятствий в использовании.
Сам редактор расчитан на большую и вдумчивую работу и несложные автоматы по своей сути. Нащелкивать мышкой сложный автомат -- дело весьма трудоемкое, особенно для тех, кто любит, чтобы было еще и красиво (это как с рисованием схем в OrCad -- как начнешь красоту наводить, так пару часов на это потратить нефиг делать).
В общем, несмотря на красивый фасад и уйму потенциальных возможностей, для областей не связанных с ПЛК использование IVS, особенно на мелких контроллерах (типа АВР) представляется мне неоправданным.
Сам по себе автоматный подход (оно же синхронное программирование -- в западных источниках) мне видится единственным способом писать логику работы. НО! не всего устройства в целом в виде одного огромного автомата, а в виде N количества паралелльных слабозависимых (в идеале независимых вообще) автоматов. А там или ОС применить для жонглирования этими автоматами или просто в один бесконечный цикл их засунуть -- это дело личных пристрастий каждого.
Поэтому с точки зрения делать всю программу на одном жестком конечном автомате или на ОС -- я не стал бы выбирать первое (только если это задача по написанию ПО для открыванию лотка CDROM или миганию лампочек). Для реальных задач лучше использовать россыпь небольших квазипараллельно работающих конечных автоматов.
Сам я ОС до сих пор не пользовался, ибо по сути тщательно спроектированная система в виде набора параллельных автоматов -- это практически тоже самое, что и кооперативная ОС, только памяти жрет еще меньше и ты всегда имеешь полный контроль над процессом. Т.е. каждый раз я делаю примитивную кооперативную карусель, и мне хватает. Из набора сервисов: таймеры, фифо, реже семафоры. Это позволяет обеспечивать максимальную независимость работы разных задач, плюс регулировать насколько часто та или иная задача будет выполнять свою работу. Т.е. deadlock в таком виде невозможен, система работает предсказуемо. Что еще нужно для счастья?
--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
|
|
|
|
|
Jul 7 2006, 06:45
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 1-09-05
Из: Рыбинск
Пользователь №: 8 130

|
Цитата(krdmitry @ Jul 3 2006, 00:34)  ...Есть еще вопрос с достаточно узкой "специализацией" КА-представления алгоритма. Например, ожидание таймера в одном из состояний приходится представлять как несколько состояний (инициализация, ожидание сигнала, останов таймера). Расписывание действий на выходах состояний тоже "отягощает" рисунок... Поэтому ИМХО нужно искать более "современные" и актуальные формы представления управляющих алгоритмов, похожие на КА, но обладающие расширенными возможностями. Есть ли такие? Соответственно, есть вопрос и по оформлению документанции на программу. Вроде, в нашем родном ГОСТе предусматриваются только алгоритмы ("схема программы")... Я использую автоматное программирование на AVR, сразу предупреждаю что программирую на ассемблере. Для реализации автоматной структуры написал несколько макросов и простеньких подпрограммок(которые вызываются макросами). Макросы звучат типа так: 1. СТАРТОВАТЬ_АВТОМАТ_СРАЗУ ИМЯ_АВТОМАТА, ИМЯ_СОСТОЯНИЯ 2. СТАРТОВАТЬ_АВТОМАТ_С_ЗАДЕРЖКОЙ ИМЯ_АВТОМАТА, ИМЯ_СОСТОЯНИЯ, ВЕЛИЧИНА_ЗАДЕРЖКИ 3. ОСТАНОВИТЬ_АВТОМАТ ИМЯ_АВТОМАТА 4. ВЫПОЛНИТЬ_АВТОМАТ ИМЯ_АВТОМАТА 5. ПЕРЕЙТИ_НА_ДРУГОЕ_СОСТОЯНИЕ_СРАЗУ ИМЯ_СОСТОЯНИЯ 6. ПЕРЕЙТИ_НА_ДРУГОЕ_СОСТОЯНИЕ_С_ЗАДЕРЖКОЙ ИМЯ_СОСТОЯНИЯ, ВЕЛИЧИНА_ЗАДЕРЖКИ 7. ОСТАНОВИТЬСЯ 8. ПОВТОРИТЬ_СОСТОЯНИЕ_С_ЗАДЕРЖКОЙ Макросами 1-4 пользуются в любом месте программы. Макросами 5-8 пользуются внутри состояния автомата. С помощью этих макросов реализуется в общем любая автоматная структура (любое количество атоматов, любое количество состояний, вложенные автоматы с любой глубиной вложенности). Даже такие вещи как автомат состоящий из одного состояния  Автоматы могут управлять друг другом. Все задержки отрабатываются каждым автоматом независимо с кратностью единого кванта времени. При этом нет холостых циклов. Документированием в графике стараюсь не заниматься - уходит много времени, к тому же при изменении структуры надо документацию менять. Вместо этого стараюсь максимально комментирвать текст самой программы. Но если все-таки рисую графы (не алгоритмы) то делаю это в Visio. Цитата(bialix @ Jul 4 2006, 18:54)  ...Сам по себе автоматный подход (оно же синхронное программирование -- в западных источниках) мне видится единственным способом писать логику работы. НО! не всего устройства в целом в виде одного огромного автомата, а в виде N количества паралелльных слабозависимых (в идеале независимых вообще) автоматов. А там или ОС применить для жонглирования этими автоматами или просто в один бесконечный цикл их засунуть -- это дело личных пристрастий каждого...
Сам я ОС до сих пор не пользовался, ибо по сути тщательно спроектированная система в виде набора параллельных автоматов -- это практически тоже самое, что и кооперативная ОС, только памяти жрет еще меньше и ты всегда имеешь полный контроль над процессом. Т.е. каждый раз я делаю примитивную кооперативную карусель, и мне хватает. Из набора сервисов: таймеры, фифо, реже семафоры. Это позволяет обеспечивать максимальную независимость работы разных задач, плюс регулировать насколько часто та или иная задача будет выполнять свою работу. Т.е. deadlock в таком виде невозможен, система работает предсказуемо. Что еще нужно для счастья? Так и есть. Куча параллельных автоматов. Фактически многозадачность. Загружаем процессор равномерно - задачи "размазываются" по времени. Последняя программа построенная описанным способом - для полуавтомата сортировки пружин - опрашивает датчики, управляет пневмоцилиндрами, электроприводом, отсчитывает различные задержки, контролирует аварийные ситуации и пр. Реализации могут быть разные смотря что надо - быстродействие, удобство, размер кода. Приведенные макросы реализуют понятную и удобную структуру с коротким кодом, но не самую быструю. Избавившись от возможностей задержек, вложенности и исключив вызовы подпрограмм можно повысить быстродействие но увеличить размер кода. Кому интересно - предлагаю обсудить мою реализацию на ассемблере с целью оптимизировать набор макросов для максимального удобства-быстродействия-размера, может быть на конкретных примерах.
|
|
|
|
|
Jul 7 2006, 13:04
|

Частый гость
 
Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046

|
Цитата(Crystaly @ Jul 7 2006, 09:45)  Цитата(krdmitry @ Jul 3 2006, 00:34)  ...Есть еще вопрос с достаточно узкой "специализацией" КА-представления алгоритма. Например, ожидание таймера в одном из состояний приходится представлять как несколько состояний (инициализация, ожидание сигнала, останов таймера). Расписывание действий на выходах состояний тоже "отягощает" рисунок... Поэтому ИМХО нужно искать более "современные" и актуальные формы представления управляющих алгоритмов, похожие на КА, но обладающие расширенными возможностями. Есть ли такие? Соответственно, есть вопрос и по оформлению документанции на программу. Вроде, в нашем родном ГОСТе предусматриваются только алгоритмы ("схема программы")...
Я использую автоматное программирование на AVR, сразу предупреждаю что программирую на ассемблере. Для реализации автоматной структуры написал несколько макросов и простеньких подпрограммок(которые вызываются макросами). Макросы звучат типа так: 1. СТАРТОВАТЬ_АВТОМАТ_СРАЗУ ИМЯ_АВТОМАТА, ИМЯ_СОСТОЯНИЯ 2. СТАРТОВАТЬ_АВТОМАТ_С_ЗАДЕРЖКОЙ ИМЯ_АВТОМАТА, ИМЯ_СОСТОЯНИЯ, ВЕЛИЧИНА_ЗАДЕРЖКИ 3. ОСТАНОВИТЬ_АВТОМАТ ИМЯ_АВТОМАТА 4. ВЫПОЛНИТЬ_АВТОМАТ ИМЯ_АВТОМАТА 5. ПЕРЕЙТИ_НА_ДРУГОЕ_СОСТОЯНИЕ_СРАЗУ ИМЯ_СОСТОЯНИЯ 6. ПЕРЕЙТИ_НА_ДРУГОЕ_СОСТОЯНИЕ_С_ЗАДЕРЖКОЙ ИМЯ_СОСТОЯНИЯ, ВЕЛИЧИНА_ЗАДЕРЖКИ 7. ОСТАНОВИТЬСЯ 8. ПОВТОРИТЬ_СОСТОЯНИЕ_С_ЗАДЕРЖКОЙ Макросами 1-4 пользуются в любом месте программы. Макросами 5-8 пользуются внутри состояния автомата. С помощью этих макросов реализуется в общем любая автоматная структура (любое количество атоматов, любое количество состояний, вложенные автоматы с любой глубиной вложенности). Даже такие вещи как автомат состоящий из одного состояния  Автоматы могут управлять друг другом. Все задержки отрабатываются каждым автоматом независимо с кратностью единого кванта времени. При этом нет холостых циклов. Документированием в графике стараюсь не заниматься - уходит много времени, к тому же при изменении структуры надо документацию менять. Вместо этого стараюсь максимально комментирвать текст самой программы. Но если все-таки рисую графы (не алгоритмы) то делаю это в Visio. У вас какая-то смесь получается сервисов ОС (запустить/остановить) и КА (перейти в состояние). Насчет "перейти с задержкой" берут меня сильные сомнения в целесообразности этого. КА основывается на предположении, что все автоматы переходят в новое состояние одновременно и как бы "мгновенно". Вы разрушаете эту модель. С моей точки зрения это плохо, потому что не понятно в каком состоянии автомат находится во время ожидания. В классическом КА нужно создать промежуточное состояние, если нужно выдержать паузу. А вообще непонятно зачем это может быть нужно. Цитата(krdmitry @ Jul 2 2006, 23:34)  Есть еще вопрос с достаточно узкой "специализацией" КА-представления алгоритма. Например, ожидание таймера в одном из состояний приходится представлять как несколько состояний (инициализация, ожидание сигнала, останов таймера). Расписывание действий на выходах состояний тоже "отягощает" рисунок... Поэтому ИМХО нужно искать более "современные" и актуальные формы представления управляющих алгоритмов, похожие на КА, но обладающие расширенными возможностями. Есть ли такие? Соответственно, есть вопрос и по оформлению документанции на программу. Вроде, в нашем родном ГОСТе предусматриваются только алгоритмы ("схема программы")... Неправильно, ты дядя Федор бутерброд ешь... (с) кот матроскин Запуск и останов таймера -- это должно делаться на уровне сервисов, т.е. КА не обязан заниматься такими вещами. КА должен послать сигнал сервису таймера "начни отсчет". Потом дождаться сигнала "таймаут истек". Достаточно одного состояния. Если нужно досрочно остановить, посыдаем сигнал "остановить таймер".
--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
|
|
|
|
Сообщений в этой теме
Lem Автоматный подход (SWITCH) Jul 2 2006, 17:17 Laptop Я использую следующий подход. main выполняется в в... Jul 2 2006, 19:09 vet Да, собственно, выбор-то невелик - или КА, или зад... Jul 2 2006, 19:22 pitt Цитата(vet @ Jul 2 2006, 15:22) ..задачи ... Jul 2 2006, 21:28  krdmitry Цитата(pitt @ Jul 3 2006, 01:28) Цитата(v... Jul 3 2006, 08:22 tag Цитата(vet @ Jul 2 2006, 23:22) Да, собст... Sep 17 2007, 06:17 krdmitry А есть ли еще программы-кодогенераторы, кроме Visu... Jul 2 2006, 20:34 Lem Цитата(krdmitry @ Jul 3 2006, 00:34) А ес... Jul 2 2006, 20:53 tag Цитата(krdmitry @ Jul 3 2006, 00:34) Врод... Jul 10 2006, 15:17 Lem Выбор - понятно.
но интересно узнать именно соотн... Jul 2 2006, 20:41 osnwt Цитата(Lem @ Jul 2 2006, 23:41) возможнос... Jul 3 2006, 09:14 µµC Цитата(Lem @ Jul 3 2006, 00:41) Причём, р... Jul 14 2006, 12:34  osnwt Цитата(µµC @ Jul 14 2006, 15:34) Для mega... Jul 14 2006, 12:43   µµC Цитата(osnwt @ Jul 14 2006, 16:43) Особен... Jul 14 2006, 13:30 _artem_ имхо автомат конечных состояний и ртос это две раз... Jul 3 2006, 09:33 osnwt Цитата(_artem_ @ Jul 3 2006, 12:33) имхо ... Jul 3 2006, 09:44  _artem_ Цитата(osnwt @ Jul 3 2006, 12:44) Цитата(... Jul 3 2006, 09:53   osnwt Цитата(_artem_ @ Jul 3 2006, 12:53) Цитат... Jul 3 2006, 10:51 sensor_ua Посмотрите NesOS - Finite State Machine Operating ... Jul 3 2006, 11:03 osnwt Цитата(sensor_ua @ Jul 3 2006, 14:03) Пос... Jul 3 2006, 11:16  =GM= Еще один пример ОСРВ для МК и ДСП можно посмотреть... Jul 3 2006, 12:37 _artem_ 2 osnwt, в слючае роунд робин можно сделать так чт... Jul 3 2006, 11:26 osnwt Цитата(_artem_ @ Jul 3 2006, 14:26) 2 osn... Jul 3 2006, 11:36  _artem_ ЦитатаЕсли разговор конкретно про jacos, то там пр... Jul 3 2006, 13:10   osnwt Цитата(_artem_ @ Jul 3 2006, 16:10) Цитат... Jul 3 2006, 14:09 bialix вот еще один какбы генератор WhatOS: http://www.st... Jul 3 2006, 12:20 pitt RTOS большая и многогранная тема. Нет и не может б... Jul 3 2006, 15:00 vesago Вперве применил КА когда надо было сделать контрол... Jul 4 2006, 08:13 _artem_ Цитата(vesago @ Jul 4 2006, 11:13) Вперве... Jul 4 2006, 08:43  ig_z Цитата(_artem_ @ Jul 4 2006, 11:43) Вызов... Jul 4 2006, 10:30   _artem_ Цитата(ig_z @ Jul 4 2006, 13:30) Цитата(_... Jul 4 2006, 11:22    bialix Цитата(_artem_ @ Jul 4 2006, 14:22) Visua... Jul 4 2006, 14:34     _artem_ Цитата(bialix @ Jul 4 2006, 17:34) Цитата... Jul 4 2006, 15:16      bialix Цитата(_artem_ @ Jul 4 2006, 18:16) Цитат... Jul 4 2006, 17:10  _Bill Цитата(_artem_ @ Jul 4 2006, 11:43) Вызов... Jul 4 2006, 11:21  Kirill Frolov Цитата(_artem_ @ Jul 4 2006, 12:43) Вызов... Sep 16 2007, 14:22   Dog Pawlowa Цитата(Kirill Frolov @ Sep 16 2007, 17:22... Sep 16 2007, 19:32   singlskv Цитата(Kirill Frolov @ Sep 16 2007, 18:22... Sep 16 2007, 20:16 white.wind Возможно полезным будет ресурс на тему http://soft... Jul 4 2006, 08:24   krdmitry Цитата(bialix @ Jul 7 2006, 17:04) Неправ... Jul 7 2006, 19:34    Lem Цитата(krdmitry @ Jul 7 2006, 23:34) Цита... Jul 7 2006, 19:56    bialix Цитата(krdmitry @ Jul 7 2006, 22:34) Цита... Jul 10 2006, 09:45   Crystaly Цитата(bialix @ Jul 7 2006, 17:04) У вас ... Jul 10 2006, 06:13    bialix [quote name='Crystaly' date='Jul 10 20... Jul 10 2006, 09:58 _artem_ Ну думаю, что скорее всего осязание подвело Вас иб... Jul 4 2006, 17:26 CD_Eater Цитата(bialix @ Jul 4 2006, 18:54) Сам по... Jul 6 2006, 21:54 osnwt Цитата(CD_Eater @ Jul 7 2006, 00:54) Имхо... Jul 6 2006, 22:14  bialix Цитата(osnwt @ Jul 7 2006, 01:14) Цитата(... Jul 7 2006, 05:57 Evgeny_CD Может кому пригодится
****************************... Jul 10 2006, 07:25 bialix Перепишем алгоритм светофора в терминах классическ... Jul 10 2006, 10:16 Tran Раньше уже была тема о КА - http://electronix.ru/f... Jul 10 2006, 11:27 bialix По поводу диаграмм конечных автоматов в нотации UM... Jul 11 2006, 05:36 sensor_ua Cегодня такая вот прелесть попалась - 4 макроса дл... Jul 11 2006, 18:22 sensor_ua ЦитатаВо-первых оптимизирующий компилятор заменяет... Sep 16 2007, 17:20 sansnotfor Вот перевод упомянутой здесь статьи о конечных авт... Mar 24 2011, 00:24 kovz могу посоветовать вот это http://www.state-machine... Mar 28 2011, 13:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|