19 小凌派 rk2206 鸿蒙 LiteOS-M 任务详解

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 任务基础概念

  1. 任务状态

    任务创建后默认进入 就绪态(Ready) ,系统按优先级抢占式调度 :高优先级任务优先执行,同优先级按时间片轮转。

    核心状态流转:
    创建 → 就绪 → 运行 → 阻塞/挂起 → 就绪 → 运行 → 删除

  2. 任务优先级

    • 数值越小优先级越高
    • 系统保留空闲任务(IDLE),优先级最低,禁止删除/修改;
    • 软件定时器任务也受系统保护,不能随意操作。
  3. 任务栈

    每个任务必须独立分配栈空间,用于保存上下文、局部变量、函数调用栈,栈大小配置不足会导致栈溢出、系统崩溃


二、核心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资源 → 从系统队列移除。

严格限制
  1. 绝对不能删除空闲任务(IDLE Task)
  2. 不能删除软件定时器任务
  3. 只能删除已创建的有效任务
返回值说明
  • 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);

四、注意事项

  1. 任务入口函数必须是死循环

    任务函数不能执行完直接退出,否则会导致系统异常,必须用 while(1) + 延时/阻塞。

  2. 禁止在中断服务函数中调用任务创建/删除

    这两个API是任务级API,中断中调用会直接导致系统崩溃。

  3. 栈大小必须合理配置

    • 过小:栈溢出 → 死机/数据损坏
    • 过大:浪费内存
      建议:简单任务 512~1024 字节,复杂任务 2048 字节以上。
  4. 任务创建成功后不要随意修改ID

    任务ID是系统分配的唯一标识,手动修改会导致操作错误任务。

  5. 资源释放

    任务删除前,必须先释放该任务占用的信号量、队列、内存等资源,避免内存泄漏。

  6. 结构体初始化

    创建任务前,必须初始化TSK_INIT_PARAM_S结构体,避免未定义行为,TSK_INIT_PARAM_S task1 = {0};


五、任务生命周期总结

  1. 创建LOS_TaskCreate → 就绪态
  2. 运行:被调度器选中执行
  3. 阻塞:延时、等待信号量/队列等
  4. 唤醒:阻塞结束 → 回到就绪态
  5. 删除LOS_TaskDelete → 销毁任务,释放资源

总结

  1. LOS_TaskCreate 是LiteOS-M任务创建唯一入口,必须正确配置TSK_INIT_PARAM_S参数;
  2. LOS_TaskDelete 只能删除普通用户任务,严禁删除空闲任务、软件定时器任务;
  3. 任务函数必须死循环+阻塞,栈大小合理配置,中断中禁止调用任务API。
相关推荐
阿钱真强道1 小时前
18 小凌派 rk2206 鸿蒙 liteos 如何通过修改配置文件,编译不通的案例
华为·鸿蒙·编译·案例·liteos·rk2206
nashane1 小时前
HarmonyOS 6学习:HWAsan监测开启后应用崩溃的终极解决方案
学习·华为·harmonyos·harmonyos 5
UnicornDev2 小时前
【Flutter x HarmonyOS 6】魔方计时APP——记录页面的UI设计
flutter·ui·华为·harmonyos·鸿蒙
纤纡.3 小时前
HarmonyOS 鸿蒙 ArkTS 实战:从零开发生肖集卡抽奖小程序
华为·小程序·harmonyos·deveco studio
枫叶丹43 小时前
【HarmonyOS 6.0】Data Augmentation Kit端侧问答模型:本地化智能问答的技术演进
开发语言·华为·harmonyos
C雨后彩虹4 小时前
猴子爬山问题
java·数据结构·算法·华为·面试
想你依然心痛4 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与Face AR & Body AR的“灵境直播间“——PC端沉浸式AR电商直播工作台
华为·ar·harmonyos·悬浮导航·沉浸光感
枫叶丹44 小时前
【HarmonyOS 6.0】Desktop Extension Kit 正式接棒原状态栏服务,API 引用路径全面更新
开发语言·华为·harmonyos
前端不太难5 小时前
鸿蒙 App 的 Task 架构设计
华为·状态模式·harmonyos