Приоритеты задач
В предыдущей статье [1] читатель познакомился с механизмом
приоритетов задач. Далее будет показано, как значение приоритета
влияет на выполнение задачи.
При создании задачи ей назначается приоритет. Приоритет за-
дается с помощью параметра uxPriority функции xTaskCreate().
Максимальное количество возможных приоритетов определяется
макроопределением configMAX_PRIORITIES в заголовочном файле
FreeRTOSConfig.h. В целях экономии ОЗУ необходимо задавать наи-
меньшее, но достаточное значение configMAX_PRIORITIES. Нулевое
значение приоритета соответствует наиболее низкому приоритету,
значение (configMAX_PRIORITIES-1) — наиболее высокому (в ОС
семейства Windows наоборот — приоритет 0 наивысший).
Планировщик гарантирует, что среди всех задач, находящихся в со-
стоянии готовности к выполнению, перейдет в состояние выполнения
та задача, которая имеет наивысший приоритет. Если в программе соз-
даны несколько задач с одинаковым приоритетом, то они будут вы-
полняться в режиме разделения времени [1]. То есть задача выполняется
в течение системного кванта времени, после чего планировщик перево-
дит ее в состояние готовности и запускает следующую задачу с таким же
приоритетом, и далее по кругу. Таким образом, задача выполняется
за один квант времени и находится в состоянии готовности к выполне-
нию (но не выполняется) в течение стольких квантов времени, сколько
имеется готовых к выполнению задач с таким же приоритетом.
На рис. 7 показано, как задачи разделяют процессорное вре-
мя в учебной программе № 1. Кроме хода выполнения двух задач,
на рис. 7 показано выполнение кода планировщика каждый систем-
ный квант времени. Выполнение кода планировщика приводит к пе-
реключению на следующую задачу с одинаковым приоритетом.
Модифицируем учебную программу № 1 так, чтобы задачам на-
значался разный приоритет. Пусть Задача 2 получит приоритет,
равный 2, а приоритет Задачи 1 останется прежним — равным 1.
Для этого следует отредактировать вызов API-функции xTaskCreate()
для создания Задачи 2:
…
xTaskCreate( vTask, ( signed char * ) “Task2”, configMINIMAL_STACK_SIZE, (void*)&xTP2, 2, NULL );
…
Выполнив сборку модифицированной учебной программы и за-
пустив ее на выполнение, можно наблюдать ситуацию, когда все время
будет выполняться Задача 2, а Задача 1 никогда не получит управление
(рис. 8).
Задача 2, как и Задача 1, все время находится в состоянии готовно-
сти к выполнению. За счет того, что Задача 2 имеет приоритет выше,
чем Задача 1, каждый квант времени планировщик будет отдавать
управление именно ей, а Задача 1 никогда не получит процессорного
времени (рис. 9).
Этот пример показывает необходимость пользоваться приорите-
тами осмотрительно, так как никакого алгоритма старения в плани-
ровщике не предусмотрено (как в ОС общего назначения). Поэтому
Достарыңызбен бөлісу: |