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 2U4. 添加任务索引
在 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);
}完成前面五步后,任务会在系统启动时自动创建。