Компоненты и технологии • №2 '2011 компоненты


рис. 10. Обмен данными между задачами и прерыванием в учебной программе № 2 31



Pdf көрінісі
бет71/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   67   68   69   70   71   72   73   74   ...   129
Kurniz

рис. 10. Обмен данными между задачами и прерыванием в учебной программе № 2


31
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 7 '2011
www.kite.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).


Достарыңызбен бөлісу:
1   ...   67   68   69   70   71   72   73   74   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет