2. Создание задач и приоритеты

Рассмотрим принцип создания задачи в ОС РВ FreeRTOS

Для создания задачи необходимо включить и настроить «системные тики» FreeRTOS (немного отличается на разных микроконтроллерах):

1-написать «тело» задачи, например:

void vTaskCode(void *pvParameters)
{
  //variables init (if necessary)
  for(;;) //while(1)
  {
   //Code
  }
}

В функции main произвести создание
xTaskCreate( vTaskCode, «vTaskCode_user», STACK_SIZE, (void*) &xParameter, TASK_PRIORITY, &xHandle);

2-В функции main произвести создание (выделение стека и добавление с планировщик) задачи
xTaskCreate(vTaskCode, "vTaskCode_user", 128, NULL, 1, NULL);

В данном случае создается задача, под которую выделено 128*4=512 Байт на стеке, в которой будет выполняться функция vTaskCode. В отладочной информации она будет отображаться как vTaskCode_user.

Сигнатура функции для добавления задач:
xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask)
Где: pvTaskCode- имя функции, которая вызывается в задаче
pcName — пользовательское имя функции
usStackDepth- глубина стека (в словах-uint32)
pvParameters — параметры, передаваемые в функцию
uxPriority- приоритет
pxCreatedTask -хендл созданной задачи

Поговорим подробнее о приоритетах:
Как понятно из названия приоритет определяет степень «важности» задачи.
Предел приоритетов установлен макроопределением configMAX_PRIORITIES в ОС РВ,
0 (самый низкий приоритет), 1, 2, 3, … (configMAX_PRIORITIES-1) (наивысший приоритет).
Обычно configMAX_PRIORITIES установлен равным 5.

Во введении мало рассказывалось про приоритеты задач (и все задачи выполнялись последовательно 1->2->3->1…), но если изменить у задачи приоритет и сделать например 1-ю задачу более приоритетной, то сразу как только она перейдет в состояние «готова к выполнению» — она станет первой в очереди на выполнение, отодвинув остальные задачи и будет выполнятся всегда, «отодвинув» другие задачи.
Следовательно, при отсутствии спящего режима (osDelay) у высокоприоритетной задачи она будет блокировать выполнение остальных — для «борьбы» с этим придуманы механизмы ограничения и перераспределения доступа к ресурсам системы.

Задача бездействия -IDLE task
В ОСРВ можно включить IDLE task — задача «бездействия» — в эту задачу система попадает если нет текущих задач к выполнению.
Крайне удобно в idle task закладывать режимы снижения энергопотребления (переводить м/к в сон, снижать частоту тактирования и тд.)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *