Что-то у меня иссякла мысль. Быть может, кто-то подскажет свежую идею.
Вводная такова – делается управляющее устройство ("master"), к которому по RS-485 подключены устройства ("slave"), выполняющие измерения некоторых величин и по запросам master'а с определенной периодичностью передающие ему данные. Master должен обрабатывать эти данные и выдавать управляющее воздействие на исполнительный механизм. При этом сам master может быть подключен к компьютеру (по отношению к которому будет являться slave'ом) и по запросам компьютера транслировать ему некоторую часть данных, получаемых от измерительных устройств. Задача должна решаться на контроллере AVR (ATmega1284).
Понятно, что реализовывать все действия в обработчиках прерываний в данном случае неверно, поэтому нужно строить автомат состояний.
Но как именно реализовать автомат?
Да, нужно выделить битовое поле, каждый бит в котором определяет выполнение того или иного действия и циклически опрашивать состояния этих бит. Но это хорошо работает для обслуживания так называемых "входящих" событий, как-то: окончание счетного интервала (таймер), прием пакета данных (прерывание по приему байта) и т.д.
Но ведь управляющее устройство должно и само формировать команды! То есть, кроме собственно битового поля состояний где-то должна храниться и очередь команд, задающая последовательность действий, причем если предусмотрено несколько режимов, то для каждого режима нужна своя очередь команд. Очередь команд – это своего рода "перфокарта", в которой описана последовательность команд. Например, для периодического опроса двух измерителей очередь команд может выглядеть так:
1. Послать запрос измерителю 0.
2. Послать запрос измерителю 1.
3. Обработать полученные данные
4. Выдать управляющее воздействие
5. Ожидать окончания счетного интервала, после чего вернуться к шагу 1.
Но ведь не все так просто! Допустим, на первом шаге я сформировал командный пакет, инициировал отправку его первого байта, после чего остальная часть пакета отправляется "автоматически" в обработчике прерывания по завершению передачи байта. Это понятно, но ведь для получения ответа требуется определенное время! При этом нельзя ждать ответа измерителя бесконечно, поэтому я, циклически опрашивая битовое поле состояний в ожидании установки бита "Получен ответ от измерителя 0", через какое-то время должен сказать – все, баста! Ответа от измерителя 0 нет, поэтому нужно выдать ошибку и перейти к команде 2. То есть, в очереди команд должно храниться еще и время выполнения каждой команды.
Одновременно с этим не получится полностью "зациклиться" на выполнении команд 1…5, потому что в любое время может прийти запрос от компьютера предоставить ему данные за предыдущий счетный интервал, поэтому нужно будет прервать выполнение команд из очереди, ответить на запрос, а потом вернуться к выполнению текущей команды.
Вот, собственно, и все "мысли вслух". Конечно, очень полезно иной раз "выговориться", ибо лично у меня частнеько бывает, что решение трудной задачи приходит в процессе рассказа другому человеку о том, что именно не получается при решении проблемы. Может быть, кто-то подскажет способ или идею. Может, я что-то упускаю
Меня не интересует программная реализация, только алгоритм или хотя-бы "пинок" в нужную сторону.

