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

 
 
> Автоматный подход (SWITCH), Поделитесь опытом использования
Lem
сообщение Jul 2 2006, 17:17
Сообщение #1


Участник
*

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



Решил в последнее время освоить более строгие-формальные методы проектирования программ для МК (да и для ПК). Делаю уже третий проект с помощью КА. правда, я использую некую смесь из того, что где-то прочитал и того, что сам придумываю по ходу. При этом всё выполняется на бумаге (проектирование КА), а далее ложится на код, по моим личным предпочтениям.

Результаты положительные, но тут хотелось бы спросить совета профессионалов, каким путём дальше идти, стоит ли использовать кодогенераторы и прочее ПО и т. д.

Интересно было бы узнать, насколько часто микроконтроллерщики используют автоматный подход к проектированию программ. Какое ПО при этом используется (Visual State etc.), каковы результаты (увеличение скорости разработки, надёжности, улучшение взаимопонимания в коллективе разарботчиков).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bialix
сообщение Jul 4 2006, 14:54
Сообщение #2


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

Группа: Свой
Сообщений: 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 в таком виде невозможен, система работает предсказуемо. Что еще нужно для счастья?


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
Crystaly
сообщение Jul 7 2006, 06:45
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 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 пользуются внутри состояния автомата.
С помощью этих макросов реализуется в общем любая автоматная структура (любое количество атоматов, любое количество состояний, вложенные автоматы с любой глубиной вложенности). Даже такие вещи как автомат состоящий из одного состояния smile.gif Автоматы могут управлять друг другом. Все задержки отрабатываются каждым автоматом независимо с кратностью единого кванта времени. При этом нет холостых циклов.

Документированием в графике стараюсь не заниматься - уходит много времени, к тому же при изменении структуры надо документацию менять. Вместо этого стараюсь максимально комментирвать текст самой программы. Но если все-таки рисую графы (не алгоритмы) то делаю это в Visio.

Цитата(bialix @ Jul 4 2006, 18:54) *
...Сам по себе автоматный подход (оно же синхронное программирование -- в западных источниках) мне видится единственным способом писать логику работы. НО! не всего устройства в целом в виде одного огромного автомата, а в виде N количества паралелльных слабозависимых (в идеале независимых вообще) автоматов. А там или ОС применить для жонглирования этими автоматами или просто в один бесконечный цикл их засунуть -- это дело личных пристрастий каждого...

Сам я ОС до сих пор не пользовался, ибо по сути тщательно спроектированная система в виде набора параллельных автоматов -- это практически тоже самое, что и кооперативная ОС, только памяти жрет еще меньше и ты всегда имеешь полный контроль над процессом. Т.е. каждый раз я делаю примитивную кооперативную карусель, и мне хватает. Из набора сервисов: таймеры, фифо, реже семафоры. Это позволяет обеспечивать максимальную независимость работы разных задач, плюс регулировать насколько часто та или иная задача будет выполнять свою работу. Т.е. deadlock в таком виде невозможен, система работает предсказуемо. Что еще нужно для счастья?


Так и есть. Куча параллельных автоматов. Фактически многозадачность. Загружаем процессор равномерно - задачи "размазываются" по времени.

Последняя программа построенная описанным способом - для полуавтомата сортировки пружин - опрашивает датчики, управляет пневмоцилиндрами, электроприводом, отсчитывает различные задержки, контролирует аварийные ситуации и пр.

Реализации могут быть разные смотря что надо - быстродействие, удобство, размер кода. Приведенные макросы реализуют понятную и удобную структуру с коротким кодом, но не самую быструю. Избавившись от возможностей задержек, вложенности и исключив вызовы подпрограмм можно повысить быстродействие но увеличить размер кода.
Кому интересно - предлагаю обсудить мою реализацию на ассемблере с целью оптимизировать набор макросов для максимального удобства-быстродействия-размера, может быть на конкретных примерах.
Go to the top of the page
 
+Quote Post
bialix
сообщение Jul 7 2006, 13:04
Сообщение #4


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

Группа: Свой
Сообщений: 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 пользуются внутри состояния автомата.
С помощью этих макросов реализуется в общем любая автоматная структура (любое количество атоматов, любое количество состояний, вложенные автоматы с любой глубиной вложенности). Даже такие вещи как автомат состоящий из одного состояния smile.gif Автоматы могут управлять друг другом. Все задержки отрабатываются каждым автоматом независимо с кратностью единого кванта времени. При этом нет холостых циклов.

Документированием в графике стараюсь не заниматься - уходит много времени, к тому же при изменении структуры надо документацию менять. Вместо этого стараюсь максимально комментирвать текст самой программы. Но если все-таки рисую графы (не алгоритмы) то делаю это в Visio.


У вас какая-то смесь получается сервисов ОС (запустить/остановить) и КА (перейти в состояние).

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

В классическом КА нужно создать промежуточное состояние, если нужно выдержать паузу. А вообще непонятно зачем это может быть нужно.


Цитата(krdmitry @ Jul 2 2006, 23:34) *
Есть еще вопрос с достаточно узкой "специализацией" КА-представления алгоритма. Например, ожидание таймера в одном из состояний приходится представлять как несколько состояний (инициализация, ожидание сигнала, останов таймера).
Расписывание действий на выходах состояний тоже "отягощает" рисунок...
Поэтому ИМХО нужно искать более "современные" и актуальные формы представления управляющих алгоритмов, похожие на КА, но обладающие расширенными возможностями. Есть ли такие?
Соответственно, есть вопрос и по оформлению документанции на программу. Вроде, в нашем родном ГОСТе предусматриваются только алгоритмы ("схема программы")...


Неправильно, ты дядя Федор бутерброд ешь... (с) кот матроскин

Запуск и останов таймера -- это должно делаться на уровне сервисов, т.е. КА не обязан заниматься такими вещами. КА должен послать сигнал сервису таймера "начни отсчет". Потом дождаться сигнала "таймаут истек". Достаточно одного состояния. Если нужно досрочно остановить, посыдаем сигнал "остановить таймер".


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 04:53
Рейтинг@Mail.ru


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