Разделив это значение на кол-во миллисекунд в 1 кванте portTICK_RATE_MS,
получим кол-во квантов периода, что и является аргументом vTaskDelayUntil().
Переменная xLastWakeTime автоматически модифицируется внутри vTaskDelayUntil(),
поэтому нет необходимости делать это в явном виде. */
vTaskDelayUntil( &xLastWakeTime, ( 50 / portTICK_RATE_MS ) );
}
}
Задача Бездействие
Пока на МК подано питание и он находится не в режиме энергос-
бережения, МК должен выполнять какой-либо код. Поэтому хотя бы
одна задача должна постоянно находиться в состоянии готовности
к выполнению. Однако, как показано в учебной программе № 2, мо-
жет сложиться ситуация, когда все задачи в программе могут быть
заблокированы.
В этом случае МК будет выполнять задачу Бездействие (Idle task).
Задача Бездействие создается автоматически при запуске плани-
ровщика API-функцией vTaskStartScheduler(). Задача Бездействие
постоянно находится в состоянии готовности к выполнению.
Ее приоритет задается макроопределением tskIDLE_PRIORITY как
самый низкий в программе (обычно 0). Это гарантирует, что задача
Бездействие не будет выполняться, пока в программе есть хотя бы
одна задача в состоянии готовности к выполнению. Как только поя-
вится любая готовая к выполнению задача, задача Бездействие будет
вытеснена ею.
Программисту предоставляется возможность добавить свою функ-
циональность в задачу Бездействие. Для этих целей есть возмож-
ность определить функцию-ловушку (Idle hook function, которая
является функцией обратного вызова — Callback function), реали-
зующую функциональность задачи Бездействие (далее будем назы-
вать ее функцией задачи Бездействие). Функция задачи Бездействие
отличается от функции, реализующей обычную задачу. Функция
задачи Бездействие не содержит бесконечного цикла, а автоматически
вызывается ядром FreeRTOS множество раз, пока выполняется задача
Бездействие, то есть ее тело помещается внутрь бесконечного цикла
средствами ядра.
Добавление своей функциональности в функцию задачи Бездейст-
вие окажется полезным в следующих случаях:
1. Для реализации низкоприоритетных фоновых задач.
2. Для измерения резерва МК по производительности. Во время вы-
полнения задачи Бездействие процессор не занят полезной рабо-
той, то есть простаивает. Отношение времени простоя процессора
ко всему времени выполнения программы даст представление о ре-
зерве процессора по производительности, то есть о возможности
добавить дополнительные задачи в программу.
3. Для снижения энергопотребления микроконтроллерного устрой-
ства. Во многих МК есть возможность перехода в режим пони-
женного энергопотребления для экономии электроэнергии.
Это актуально, например, в случае проектирования устройства с ба-
тарейным питанием. Выход из режима энергосбережения во многих
МК возможен по прерыванию от таймера. Если настроить МК так,
чтобы вход в режим пониженного энергопотребления происходил
в теле функции задачи Бездействие, а выход — по прерыванию
от того же таймера, что используется ядром FreeRTOS для форми-
рования квантов времени, то это позволит значительно понизить
энергопотребление устройства во время простоя процессора.
Есть некоторые ограничения на реализацию функции задачи
Бездействие:
1. Задачу Бездействие нельзя пытаться перевести в блокированное
или приостановленное состояние.
Достарыңызбен бөлісу: |