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



Pdf көрінісі
бет28/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   24   25   26   27   28   29   30   31   ...   129
Kurniz


Разделив это значение на кол-во миллисекунд в 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. Задачу Бездействие нельзя пытаться перевести в блокированное 
или приостановленное состояние.


Достарыңызбен бөлісу:
1   ...   24   25   26   27   28   29   30   31   ...   129




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

    Басты бет