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


КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 6 '2011



Pdf көрінісі
бет53/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   49   50   51   52   53   54   55   56   ...   129
Kurniz

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 экземпляра задачи-передатчика. Параметр, 
* передаваемый задаче при ее создании, используется для 
* передачи экземпляру конкретного значения, которое 

экземпляр 
задачи 
будет записывать в очередь.

Задача-передатчик 

будет записывать значение 100.

Задача-передатчик 

будет записывать значение 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-функцию вызова планировщика 


Достарыңызбен бөлісу:
1   ...   49   50   51   52   53   54   55   56   ...   129




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

    Басты бет