LiteOS-M 任务
LiteOS-M 是面向物联网、嵌入式的轻量级实时操作系统(RTOS),任务 是系统调度的最小单元,你提供的 LOS_TaskCreate/LOS_TaskDelete 是任务创建、删除的核心API,下面给你完整、通俗的任务说明,包含使用规则、参数、流程、注意事项。
哔站视频《03:RK2206 鸿蒙 LiteOS 如何通过控制编译选项编译不同案例》:https://www.bilibili.com/video/BV15e5J6QEGY/?spm_id_from=333.1387.homepage.video_card.click&vd_source=3a9dd7a328acafb09dd1b8d05f3e2bf7
哔站视频《02:RK2206 鸿蒙 LiteOS bin 文件 烧写》:https://www.bilibili.com/video/BV1pcRdBaEAt/?spm_id_from=333.1387.homepage.video_card.click&vd_source=3a9dd7a328acafb09dd1b8d05f3e2bf7
哔站视频《01:RK2206 鸿蒙 LiteOS ubuntu 开发环境 全程 安装配置》:https://www.bilibili.com/video/BV1nrRkBoEMR/?spm_id_from=333.1387.homepage.video_card.click&vd_source=3a9dd7a328acafb09dd1b8d05f3e2bf7
一、LiteOS-M 任务基础概念
-
任务状态
任务创建后默认进入 就绪态(Ready) ,系统按优先级抢占式调度 :高优先级任务优先执行,同优先级按时间片轮转。
核心状态流转:
创建 → 就绪 → 运行 → 阻塞/挂起 → 就绪 → 运行 → 删除 -
任务优先级
- 数值越小优先级越高;
- 系统保留空闲任务(IDLE),优先级最低,禁止删除/修改;
- 软件定时器任务也受系统保护,不能随意操作。
-
任务栈
每个任务必须独立分配栈空间,用于保存上下文、局部变量、函数调用栈,栈大小配置不足会导致栈溢出、系统崩溃。
二、核心API 完整详解
1. LOS_TaskCreate 创建任务
c
UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *taskInitParam);
作用
创建任务 → 分配TCB(任务控制块)和栈 → 任务进入就绪队列 → 触发调度。
关键:TSK_INIT_PARAM_S 任务初始化参数
这是创建任务的核心结构体,必须完整配置,常用成员:
c
typedef struct {
CHAR *pcName; // 任务名称(不能为空)
TASK_ENTRY_PTR pfnTaskEntry; // 任务入口函数(函数指针,不能为空)
UINT32 uwArg; // 任务入口函数的入参
UINT16 usPriority; // 任务优先级
UINT32 uwStackSize; // 任务栈大小(字节)
UINT32 uwStackAddr; // 任务栈起始地址(为0则系统自动分配)
UINT32 uwReserved; // 保留参数
} TSK_INIT_PARAM_S;
返回值说明
LOS_OK:创建成功- 其他均为失败,常见原因:
- 指针为空(taskID/参数结构体/任务名/入口函数)
- 优先级非法
- 栈大小过大/过小
- 系统无空闲TCB、内存不足
2. LOS_TaskDelete 删除任务
c
UINT32 LOS_TaskDelete(UINT32 taskID);
作用
删除指定任务 → 释放任务栈、TCB资源 → 从系统队列移除。
严格限制
- 绝对不能删除空闲任务(IDLE Task)
- 不能删除软件定时器任务
- 只能删除已创建的有效任务
返回值说明
LOS_OK:删除成功- 失败:操作空闲任务/软件定时器任务、任务ID非法、任务未创建
三、标准使用示例
c
/*
* Copyright (c) 2022 FuZhou Lockzhiner Electronic Co., Ltd. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "los_task.h"
#include "ohos_init.h"
/***************************************************************
* 函数名称: task_one
* 说 明: 线程函数1
* 参 数: 无
* 返 回 值: 无
***************************************************************/
void task_one()
{
while (1)
{
printf("This is %s\n", __func__);
LOS_Msleep(1000);
}
}
/***************************************************************
* 函数名称: task_two
* 说 明: 线程函数2
* 参 数: 无
* 返 回 值: 无
***************************************************************/
void task_two()
{
while (1)
{
printf("This is %s\n", __func__);
LOS_Msleep(2000);
}
}
/***************************************************************
* 函数名称: task_example
* 说 明: 内核任务例程
* 参 数: 无
* 返 回 值: 无
***************************************************************/
void task_example()
{
unsigned int thread_id1;
unsigned int thread_id2;
TSK_INIT_PARAM_S task1 = {0};
TSK_INIT_PARAM_S task2 = {0};
unsigned int ret = LOS_OK;
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)task_one;
task1.uwStackSize = 2048;
task1.pcName = "Task_One";
task1.usTaskPrio = 24;
ret = LOS_TaskCreate(&thread_id1, &task1);
if (ret != LOS_OK)
{
printf("Falied to create Task_One ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)task_two;
task2.uwStackSize = 2048;
task2.pcName = "Task_Two";
task2.usTaskPrio = 25;
ret = LOS_TaskCreate(&thread_id2, &task2);
if (ret != LOS_OK)
{
printf("Falied to create Task_Two ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(task_example);

四、注意事项
-
任务入口函数必须是死循环
任务函数不能执行完直接退出,否则会导致系统异常,必须用
while(1)+ 延时/阻塞。 -
禁止在中断服务函数中调用任务创建/删除
这两个API是任务级API,中断中调用会直接导致系统崩溃。
-
栈大小必须合理配置
- 过小:栈溢出 → 死机/数据损坏
- 过大:浪费内存
建议:简单任务 512~1024 字节,复杂任务 2048 字节以上。
-
任务创建成功后不要随意修改ID
任务ID是系统分配的唯一标识,手动修改会导致操作错误任务。
-
资源释放
任务删除前,必须先释放该任务占用的信号量、队列、内存等资源,避免内存泄漏。
-
结构体初始化
创建任务前,必须初始化
TSK_INIT_PARAM_S结构体,避免未定义行为,TSK_INIT_PARAM_S task1 = {0};
五、任务生命周期总结
- 创建 :
LOS_TaskCreate→ 就绪态 - 运行:被调度器选中执行
- 阻塞:延时、等待信号量/队列等
- 唤醒:阻塞结束 → 回到就绪态
- 删除 :
LOS_TaskDelete→ 销毁任务,释放资源
总结
LOS_TaskCreate是LiteOS-M任务创建唯一入口,必须正确配置TSK_INIT_PARAM_S参数;LOS_TaskDelete只能删除普通用户任务,严禁删除空闲任务、软件定时器任务;- 任务函数必须死循环+阻塞,栈大小合理配置,中断中禁止调用任务API。