Easyelectronics.ru

Электроника для всех
Текущее время: 18 сен 2019, 23:06

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 04 окт 2014, 02:02 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
Ну наконц хоть какие-то поползновения понять, что каждой задаче - свой инструмент и серебряной пули нет.

Как только минимальный элемент задачи перестанет укладываться в допустимый "квант", то тут с автоматами придется плясать вприсядку. Например, отрисовка дерева гуи-элементов. Разбивать ее на куски, типа сначала выводим первые пять, запоминаем, при следующем вызове автомата отрисуем еще пять... Отстой и по качеству кода и по модифицируемости.

А когда у нас элементарное действие - это проверить пин кнопки или инкрементировать таймер - та тут что ни городи, то КА получится. )

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 04 окт 2014, 02:09 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Добавлю еще одну мысль.

Флаговый автомат является частным случаем патерна "автомат". То есть, это такой конечный автомат, который предназначен для диспетчеризации задач.
Выше я говорил о том, что конечный автомат не есть нечто гибкое. Диспетчеризация очевидно требует гибкости, ибо всегда может понадобиться добавить какую-то задачу.

Отсюда, в полном соответствии, практикой, следует то, что для больших проектов флаговый автомат не подходит. Мы видим это.
Точно также можно вывести правило.

Конечный автомат следует применять там, где постановка задачи не будет меняться в процессе развития проекта. То есть, конечный автомат законченной задаче. Это, на мой взгляд есть хороший критерий того, когда конечные автоматы следует использовать.

P.S.
Ну... Steel.ne примерно, вроде, о том же...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 04 окт 2014, 08:25 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Хм, почитал я внимательно ваши доводы. Вы против автоматного программирования. Хорошо. Давайте разберем одну задачу. Хочу знать вашу альтернативу КА. Есть станок. У него 4 рабочих режима. "Стоп", "Наладка", "Полуавтомат", "Автомат". Есть пульт оператора. Неважно, физические кнопки и дисплей, сенсорный дисплей. Управление вышеперечисленными режимами. Исполнительными механизмами в режиме "Наладка". Для легкости пока берем дискретные входы-выходы. Такой вот простенький набор. Теперь смотрите, как рассматриваю задачу я:
Главный автомат. Состояния:
Stanok_Init
Stanok_Stop
Stanok_Manual
Stanok_SemiAutomat
Stanok_Automat

Stanok_Emerg_Stop.

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

Программа:
Show


Ваша альтернатива автоматному программированию, уважаемые оппоненты?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 01:50 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Вариантов, на самом деле, дохрена и больше, но, чтобы было понятно, что всё может быть совсем подругому, я расскажу о варианте, в котором всё перевернуто с ног на голову относительно того, что вы делаете.

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

Выглядеть это будет так.

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

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

Что происходит... Режимы работы устройства реализуются в виде модулей, которые скармливают драйверам свои колбэки. И если происходит какое-то событие, модуль реагирует, вызываясь драйвером по соответствующему колбэку. И, по сути, здесь всё построено именно на реакциях на события, оттого и называется это событийным подходом.

Если модуль должен делать какие-то действия переодически, он переодически пинается через систему таймеров. То есть, опять же, он не сам что то делает, а ожидает пинка под зад.

По сути при этой реализации main цикл может вообще быть пустым.

То есть, разница принципиальная.
В вашем случае главный цикл по очереди проверяет всё, что происходит в системе и понукает на какие-то действия. То есть централизация власти, монархия, всё такое.

А в том варианте, что описал я, всё, что происходит, идёт снизу, от аппаратной части, от драйверов. То есть, демократия, власть народа... И бла бла бла, бла бла бла...

И это только два крайних случая...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 03:19 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
...

На данный момент пока я увидел только такой способ. Если использовать диспетчер, то в начале программе, в блоке инициализации пинаются первые процессы, которые, если требуется, запускают следующие. Чтобы добиться в определенный момент нужной реакции на нужные воздействия процесс дробится на функции. В задаче создается указатель на функцию. И в каждый определенный момент в указателе нужная функция. Что-то вроде такого:
Код:
// Где-то инициализируем.
   void (*ptr_proc_eds_main_func) (void);

   ptr_proc_eds_main_func = proc_eds_stop;

