31
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 7 '2011
www.kite.ru
микроконтроллеры
xStringQueue будет хранить переменные типа char* –
указатели на нуль-терминальные строки.
Обе очереди создаются размером 10 элементов.
Реальная программа должна проверять
значения xIntegerQueue,
xStringQueue,
чтобы убедиться, что очереди успешно созданы. */
xIntegerQueue = xQueueCreate(10, sizeof(unsigned long));
xStringQueue = xQueueCreate(10, sizeof(char *));
/* Связать прерывание MS-DOS с обработчиком прерывания
vExampleInterruptHandler(). */
_dos_setvect(0x82, vExampleInterruptHandler);
/* Создать задачу — генератор чисел с приоритетом 1. */
xTaskCreate(vIntegerGenerator, “IntGen”, 1000, NULL, 1, NULL);
/* Создать задачу-принтер с приоритетом 2. */
xTaskCreate(vStringPrinter, “String”, 1000, NULL, 2, NULL);
/* Запуск планировщика. */
vTaskStartScheduler();
/* При нормальном выполнении
программа до этого места
“не дойдет” */
for (;;)
;
}
Заметьте, что для эффективного распреде-
ления ресурсов памяти данных (как и реко-
мендовалось в [2, КиТ № 6]) очередь № 2 хра-
нит не сами строки, а лишь указатели на стро-
ки, которые содержатся в отдельном массиве.
Такое решение вполне допустимо, так как со-
держимое строк в программе не изменяется.
По результатам выполнения (рис. 11) вид-
но, что в результате возникновения прерыва-
ния была разблокирована высокоприоритет-
ная задача-принтер, после чего управление
снова возвращается низкоприоритетной за-
даче — генератору чисел (рис. 12).
Задача-бездействие выполняется б
óльшую
часть времени. Каждые 200 мс она вытесняет-
ся задачей — генератором чисел (1). Задача —
генератор чисел записывает в очередь № 1
пять целых чисел, после чего принудитель-
но вызывает прерывание (2). Обработчик
прерывания считывает числа из очереди
№ 1 и записывает в очередь № 2 указатели
на соответствующие строки. Запись в оче-
редь № 2 разблокирует высокоприоритетную
задачу-принтер (3). Задача-принтер считыва-
ет указатели на строки из очереди № 2, пока
они там есть, и выводит соответствующие
строки на экран. Как только очередь № 2 опу-
стошится, задача-принтер переходит в бло-
кированное состояние (4). Управление снова
получает низкоприоритетная задача — ге-
нератор чисел, которая также блокируется
на время ~200 мс, так что система снова пере-
ходит в состояние бездействия (5).
Достарыңызбен бөлісу: