[an error occurred while processing this directive]
У меня очень простая многозадачность...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Sot 10 ноября 2002 г. 15:05
В ответ на: "предпочитаю свою реализацию многозадачности" (+) отправлено DASM 10 ноября 2002 г. 11:43

Для моих задач (теплосчетчики, расходомеры: индикатор, кнопки, 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