多个任务使用同一个函数,怎么体现他们的差别?
1.栈不同
2.创建任务时可以传入不同的参数
下面是一个使用相同任务函数创建多个任务的框架示例,以及对它的解释:
#include "FreeRTOS.h"
#include "task.h"
// 任务函数原型,接受一个指向参数的指针
void vCommonTaskFunction(void *pvParameters);
// 任务参数结构体
typedef struct {
int taskNumber;
} TaskParams_t;
// 任务函数实现
void vCommonTaskFunction(void *pvParameters) {
TaskParams_t *pxParams = (TaskParams_t *)pvParameters;
for (;;) {
// 使用参数执行任务特定的操作
vTaskDelay(pdMS_TO_TICKS(1000)); // 示例:每个任务延迟1秒
printf("Task %d is running.\n", pxParams->taskNumber);
}
}
// 主函数
int main(void) {
// 任务参数
TaskParams_t Task1Params = { .taskNumber = 1 };
TaskParams_t Task2Params = { .taskNumber = 2 };
// 创建任务
xTaskCreate(vCommonTaskFunction, "Task 1", configMINIMAL_STACK_SIZE, &Task1Params, tskIDLE_PRIORITY, NULL);
xTaskCreate(vCommonTaskFunction, "Task 2", configMINIMAL_STACK_SIZE, &Task2Params, tskIDLE_PRIORITY, NULL);
// 启动调度器
vTaskStartScheduler();
// 如果调度器启动,将永远不会到达这里
for (;;);
return 0;
}
解释
-
任务函数:
vCommonTaskFunction
是所有任务共享的任务函数。它接受一个void*
类型的参数,这个参数指向一个TaskParams_t
结构体,里面包含了任务特定的参数(在这个例子中是taskNumber
)。 -
任务参数结构体:
TaskParams_t
是一个自定义的结构体,用于传递任务特定的参数。在这个例子中,它包含一个taskNumber
成员,用于区分不同的任务。 -
创建任务:在
main
函数中,我们为两个任务创建了两个不同的TaskParams_t
实例,分别为Task1Params
和Task2Params
,并给它们设置了不同的taskNumber
。然后,我们使用xTaskCreate
函数创建了两个任务,都指向同一个任务函数vCommonTaskFunction
,但是传递了不同的参数。 -
启动调度器:使用
vTaskStartScheduler
函数启动FreeRTOS的调度器,开始执行创建的任务。 -
任务执行:在
vCommonTaskFunction
中,每个任务都会无限循环地执行。任务会根据传递的参数执行特定的操作,并打印出任务编号。vTaskDelay
函数用于让任务延迟一段时间,模拟任务的工作。
通过这种方式,你可以使用同一个任务函数创建多个任务,并通过传递不同的参数来控制每个任务的行为。这种模式在需要创建大量相似任务时非常有用,可以减少代码的重复,并提高代码的可维护性。