is running”) (рис. 10), после чего выполняет
API-функцию vTaskDelay(), в результате чего
Задача 2 переходит в блокированное состоя-
ние. После вызова функции vTaskDelay() вы-
полняемая в данный момент Задача 2 пере-
шла в блокированное состояние и не нуж-
дается в процессорном времени, поэтому
для того чтобы занять процессор другой за-
дачей, функция vTaskDelay() вызывает пла-
нировщик. Теперь в списке готовых к вы-
полнению задач осталась только Задача 1,
которой планировщик и отдает управление
(момент времени (2)). Задача 1 выполня-
ет свою полезную работу: также вызыва-
ет API-функцию vTaskDelay() и переходит
в блокированное состояние (момент вре-
мени (3)). В этот момент нет ни одной зада-
чи, готовой к выполнению, поэтому плани-
ровщик вызывает системную задачу, которая
не выполняет никакой полезной работы, —
задачу Бездействие (4). Подробнее о задаче
Бездействие будет сказано ниже.
На протяжении времени, когда Задача 1
и Задача 2 находятся в блокированном состоя-
нии, кроме выполнения задачи Бездействие,
ядро FreeRTOS отсчитывает кванты време-
ни, прошедшие с моментов вызовов API-
функции vTaskDelay(). Как только ядро от-
считает 1000 квантов (1000 мс), оно переведет
Задачу 1 из блокированного в состояние готов-
ности к выполнению (момент времени (5)).
Планировщик отдаст ей управление, она вы-
полнит полезную работу и снова перейдет
в блокированное состояние на время 1000 мс
и т. д. Задача 2 будет находиться в блокирован-
ном состоянии на протяжении 3000 мс. В мо-
мент времени (7) из блокированного состоя-
ния в состояние готовности к выполнению
перейдут обе задачи, однако планировщик
запустит (переведет в состояние выполнения)
Задачу 2, так как приоритет у нее выше.
Достарыңызбен бөлісу: |