FreeRTOS 添加任务

← 返回 FreeRTOS | ← 主页


如果是快速开发,看原生 FreeRTOS 添加任务

在工程代码骨架的基础上,适用于已经搭建 OSAL、任务配置表和应用初始化入口的工程。

1. 声明任务函数

在任务模块的 .h 文件中声明:

void my_task(void *argument);

2. 定义任务函数

在任务模块的 .c 文件中定义:

void my_task(void *argument)
{
    (void)argument;
 
    /* 任务初始化 */
 
    for (;;)
    {
        /* 任务内容 */
        osal_task_delay_ms(10U);
    }
}

任务循环中必须加入延时、队列等待或信号量等待,不能一直占用 CPU。

3. 配置栈大小

在 rtos_config.h(对应MOC) 中添加:

#define CFG_TASK_MY_TASK_STACK_SIZE 256U
#define CFG_TASK_MY_TASK_PRIORITY   2U

4. 添加任务索引

在 user_task_reso_config.h(对应MOC) 的 user_task_idx_t 中添加,必须放在 USER_TASK_IDX_MAX 前面:

typedef enum
{
    /* 已有任务 */
    USER_TASK_IDX_MY_TASK,
    USER_TASK_IDX_MAX
} user_task_idx_t;

5. 加入任务配置表

在 user_task_reso_config.c(对应MOC) 中包含任务模块头文件:

#include "my_task.h"

再向 g_user_tasks[] 添加配置,顺序必须与 user_task_idx_t 一致:

user_task_config_t g_user_tasks[USER_TASK_IDX_MAX] =
{
    /* 已有任务 */
 
    /* 启用, 名称, 入口, 栈大小, 优先级, 参数, 句柄 */
    {true, "MyTask", my_task, CFG_TASK_MY_TASK_STACK_SIZE,
     CFG_TASK_MY_TASK_PRIORITY, NULL, NULL}
};

任务在哪里创建

不需要单独调用 my_task(),也不需要再写 xTaskCreate()。

user_init.c(对应MOC) 中的 user_app_init() 会调用 user_tasks_start():

status = user_tasks_start();

user_tasks_start() 在 user_task_reso_config.c(对应MOC) 中遍历 g_user_tasks[]:

for (index = 0U; index < USER_TASK_IDX_MAX; ++index)
{
    if (!g_user_tasks[index].enabled)
    {
        continue;
    }
 
    osal_task_create(g_user_tasks[index].name,
                     g_user_tasks[index].entry,
                     g_user_tasks[index].stack_depth,
                     g_user_tasks[index].priority,
                     &g_user_tasks[index].handle,
                     g_user_tasks[index].argument);
}

完成前面五步后,任务会在系统启动时自动创建。