六、任务管理_任务创建与删除

本文详细解释了在FreeRTOS中任务的概念,包括任务函数的定义、注意事项、动态和静态方式创建任务的API、栈的使用以及任务的删除。通过实例演示了如何使用xTaskCreate和vTaskDelete等函数进行任务管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是任务

(1)在FreeRTOS中,任务就是一个函数,原型如下。

void ATaskFunction( void *pvParameters );

(2)注意点。

  • 任务这个函数不能返回。
  • 同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数。
  • 函数内部,尽量使用局部变量:每个任务都有自己的栈,每个任务运行这个函数时,任务A的局部变量放在任务A的栈里、任务B的局部变量放在任务B的栈里。不同任务的局部变量,有自己的副本。
  • 函数使用全局变量、静态变量的话。只有一个副本:多个任务使用的是同一个副本,要防止冲突。

(3)示例。

void ATaskFunction( void *pvParameters )
{
    /* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */
    int32_t lVariableExample = 0;
    /* 任务函数通常实现为一个无限循环 */
    while(1)
    {
        /* 任务的代码 */
    } 

 
   /* 如果程序从循环中退出,一定要使用vTaskDelete删除自己
    * NULL表示删除的是自己
    */
    vTaskDelete( NULL );

    /* 程序不会执行到这里, 如果执行到这里就出错了 */
}

2、任务创建与删除相关API函数

(1)可以参考官网,现在是中文了,阅读方便。FreeRTOS API categories

(2)FreeRTOS中用于创建和删除任务的API函数如下表所示:

函数描述
xTaskCreate()动态方式创建任务
xTaskVreateStatic()静态方式创建任务
vTaskDelete()删除任务

3、动态方式创建任务

(1)创建任务时使用函数如下:

BaseType_t xTaskCreate( 
    TaskFunction_t pxTaskCode,                   // 函数指针,任务函数  
    const char * const pcName,                   // 任务的名字 
    const configSTACK_DEPTH_TYPE usStackDepth,   // 栈大小,单位world,10表示40字节
    void * const pvParameters,                   // 调用任务时传入的参数
    UBaseType_t uxPriority,                      // 优先级
    TaskHandle_t * const pxCreatedTask )         //任务句柄,以后使用它来操作这个任务

(2)参数说明

参数描述
pvTaskCode函数指针,可以简单地认为任务就是一个C函数。
它稍微特殊一点:永远不退出,或者退出时要调用"vTaskDelete(NULL)"
pcName任务的名字,FreeRTOS内部不使用它,仅仅起调试作用。
长度为:configMAX_TASK_NAME_LEN
usStackDepth每个任务都有自己的栈,这里指定栈大小。
单位是word,比如传入100,表示栈大小为100 word,也就是400字节。
最大值为uint16_t的最大值。
怎么确定栈的大小,并不容易,很多时候是估计。
精确的办法是看反汇编码。
pvParameters调用pvTaskCode函数指针时用到:pvTaskCode(pvParameters)
uxPriority优先级范围:0~(configMAX_PRIORITIES – 1)
数值越小优先级越低,
如果传入过大的值,xTaskCreate会把它调整为(configMAX_PRIORITIES – 1)
pxCreatedTask用来保存xTaskCreate的输出结果:task handle。
以后如果想操作这个任务,比如修改它的优先级,就需要这个handle。
如果不想使用该handle,可以传入NULL。
返回值成功:pdPASS;
失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因只有内存
不足)
注意:文档里都说失败时返回值是pdFAIL,这不对。
pdFAIL是0,errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY是-1。

4、静态方式创建任务

(1)静态方式创建任务函数原型如下:

TaskHandle_t xTaskCreateStatic( 
        TaskFunction_t pxTaskCode,
        const char * const pcName,
        const uint32_t ulStackDepth,
        void * const pvParameters,
        UBaseType_t uxPriority,
        StackType_t * const puxStackBuffer,
        StaticTask_t * const pxTaskBuffer );

(2)参数说明

参数描述
pxTaskCode指向任务函数的指针
pcName任务的描述性名称
ulStackDepth任务堆栈大小,单位:字
pvParameters传递给任务函数的参数
uxPriority  任务优先级
puxStackBuffer任务栈指针,内存由用户分配提供
pxTaskBuffer

任务控制块指针,内存由用户分配提供

(3)返回值

返回值描述
NULL用户没有提供相应的内存,任务创建失败
其他值任务句柄,任务创建成功

5、删除任务

(1)删除任务时使用函数如下:

void vTaskDelete( TaskHandle_t xTaskToDelete );

(2)参数说明:

参数描述
pvTaskCode任务句柄,使用xTaskCreate创建任务时可以得到一个句柄。
也可传入NULL,这表示删除自己。

(3)删除任务举例:

  • 自杀: vTaskDelete(NULL)
  • 被杀:别的任务执行 vTaskDelete(pvTaskCode) ,pvTaskCode是自己的句柄
  • 杀人:执行 vTaskDelete(pvTaskCode) ,pvTaskCode是别的任务的句柄

6、示例程序

(1)示例1:FreeRTOS移植详解_基于HAL库工程_朱嘉鼎的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码织梦师小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值