// Обработчик цикла работы оборудования.
void proc_eds (void)
{
   (*ptr_proc_eds_main_func) ();
}

void proc_eds_stop (void)
{
   ptr_proc_eds_main_func = proc_eds_naladka;
}

void proc_eds_naladka (void)
{
}

void proc_eds_automat (void)
{
}


Этим мы добиваемся той реакции, которой ожидаем от программы, если бы она была написана автоматным программированием.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 03:41 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
... И зачем оно надо?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 03:46 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
... И зачем оно надо?

Попробую объяснить на словах. Станок. Если режим "Стоп", ожидается реакция на одни события. Если режим "Автомат", реакция на другие события. Или события одни и те же, реакция в разных режимах разная. А теперь попробуйте вы объяснить как мне это реализовать, если не использовать автоматное программирование.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 03:47 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Хм.... Ну, один из вариантов я чуть выше расписал как-бы...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 03:55 
Заглядывает иногда

Зарегистрирован: 28 мар 2013, 11:01
Сообщения: 86
Про автоматное и многопоточное программирование
Вы тут пытаетесь сравнивать теплое с мягким, две хм... вещи, существующие параллельно и решающие каждая свою задачу. Теория автоматов - это некая абстрактная концепция построения вычислений, а потоки - конкретный инструмент для реализации параллельного выполнения задач. Если использование автоматов в некоторых случаях может эмулировать многопоточность, то из этого не следует, что одно равно другому. Нельзя говорить - "Я использую потоки вместо автоматов!" - это звучит как - "Я использую ножницы вместо жарки".

Про последний пример от demiurg1978 и ответ от Mirmik
Mirmik, как бы мы не разделяли функции на модули, не вызывали их с помощью событий, у нас всё-равно будет состояние и реакция которая зависит от текущего состояния. Более простой пример - одна кнопка, нажатие - включение устройства, повторное нажатие - выключение. Одно входное действие, разные выходные реакции в зависимости от текущего состояния.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 03:57 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Menzoda писал(а):
...

Я ему пытаюсь это сказать, пока понимания нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 04:25 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Товарищи... В теории религии есть замечательная проблема.

Состоит она в том, что чем более всеобъемлющим является божество, тем менее осмысленными становятся суждения о нем.

То есть, вы можете обозвать автоматами вообще всё, и вероятно, будете правы, потому что действительно, таково их классическое определение. Но, тогда вы делаете сей термин беспредметным.

То есть, как можно говорить о преимуществах и недостатках чего-то, если любой стиль написания программы созидает это самое что-то?

И, пожалуйста, многоуважаемый Демиург, я в любой момент готов согласиться с тем, что всё, что вы говорите правильно, и по форме это действительно так.
Но мы, по праву "всё что не придуманно есть автомат", уже включили в обсуждаемую проблематику столько подходов и стилей, что изучать не переизучать...

Ну, хорошо...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 12:31 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Какая религия? Я исхожу из целесообразности и только из нее. Если я хочу получить полностью контролируемое поведение программы, легкость написания, редактирования, то автоматное программирование мне это предоставляет. Свои хотелки, доводы я изложил. От вас же от всех я услышал много умных и красивых слов, а по существу получается, что у вас религия. А не у меня. И самое главное, автоматное программирование легко подходит новичкам. В отличие от диспетчеров и RTOS.
Надеюсь, за "ну хорошо" следует продолжение... Потому что пока я не получил ответа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 13:29 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
В таком случае нам следует уточнить, что есть автоматное программирование.
Кстати, какой был вопрос?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 13:40 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
В таком случае нам следует уточнить, что есть автомвтное программирование.

Все просто. Самый главный признак автомата - состояние. Соответственно, автоматное программирование - это программирование с явным выделением состояний. Автоматы могут содержать подавтоматы. При этом не обязательно вся программа будет состоять только из КА.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 13:42 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
А какой был вопрос?

И, кстати, приведите, пожалуйста пример "не автомата".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 13:48 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
В каждой задаче есть решение простое, красивое и неправильное.
Все прочие решения имеют недостатки, все подходы имеют ограничения по применимости.

Та же теория КА, при увеличении состояний, при усложнении графа переходов между состояниями, задача усложняется и программа становиться сложна в сопровождении и модификации.

