[an error occurred while processing this directive]
|
У Вас есть вечный цикл, который имеет внтури переключатель switch() {...}, у этого свитча есть куча case'ов - вот эти выборочные "точки" и есть как-бы жесткая ситема конечного автомата. Каждый case - это определённое состояние, переход между ними регулируется сообщениями, их реализация может быть разной.
Я, к примеру, у себя в переключателе пользовался регистром сообщений - это был специально мною заданный флаговый регистр (для медлеено повторяющихся сообщений). Допустим "драйвер" клавы сосканировал, что мол нажата клавиша и есть её код. Я выставлял в общую часть памяти этот код и выставлял флаг - мол flagMsgKeyPressed, специальная задача у меня отабатывала это сообщение, для этого она постоянно опрашивает флаг и ждет его установления, как только установился - снимает код клавиши из ОЗУ, а далее у меня был специальный код сделан - Обработчик Сообщений от Окна. В общем я перенял кое-что от обработки сообщений в Windows, я там тоже как-то было дело на асме писал. В железе у меня интерфейс был с использованием а/ц LCD с размерами 20 симв. на 4 строки. Окна были почти статическими (некоторые можно было построчно перелистывать вверх/вних), а вся иерархия была в виде дерева. Поскольку ресурсов было мало, то весь интерфейс я хранил во флешке I2C SEEPROM, и придумал специальный формат для описания окна, чтобы можно было "двигальться" по дереву окон, что-то вроде связанного списка. Так вот у меня конечными макросостояниеями были окна :) А переход между окнами - по событиям, например, нажали клавишу выход - вышли на окно уровеня выше, либо срабатывает в окне программынй таймер - и выход осуществляется автоматом. Для обслуживания такого событийного интерфейса у меня были кучка вечных циклов и огромная куча Case'ов с переходами. Все было писано на асме и очень это было сложно, я написал спец утилиты для этого давняшнего своего проекта, чтобы создавать интерфейс иерархический на ПК, чтобы прошивать отдельно I2C. В общем я достиг предела того, что называется - реализация на асме практически неразумна, т.к. трудно поддается отладке, но вроде работало. Старый Ассемблер мне действовал на нервы ещё.
Очереди сообщений также делаются с помощью циклических буферов. Программа разбивается на некие слои, которые передают друг другу собщения. Вот эти слои у меня были отдельными задачами. Вообще эта тема довольно сложна и всё будет зависить только от Вашего желания. У меня некое смешение ртос получилось и автоматов и это не случайно. Ртос можно вообще не использовать - это очень сомнительная штука и подходить к ней надо обдуманно.
E-mail: info@telesys.ru