1 - Что мешает использовать автоматы совместно с диспетчерами или простенькими псевдо-RTOS, как это сделано, например, в RIOS/SST/QP?
2 - Оказалось проще перейти к чистым конечным автоматам, чем найти решение такой нетривиальной задачи
1 - Ничто и никто не мешает. Я же не говорил, что программа должна быть чистым конечным автоматом. Но также никто и ничто не мешает сделать всю программу одним главным конечным автоматом. Все подчиняется условиям ТЗ и целесообразности.
2 - Здесь вы не правы. Повторю: RTOS и диспетчеры предназначены для одной единственной цели. Управлять очередью процессов. Это не основная программа, а всего лишь инструмент. Основными программами являются программные модули, процессы, задачи, таски. И ваш подход - это латание дыр заплатками.
Про мину замедленного действия: в первом варианте диспетчера у DI HALT-а таймерная служба работала из прерывания. И задачами у него считались примерно такие действия:
"включить светодиод".
установить программный таймер на столько секунд.
закинуть в очередь задачу "выключить светодиод", которая и сработает через эти несколько секунд.
А наткнулся я на нее при следующих обстоятельствах. Я сделал автомат световых эффектов. Смена эффектов при нажатии кнопки. Когда работал один режим, я нажал на кнопку, чтобы сменить режим, этот режим установился, но, как выяснилось, в очереди задач остались болтаться задачи предыдущего режима. Во-первых, таймерная служба работала из прерываний, во-вторых, диспетчеру неизвестно, что режим сменился. Откуда ему знать, какие задачи удалять из очереди. Ведь это НЕ ЕГО НАЗНАЧЕНИЕ, а всего лишь исправно крутить карусельку-очередь заложенных процессов. Я переработал этот диспетчер, разобрал его на атомы, перелопатил. Вынес таймерную службу в основной цикл. Но проблема осталась. И тогда я понял, что нужно принципиально менять подход
Отсюда вытекает:
Подход 1:
Отдать управление RTOS, диспетчеру. И огребать последствия.
Подход 2:
Отдать управление процессу, задачей которого и является: выполнять заданный алгоритм. Когда дать команду исполнительному механизму, когда запретить работу исполнительного механизма.
На том форуме я неоднократно обсуждал этот вопрос. И только один, кто использует диспетчеры, сознался, что в его диспетчере крутятся программные модули, конечные автоматы. И я ему на это ответил так: а какой тогда вообще толк в диспетчере, если в твоем случае очередь крутит диспетчер и на переключение задач-процессов тратятся такты и время, а при моем подходе вся программа представляет из себя статичный цикл-список программных модулей. Подпрограммы, если на ассемблере, функции, если на си. И все затраченное время на переключение процессов- это вызов подпрограмм-функций и возврат в основной цикл.
Резюмирую:
Задача RTOS, диспетчеров - крутить очередь процессов. Но это всего лишь очередь процессов. И это всего лишь инструменты программиста, пассатижи, отвертка. Но никак не панацея всего и вся.
Главный алгоритм выполняют: вся программа в целом и программные модули. И чтобы это все правильно работало, управление должно быть в руках программиста, а не RTOS и диспетчеров.
Указанный мной подход универсален. Не привязан к какой-либо архитектуре. Применяя определенные правила и подходы, в разы сокращается время на создание проектов. Любой проект собирается как конструктор, из кубиков-программных модулей.
Если интересно дальше продолжать, то могу продолжить. Но учитывайте, что я занят, и не всегда могу ответить вовремя или вообще ответить. Закончу следующим. Это на словах вроде сложно, автоматное программирование, конечные автоматы, программные таймеры. Но на самом деле ничего сложного.
Для ТС:
Книги Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL". Джон Мортон "Микроконтроллеры AVR Вводный курс".
Немного про конечные автоматы
тут. В конце статьи ссылка на архив цикла статей Татарчевского. Основное я почерпнул оттуда.
Последний раз редактировалось
Demiurg Вт окт 02, 2018 16:44:38, всего редактировалось 3 раз(а).