99
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 4 '2011
www.kite.ru
компоненты
микроконтроллеры
возможна ситуация «зависания» задачи с низким приоритетом, кото-
рая никогда не выполнится. Программисту необходимо тщательно
проектировать прикладные программы и благоразумно задавать
уровни приоритетов, чтобы избежать такой ситуации. Далее будет
показано, как избежать «зависания» низкоприоритетных задач, ис-
пользуя механизм событий для управления ходом их выполнения.
Следует отметить, что FreeRTOS позволяет динамически менять
приоритет задачи во время выполнения программы. Для получе-
ния и задания приоритета задачи во время выполнения служат API-
функции
uxTaskPriorityGet() и
vTaskPrioritySet() соответственно.
Подсистема времени FreeRTOS
Подробнее остановимся на системном кванте времени. Планировщик
получает управление каждый квант времени, это происходит по преры-
ванию от таймера. Продолжительность системного кванта определяется
периодом возникновения прерываний от таймера и задается в файле
FreeRTOSConfig.h макроопределением
configTICK_RATE_HZ.
configTICK_RATE_HZ определяет частоту отсчета системных
квантов в герцах, например значение
configTICK_RATE_HZ, равное
100 (Гц), определяет продолжительность системного кванта, равную
10 мс. Следует отметить, что в большинстве демонстрационных про-
ектов продолжительность системного кванта устанавливается равной
1 мс (
configTICK_RATE_HZ = 1000).
Все API-функции, связанные с измерением временных интерва-
лов, в качестве единицы измерения времени используют системный
квант. Используя макроопределение
portTICK_RATE_MS, можно
получить продолжительность системного кванта в миллисекундах.
Но для задания длительности кванта нужно использовать макро-
определение
configTICK_RATE_HZ.
Следует также упомянуть о счетчике квантов — это системная
переменная типа portTickType, которая увеличивается на едини-
цу по прошествии одного кванта времени и используется ядром
FreeRTOS для измерения временных интервалов. Значение счетчи-
ка квантов начинает увеличиваться после запуска планировщика,
то есть после выполнения функции
vTaskStartScheduler(). Текущее
значение счетчика квантов может быть получено с помощью API-
функции
xTaskGetTickCount().
Достарыңызбен бөлісу: