При создании задач часто может возникать ситуация — когда требуется несколько задач с похожим функционалом (отличающихся несколькими константами или условиями)
Чтобы не создавать лишние задачи с повторением функционала — можно использовать параметры.
Как мы помним при создании задачи используется «тело» функции
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.
Данный механизм удобен при работе с одинаковыми потребителями т.к. упрощает создание задач и уменьшает объем выделяемой памяти.