FreeRTOS-创建删除任务

FreeRTOSConfig.h文件用于配置FreeRTOS的功能和API,包括任务创建与删除。动态创建任务由FreeRTOS分配内存,而静态创建则需用户预先分配。vTaskDelete函数用于删除任务,从各种任务列表中移除并可能释放内存。
摘要由CSDN通过智能技术生成

1、FreeRTOSConfig.h文件:

FreeRTOSConfig.h配置文件作用:对FreeRTOS进行功能配置和裁剪,以及API函数的使能。
相关的宏可以分为三大类:

  • “INCLUDE”:配置FreeRTOS中可选的API函数;
  • “config”:完成FreeRTOS的功能配置和裁剪;
  • 其他配置项:PendSV宏定义、SVC宏定义。

2、任务创建与删除的API函数:

任务创建和删除的本质就是调用FreeRTOS的API函数:

  • xTaskCreate():动态方式创建任务
  • xTaskCreateStatic():静态方式创建任务
  • vtaskDelete():删除任务

(1)、动态创建任务:

任务的任务控制块以及任务的栈空间所需要的内存,均由FreeRTOS从FreeRTOS管理的堆中分配。

BaseType_t xTaskCreate( 
	TaskFunction_t pxTaskCode,//指向任务函数的指针
    const char * const pcName, //任务名称,最大长度configMAX_TASK_NAME_LEN
    const configSTACK_DEPTH_TYPE usStackDepth,//任务堆栈大小,注意字为单位
    void * const pvParameters,//传递给任务函数的参数
    UBaseType_t uxPriority,任务优先级,范围:0~configMAX_PRIORITIES-1
    TaskHandle_t * const pxCreatedTask //任务句柄,就是任务的任务控制块
);

返回值:
pdPASS:任务创建成功;
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任务创建失败

实现动态创建任务的流程:
  • a、将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1
  • b、定义函数入口参数
  • c、编写任务函数
    此函数创建的任务会立刻进入就绪态,由任务调度器调度运行
动态创建任务函数内部实现:
  • a、申请堆栈内存&任务控制块内存
  • b、TCB结构体成员赋值
  • c、添加新任务到就绪列表中
任务块结构体成员介绍:
typedef struct tskTaskControlBlock 
{
    volatile StackType_t * pxTopOfStack; //任务栈栈顶,必须为TCB的第一个成员
    ListItem_t xStateListItem; //任务状态列表项                
    ListItem_t xEventListItem;//任务时间列表项                  
    UBaseType_t uxPriority;//任务优先级,数值越大,优先级越大                     
    StackType_t * pxStack;//任务栈起始地址                     
    char pcTaskName[ configMAX_TASK_NAME_LEN ];//任务名字 
} tskTCB;

任务栈栈顶,在任务切换时的任务上下文保存、任务恢复息息相关,每个任务都有属于自己的任务控制块。

(2)、静态创建任务:

任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供。

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 //任务控制块指针,由用户分配
);

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

静态创建任务使用流程:

a、需将宏configSUPPORT_STATIC_ALLOCATION配置为1
b、定义空闲任务&定时器任务的任务堆栈以及TCB
c、实现两个接口函数:vApplicationGetldleTaskMemory()和vApplicationGetTimerTaskMemory()
d、定义函数入口参数
e、编写任务函数
此函数创建的任务会立刻进入就绪态,由任务调度器调度运行

静态创建内部实现:

a、TCB结构体成员赋值
b、添加新任务到就绪列表中

(3)、任务删除函数:

void vTaskDelete(TaskHandle_t xTaskToDelete);

形参:xTaskToDelete
描述:待删除任务的任务句柄
用于删除已被创建的任务,被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除。

删除任务流程:

a、使用删除任务函数,需将宏INCLUDE_vTaskDelete配置为1
b、入口参数输入需要删除的任务句柄(NULL代表删除本身)

内部实现过程:

a、获取所要删除任务的控制块:通过传入的任务句柄,判断所要删除哪个任务,NULL代表删除自身;
b、将被删除任务,移除所在列表:将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表;
c、判断所需要删除的任务:i、删除任务自身,须先添加到等待删除列表,内存释放将在空闲任务执行;ii、删除其他任务,释放内存,任务数量等
d、更新下个任务的阻塞时间:更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值