Тот же РТОС имеет неслабый оверхед, но при достаточно сложной задаче сопровождение и модификация облегчаются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 14:09 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
А какой был вопрос?

Вопрос был таков. Если вы такие яростные противники автоматного программирования, какая тогда должна быть альтернатива? Выше я выложил пример, как бы я писал программу. Есть явно выделенные состояния. В каждом состоянии свои условия, свои реакции на события. При этом на одни и те же события в разных состояниях могут разные реакции. Простейший пример вам привели. Ночник с веревочкой. Исходное состояние - выключено. Дернули за веревочку, лампочка включилась. Новое состояние - лампочка включена. Дернули опять за веревочку, лампочка выключена. Событие одно (дернуть за веречоку), реакции в разных состояниях разные.
Если брать более сложный пример, то берем станок. У него 4 режима. Стоп, Наладка, Автомат, Аварийный стоп. В режиме Стоп ожидаем запуск станка. В режиме Наладка ожидаем, что будут вручную управлять исполнительными механизмами, а также переключение из режима Наладка в режим Стоп (пусть это будет нажатие на кнопку Стоп). В режиме Автомат ожидаем возможный "мягкий стоп" (Стоп), также, в случае аварийной ситуации реакцию на аварийные ситуации, выполнение рабочего цикла оборудования. В процессе цикла работы в зависимости от стадии цикла опрашивается разный набор входов, также в зависимости от стадии цикла соответствующие исполнительные механизмы выполняют свою работу.
При использовании автоматного подхода выделяются явные состояния, обработчики которых ведут себя соответственно состоянию.
Ваша альтернатива?

Mirmik писал(а):
И, кстати, приведите, пожалуйста пример "не автомата".

Обычный линейный код. К примеру:
1 - Ожидание нажатия кнопы. Если не нажато, то выход или крутимся в цикле. Если нажато, то пункт 2.
2 - Задержка на устранение дребезга. По окончании задержки, если не нажато, возвращаемся к пункту 1.
Если нажато, то пункт 3.
3 - Включаем лампочку.
Минусы такого подхода явные. Однозадачность. Микроконтроллер ждет нажатия кнопы, крутит в холостую задержку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 14:32 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
А тот вариант, который я приводил выше, про событийный подход... Является автоматом?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 14:37 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
А тот вариант, который я приводил выше, про событийный подход... Является автоматом?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 14:54 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Разумеется, не буду писать. :)...
Если есть конкретный вопрос, я готов по нему ответить.

Соответствующая моменту реакция задаётся установкой нужного колбэка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 15:13 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
...

Вы юлите. Написано много, конкретики нет. Затеяли дискуссию, извольте соответствовать. Я же не прошу проект за меня написать. Интересуюсь, как бы делали то, о чем я писал. Способы, подходы в программировании ну и так далее. Пусть это будет ночник.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 15:15 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Хорошо, вы победили. Автоматы это круто.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 16:14 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1034
Откуда: Brussels
Вы даже не поверите насколько круто :)
Их придумал некто А.А.Шалыто из ИТМО аж в 1991 году! И написал кучу статей о себе любимом в википедии.
За что впрочем и удостоился упоминания на Лурке. Успех.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 19:35 
Старожил

Зарегистрирован: 28 дек 2012, 07:17
Сообщения: 517
demiurg1978 писал(а):
Mirmik писал(а):
А тот вариант, который я приводил выше, про событийный подход... Является автоматом?

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

Раз уж пошел разговор о станках, то сразу на сцену выходит третий вариант - программирование в символах релейно-контактной логики :)
Этот вариант на порядок перспективнее КА!!1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование диспетчеров. Таймеры
СообщениеДобавлено: 05 окт 2014, 19:52 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Black Warrior писал(а):
Раз уж пошел разговор о станках, то сразу на сцену выходит третий вариант - программирование в символах релейно-контактной логики :)
Этот вариант на порядок перспективнее КА!!1

Не вариант. Однозначно. Нафик-нафик такое счастье. Как только я вижу схему какого-либо цикла на релейно-контактной схеме у меня сразу мозги клинит. Вот меня плющило и таращило, когда на типографии работал и ремонтировал немецкие печатные станки. Логики как таковой немного, все остальное на реле. Б-р-р...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB