FreeRTOS函数说明

4.1.1动态创建任务函数

1)函数说明

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

返回值说明如下:

pdPASS:任务创建成功。

errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任务创建失败。

2)动态创建任务步骤

(1)将宏configSUPPORT_DYNAMIC_ALLOCATION 配置为 1。

(2)定义函数入口参数。

(3)编写任务函数。

此函数创建的任务会立刻进入就绪态,由任务调度器调度运行。

3)动态创建任务函数内部实现

(1)申请堆栈内存&任务控制块内存。

(2)TCB结构体成员赋值。

(3)添加新任务到就绪列表中。

任务控制块结构体成员介绍。

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;

4.1.2静态创建任务函数

1)函数说明

cpp 复制代码
TaskHandle_t xTaskCreateStatic
( 
    TaskFunction_t pxTaskCode,          /* 指向任务函数的指针 */
    const char * const pcName,          /* 任务函数名 */
    const uint32_t ulStackDepth,        /* 任务堆栈大小,单位是4字节 */
    void * const pvParameters,          /* 传递的任务函数参数 */
    UBaseType_t uxPriority,             /* 任务优先级 */
    StackType_t * const puxStackBuffer, /* 任务堆栈,一般为数组,由用户分配 */
    StaticTask_t * const pxTaskBuffer   /* 任务控制块指针,由用户分配 */
)

返回值如下:

NULL:用户没有提供相应的内存,任务创建失败。

其他值:任务句柄,任务创建成功。

2)静态创建任务步骤

(1)将宏configSUPPORT_STATIC_ALLOCATION 配置为 1。

(2)定义空闲任务&定时器任务的任务堆栈及TCB。

(3)实现接口函数:

vApplicationGetIdleTaskMemory()

vApplicationGetTimerTaskMemory()(如果开启软件定时器)

(4)定义函数入口参数。

(5)编写任务函数。

此函数创建的任务会立刻进入就绪态,由任务调度器调度运行。

3)静态创建内部实现

(1)TCB结构体成员赋值

(2)添加新任务到就绪列表中

相关推荐
qq_401700415 天前
FreeRtos——9、状态机(FSM)与面向对象在 RTOS 中的使用
freertos
济6175 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
嵌入式×边缘AI:打怪升级日志5 天前
基于ESP32S3的智能终端项目--5.显示时间和天气功能
笔记·esp32·freertos·天气·日历
嵌入式×边缘AI:打怪升级日志5 天前
基于ESP32S3的智能终端项目--4.1 FreeRTOS 任务调度&&设置屏幕亮度
freertos·屏幕亮度
炸膛坦客6 天前
FreeRTOS 学习:(二十九)任务切换的底层逻辑(了解)
单片机·操作系统·freertos
qq_401700416 天前
FreeRtos——1、多任务与“上下文切换”的代价
freertos
螺丝钉的扭矩一瞬间产生高能蛋白6 天前
深入剖析FreeRTOS优先级继承机制:vTaskPriorityInherit与xTaskPriorityDisinherit源码解析
stm32·freertos·嵌入式软件·优先级反转
济6176 天前
FreeRTOS基础知识---为什么使用FreeRTOS以及其核心功能
嵌入式·freertos
炸膛坦客7 天前
FreeRTOS 学习:(二十八)任务调度器 + 启动第一个任务(了解)
stm32·单片机·操作系统·freertos
炸膛坦客7 天前
FreeRTOS 学习:(二十七)死等延时函数会对任务调度产生什么影响
stm32·操作系统·freertos