102
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 6 '2011
компоненты
микроконтроллеры
}
else
{
/* Данные не были прочитаны из очереди на протяжении
*
тайм-аута
100
мс.
* При условии наличия нескольких задач-передатчиков
*
означает
аварийную
ситуацию
*/
puts(“Could not receive from the queue.\r\n”);
}
}
}
/*------------------------------------------------------------------------*/
/* Точка входа. С функции main() начнется выполнение
* программы. */
int main(void) {
/* Создать очередь размером 5 элементов для хранения
* переменных типа long.
* Размер элемента установлен равным размеру переменной
* типа long.
* Дескриптор созданной очереди сохранить в глобальной
* переменной xQueue.
*/
xQueue = xQueueCreate(5, sizeof(long));
/* Если очередь успешно создана (дескриптор не равен NULL) */
if (xQueue != NULL) {
/* Создать 2 экземпляра задачи-передатчика. Параметр,
* передаваемый задаче при ее создании, используется для
* передачи экземпляру конкретного значения, которое
*
экземпляр
задачи
будет записывать в очередь.
*
Задача-передатчик
1
будет записывать значение 100.
*
Задача-передатчик
2
будет записывать значение 200.
* Обе задачи создаются с приоритетом 1.
*/
xTaskCreate(vSenderTask, “Sender1”, 1000, (void *) 100, 1, NULL);
xTaskCreate(vSenderTask, “Sender2”, 1000, (void *) 200, 1, NULL);
/* Создать задачу-приемник, которая будет считывать числа
* из очереди.
* Приоритет = 2, т.е. выше, чем у задач-передатчиков.
*/
xTaskCreate(vReceiverTask, “Receiver”, 1000, NULL, 2, NULL);
/* Запуск планировщика. Задачи начнут выполняться. */
vTaskStartScheduler();
} else {
/* Если очередь не создана */
}
/* При успешном создании очереди и запуске планировщика
* программа никогда “не дойдет” до этого места. */
for
(;;)
;
}
Результат выполнения учебной програм-
мы № 2 показан на рис. 3, на котором видно,
что задача-приемник получает сообщения
от обеих задач-передатчиков.
В момент времени (0) (рис. 4) происходит
запуск планировщика, который переводит
в состояние выполнения задачу с наивысшим
приоритетом — задачу-приемник. В момент
времени (1) задача-приемник пытается прочи-
тать элемент из очереди, однако очередь после
создания пуста, и задача-приемник переходит
в блокированное состояние до момента появ-
ления данных в очереди либо до момента исте-
чения тайм-аута 100 мс. В состояние выполне-
ния переходит одна из задач-передатчиков, ка-
кая именно — точно сказать нельзя, так как
они имеют одинаковый приоритет, в нашем
случае пусть это будет задача-передатчик 1.
В момент времени (2) задача-передатчик
1 записывает число 100 в очередь. В этот мо-
мент выходит из блокированного состояния
задача-приемник, так как она «ожидала» появ-
ления данных в очереди и приоритет ее выше.
Прочитав данные из очереди, она вновь бло-
кируется, так как очередь снова пуста (момент
времени (3)). Управление возвращается пре-
рванной задаче-передатчику 1, которая вы-
полняет API-функцию вызова планировщика
Достарыңызбен бөлісу: |