[an error occurred while processing this directive]
|
Для моих задач (теплосчетчики, расходомеры: индикатор, кнопки, serial, ЦАП, таймер, АЦП/ПНЧ, WDT) достаточная, но для более общих задач возможно не применимая.
Выделяется один таймер, как генератор тиков, настраивается под конкретную задачу.
Имеется такой тип:
typedef struct { unsigned char handle;
unsigned char mask;
} EVENT;
Где handle - очередь событий, каждый бит которой закреплен под конкретное событие, соответственно максимум 8 событий; mask - маска событий, для маскирования ненужных событий (на время).
Далее заводится три функции для работы с событиями:
unsigned char check_event(unsigned char handle); Проверить очередь
void put_event(unsigned char handle); Поместить в очередь void handle_event(void); Обработчик событий
Логика работы программы стандартная для работы с событиями, в прерываниях функцией put_event помещается событие, а в основной
оно обрабатывается. Обработчик прерывания по возможности должен просингализировать основной программе о наличии события, основная же программа делает последующую обработку.
void main(void) {
...
while(1) { // Бесконечный цикл
if(system.event.handle) { // Если вобще есть какое-либо событие
...
if(check_event(...)) {...} // Дополнительная обработка события 1
...
if(check_event(...)) {...} // Дополнительная обработка события 8
...
handle_event(); // Основная обработка
}
}
}
E-mail: info@telesys.ru