13.3.4 任务创建

更新于 2026年10月10日 版权声明
13.3.4 任务创建

1.动态任务创建函数xTaskCreate()

FreeRTOS中动态任务创建函数为xTaskCreate(),创建任务即把一个任务代码、任务堆栈和任务控制块联系在一起。xTaskCreate()函数形式如下。

图示

参数功能如下。

①pxTaskCode:创建的任务函数名称。

②pcName:任务的名字,字符串型,由用户自定义。

③usStackDepth:任务堆栈大小,设得太小任务可能无法运行。

④pvParameters:任务函数的参数,如果不需要传参,设为NULL即可。

⑤uxPriority:任务优先级,范围为0~(configMAX_PRIORITIES-1)。

⑥pxCreatedTask:任务句柄,实际是一个指针,也是任务的任务堆栈。

返回参数功能如下。

•pdPASS:数值为1,表示任务创建成功,且被添加到就绪列表。

•pdFAIL:数值为0,表示任务创建失败。

例如,xTaskCreate(Task1_led,"Task1",64,NULL,1,NULL)表示任务函数为Task1_led,设置的任务名字为Task1,任务堆栈大小为64字节,无任务参数,优先级为1,任务堆栈自动分配。

任务创建函数xTaskCreate()的原型如下。

图示

图示

主要语句功能如下。

①使用函数pvPortMalloc()给任务的任务堆栈申请内存。

②和③为堆栈的内存申请。如果堆栈的内存申请成功,就给任务控制块申请内存,并将任务控制块成员任务堆栈初始化(任务控制块有6个重要的成员,已初始化1个)。

④标记任务堆栈和任务控制块是使用动态分配方法得到的。

⑤通过函数prvIni tialiseNewTask()初始化任务,这个函数完成对任务控制块中各个字段的初始化。

⑥通过函数prvAddNewTaskToReadyList()将新创建的任务加入就绪列表中。(https://www.daowen.com)

2.任务控制块初始化函数

prvIni tialiseNewTask()函数内容较多,下面将主要部分的功能进行介绍,完整函数请读者参见官网代码。

图示

图示

主要语句功能如下。

①pxTopOfStack:计算堆栈栈顶pxTopOfStack。

②pxNewTCB->pcTaskName:将任务名存储起来,并添加字符串结束符'\0'。

③pxNewTCB->uxPriority:初始化任务控制块的优先级字段uxPriority。

④pxNewTCB->xStateListItem:初始化任务控制块的状态列表项,这一句很重要。

⑤pxNewTCB->xEventListItem:初始化任务控制块的事件列表项。

⑥和⑧设置状态列表项xStateListItem和事件列表项xEventListItem属于当前任务的任务控制块,设置这两个列表项的字段pvOwner为新创建的任务的任务控制块,即pvOwner指向的是该任务的任务控制块,这两句也很重要。

⑦设置列表项xEventListItem的字段xItemValue=configMAX_PRIORITIES-uxPriority,如果当前任务优先级为3,最大优先级为32,那么xItemValue就为32-3=29,这就意味着xItemValue值越大,优先级就越小。

⑨pxNewTCB->pxTopOfStack:计算堆栈栈顶,调用函数pxPortInitialiseStack(),该函数和具体CPU有关,CPU不同,该函数就不同,需要在移植时编写。

⑩生成任务句柄,返回给参数pxCreatedTask,从这里可以看出任务句柄就是任务控制块。

3.堆栈初始化函数pxPortInitialiseStack()

任务堆栈的初始化通过pxPortInitialiseStack()函数完成。不同的CPU,其内核寄存器组织不一样,该函数需要在移植时修改,函数原型位于“prot.c”文件中,ARM Cortex-M3的堆栈初始化函数原型如下。

图示

ARM Cortex-M3的任务切换是通过PendSV的中断来实现的,发生中断后,8个寄存器自动入栈。这8个寄存器为R13(xPSR)、R15(PC)、R14(LR)、R12、R3~R0,其他的R11~R4寄存器需要手动压栈。因此,在堆栈初始化时,要明确寄存器的位置,初始化后的ARM Cortex-M3在堆栈中的结构如图13.9所示。

图示

图13.9 初始化后的ARM Cortex-M3在堆栈中的结构

通过xTaskCreate()函数创建任务后,就把任务三要素(任务控制块、任务堆栈和任务代码)联系在一起,如图13.10所示,以方便后续的管理。

图示

图13.10 任务三要素

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)