5.3 使用任务参数
2026/3/31大约 2 分钟
示例2:使用任务参数
在 FreeRTOS 中,多个任务可以使用同一个任务函数。
这些任务之所以能够表现出差别,主要有两个原因:
- 每个任务的栈空间不同
- 创建任务时可以传入不同的参数
在这个例子中,多个任务使用同一个函数,但是通过传入不同的参数,在 LCD 上打印不同的信息。
1 定义任务参数结构体
代码中先定义了一个结构体:
struct DisplayInfo {
int x;
int y;
const char *str;
};这个结构体用来保存任务的显示信息,包括:
x:LCD 显示的横坐标y:LCD 显示的纵坐标str:要显示的字符串
也就是说,不同任务只要传入不同的 DisplayInfo,就可以在不同位置显示不同内容。
2 任务函数如何使用参数
任务函数如下:
void vTaskFunction(void *pvParameters)
{
struct DisplayInfo *info = pvParameters;
uint32_t cnt = 0;
uint32_t len;
for( ;; )
{
len = LCD_PrintString(info->x, info->y, info->str);
LCD_PrintSignedVal(len+1, info->y, cnt++);
mdelay(500);
}
}这里最关键的一句是:
struct DisplayInfo *info = pvParameters;它表示把传进来的参数 pvParameters 转换为 DisplayInfo 结构体指针。
这样任务函数就可以通过 info->x、info->y、info->str 访问当前任务自己的参数。
所以,同一个函数虽然代码一样,但因为每个任务拿到的参数不同,最终显示效果就不同。
3 pvParameters 从哪里来
pvParameters 并不是任务函数内部自己产生的,
它是在创建任务时,由 xTaskCreate() 的第 4 个参数传进来的。
例如:
xTaskCreate(LcdPrintTask, "task1", 128, &g_Task1Info, osPriorityNormal, NULL);
xTaskCreate(LcdPrintTask, "task2", 128, &g_Task2Info, osPriorityNormal, NULL);
xTaskCreate(LcdPrintTask, "task3", 128, &g_Task3Info, osPriorityNormal, NULL);这里:
task1传入的是&g_Task1Infotask2传入的是&g_Task2Infotask3传入的是&g_Task3Info
因此,虽然这 3 个任务执行的都是同一个函数 LcdPrintTask,但是它们拿到的参数不同,所以显示内容不同。
4 本例的核心思想
这个例子说明了:
同一个任务函数可以作为多个任务的公共入口,不同任务之间的差别可以通过任务参数来体现。
也就是说:
- 任务函数相同
- 传入参数不同
- 最终任务行为不同
这是 FreeRTOS 中非常常见的一种写法。
5 小结
在使用 xTaskCreate() 创建任务时,第 4 个参数会传递给任务函数的参数 pvParameters。
因此,不同任务即使使用同一个任务函数,只要传入不同的参数,就可以实现不同的功能表现。
这个例子中,多个任务通过传入不同的显示坐标和字符串,实现了在 LCD 不同位置打印不同信息的效果。
