3. Создание задач c параметром

При создании задач часто может возникать ситуация — когда требуется несколько задач с похожим функционалом (отличающихся несколькими константами или условиями)
Чтобы не создавать лишние задачи с повторением функционала — можно использовать параметры.

Как мы помним при создании задачи используется «тело» функции

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

и потом создается задача
xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask)
Где: pvParameters — параметры, передаваемые в функцию

В качестве параметров мы можем передать указатель на структуру с «различающимися в задачах данными»
В результате получим примерно следующее:

typedef struct
{
  //parameters
} pParam;
pParam prm1, prm2;

В теле функции приводим указатель типа void к нашей структуре и используем его в коде

void vTaskCode(void *pvParameters)
{
  //variables init (if necessary)
  pParam *prm = (pParam*) pvParameters;
  for(;;) //while(1)
  {
   //Code use prm1/prm2
   //Code
  }
}

И создаем например 2 задачи

xTaskCreate(vTaskCode, "task1", 256,  (void *) &prm1, 1, NULL);
xTaskCreate(vTaskCode, "task2", 256,  (void *) &prm2, 1, NULL);

Важно отметить — имя вызываемой функции у них одинаковое (vTaskCode), но разные пользовательские имена (task1 и task2) и разные параметры.
За счет этого на стеке будет хранится «тело» функции vTaskCode и параметры prm1, и prm2 (и немного системного кода)
и будут работать 2-е независимые задачи, использующие один и тот же набор инструкций из тела функции vTaskCode.

Данный механизм удобен при работе с одинаковыми потребителями т.к. упрощает создание задач и уменьшает объем выделяемой памяти.

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

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