第6章 LiteOS 操作系统及其移植

本章的核心是:LiteOS 是什么、它由哪些部分组成、LiteOS SDK 有什么作用,以及怎样把 LiteOS 移植到 STM32 工程中。


一、本章总体框架

这章可以分成四大块:

  1. LiteOS 操作系统概述
    • LiteOS 的来源;
    • LiteOS 的特点;
    • LiteOS 的 “1+N” 架构。
  2. LiteOS 内核
    • 基础内核;
    • 扩展内核;
    • 任务管理、内存管理、任务同步、任务通信、时间管理、中断管理。
  3. LiteOS SDK
    • Agent Lite SDK;
    • Agent Tiny SDK;
    • Huawei LiteOS SDK;
    • OS 适配层 OSAL。
  4. LiteOS 移植
    • 下载源码;
    • 添加内核文件;
    • 配置头文件;
    • 修改 target_config.h
    • 移除 SysTick 和 PendSV 中断;
    • 创建任务测试。

考试重点通常是:

LiteOS 架构、LiteOS 内核组成、LiteOS SDK 分类、Agent Lite 与 Agent Tiny 区别、OSAL 作用、LiteOS 移植流程、target_config.h 配置项。


二、LiteOS 是什么?

LiteOS 是华为面向物联网领域推出的轻量级物联网操作系统。

2015 年 5 月 20 日,华为在网络大会上发布 Huawei LiteOS。它遵循 BSD-3 开源许可协议,主要面向资源受限、低功耗、联网需求强的物联网设备。

LiteOS 的主要特点包括:

  1. 轻量级
  2. 低功耗
  3. 互联互通
  4. 组件丰富
  5. 快速开发
  6. 可裁剪
  7. 快速启动

它可以应用在:

  • 可穿戴设备;
  • 智能家居;
  • 车联网;
  • 城市公共服务;
  • 制造业;
  • 工业网关;
  • 智能传感器终端。

一句话理解:

LiteOS 是面向物联网终端设备的轻量级实时操作系统,它既提供 RTOS 内核能力,又提供物联网连接、安全、升级、传感器和端云协同能力。


三、LiteOS 的 “1+N” 架构

LiteOS 采用 “1+N” 架构

1. “1” 是 LiteOS 内核

这个 “1” 指 LiteOS 内核。

LiteOS 内核包括:

  • 基础内核;
  • 扩展内核。

内核主要负责物联网设备端的系统资源管理,例如:

  • 任务调度;
  • 内存管理;
  • 中断管理;
  • 时间管理;
  • 任务同步;
  • 任务间通信。

也就是说,内核是 LiteOS 的核心。


2. “N” 是多个中间件和功能框架

“N” 指多个中间件,包括:

  1. 互联互通框架;
  2. 传感器框架;
  3. 安全框架;
  4. JavaScript 框架;
  5. 运行引擎;
  6. 低功耗框架;
  7. OpenCPU 架构;
  8. SOTA 远程升级;
  9. 轻量级人工智能框架。

可以这样理解:

LiteOS 的内核负责“设备怎么运行”,中间件负责“设备怎么联网、怎么安全、怎么升级、怎么开发、怎么智能化”。


四、互联互通框架

互联互通框架是 LiteOS 中非常重要的部分。

它主要提供:

  • IP;
  • TCP;
  • UDP;
  • CoAP;
  • MQTT;
  • LwM2M;
  • mbed TLS;
  • LwIP 等协议栈。

作用是:

帮助终端设备接入物联网云平台,实现端云通信。

例如,一个传感器设备使用 LiteOS 后,可以通过 MQTT 或 LwM2M 协议把数据上传到华为 OceanConnect IoT 平台。

互联互通框架的意义在于:

  1. 降低开发门槛;
  2. 减少开发者自己写协议栈的工作;
  3. 实现不同设备之间互通;
  4. 支持设备快速接入云平台。

五、传感器框架

传感器框架主要面向各种传感器设备。

物联网设备中经常会连接很多传感器,例如:

  • 温度传感器;
  • 湿度传感器;
  • 加速度传感器;
  • 陀螺仪;
  • 光照传感器;
  • 气体传感器。

不同传感器硬件接口和数据格式可能不同。 如果每个传感器都单独开发,会非常麻烦。

LiteOS 传感器框架的作用是:

抽象不同类型传感器接口,屏蔽硬件细节,使应用层可以更方便地调用传感器能力。

传感器框架有三个主要特征:

  1. 实时传感器事件机制;
  2. 多传感器数据融合算法;
  3. 传感器管理。

1. 实时传感器事件机制

当传感器数据发生变化时,可以通过事件机制通知应用。

例如:

  • 温度超过阈值;
  • 姿态发生变化;
  • 加速度异常;
  • 光照强度变化。

这样应用不需要一直轮询传感器,可以提高效率。


2. 多传感器数据融合

有些应用需要多个传感器共同判断状态。

例如智能手环判断运动状态,可能需要:

  • 加速度传感器;
  • 陀螺仪;
  • 心率传感器。

传感器框架可以提供数据融合算法,让系统获得更准确的判断结果。


3. 传感器管理

传感器管理包括:

  • 传感器注册;
  • 传感器初始化;
  • 传感器数据读取;
  • 传感器状态维护;
  • 传感器事件处理。

六、安全框架

物联网设备通常连接云平台,并且可能部署在开放环境中,所以安全非常重要。

LiteOS 安全框架从三个方面覆盖物联网安全需求:

  1. 终端安全;
  2. 传输安全;
  3. 端云安全。

1. 终端安全

主要保证设备本身可信。

例如:

  • 防止非法固件运行;
  • 防止设备被恶意篡改;
  • 保护设备中的密钥和敏感数据。

2. 传输安全

主要保证数据在传输过程中不被窃听、篡改。

例如:

  • TLS;
  • DTLS;
  • mbed TLS;
  • 加密通信;
  • 身份认证。

3. 端云安全

主要保证终端和云平台之间的身份可信、通信可信。

例如:

  • 设备认证;
  • 云端认证;
  • 安全接入;
  • 访问控制;
  • 端云协同安全。

一句话总结:

LiteOS 安全框架要保证设备安全、通信安全和云端接入安全。


七、JavaScript 框架与运行引擎

LiteOS 支持 JavaScript 开发框架和轻量级 JavaScript 运行引擎。

这部分的意义是:

让物联网开发者可以使用更高级、更容易上手的语言开发应用,而不完全依赖 C 语言。

JavaScript 框架的优势包括:

  1. 简化跨硬件平台和中间件的系统集成;
  2. 用高级语言抽象隐藏底层编程细节;
  3. 可以兼容大量第三方库;
  4. JS 虚拟机提供基于语言的安全性;
  5. 常与运行引擎结合使用。

运行引擎则构建在 LiteOS 内核之上,为 JavaScript 提供运行时环境。


八、LiteOS Studio

LiteOS Studio 是 LiteOS 的集成开发环境。

它属于一站式开发工具,支持:

  • C;
  • C++;
  • 汇编等语言。

作用类似于 Keil、IAR 或其他嵌入式 IDE,但它更面向 LiteOS 和物联网应用开发。


九、低功耗框架

LiteOS 是轻量级物联网操作系统,最小内核尺寸仅为 6KB,具备快速启动和低功耗优势。

低功耗对物联网设备非常重要。

例如:

  • 智能水表;
  • 烟雾报警器;
  • 可穿戴设备;
  • 农业传感器;
  • 环境监测节点。

这些设备可能依靠电池供电,需要运行数月甚至数年。

LiteOS 低功耗框架可以配合:

  • Tickless;
  • 睡眠模式;
  • 外设关闭;
  • 动态时钟管理;
  • 低功耗调度。

十、OpenCPU 架构

OpenCPU 架构是为 LiteOS 小内核设计的,主要用于硬件资源受限的设备。

简单理解:

OpenCPU 让通信模组本身承担一部分主控功能,减少外部 MCU 的需求,从而降低成本和功耗。

它适合一些小型物联网终端,例如:

  • NB-IoT 模组设备;
  • 小型传感器;
  • 远程监测终端。

十一、SOTA 远程升级

PPT 中提到 SOTA 远程升级。

SOTA 可以理解为软件远程升级,类似 OTA。

它的特点是:

  1. 通过差分方式降低升级包大小;
  2. 适合低带宽网络;
  3. 适合电池供电设备;
  4. 差分合并算法对 RAM 要求较少;
  5. 满足海量低资源终端升级需求。

为什么差分升级重要?

因为物联网终端通常带宽低、功耗低、内存小。如果每次升级都传完整固件,代价很高。 差分升级只传变化部分,可以显著减少升级数据量。


十二、轻量级人工智能框架

PPT 中提到:

LiteOS + MindSpore Lite 面向物联网端侧提供轻量级 AI 解决方案。

它主要解决的问题是:

物联网端侧设备资源受限、算力低,但又需要部署 AI 推理能力。

例如:

  • 智能摄像头本地识别;
  • 可穿戴设备健康状态判断;
  • 工业传感器异常检测;
  • 智能家居语音或行为识别。

MindSpore Lite 可以帮助开发者把 AI 模型部署到端侧设备,实现轻量级推理。


十三、LiteOS 内核是什么?

PPT 中对内核的解释是:

内核是提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件,为系统其他部分提供系统服务。

在 LiteOS 中,内核是最核心的部分。

建立在 LiteOS 内核之上的完整系统,还包括:

  • 扩展中间件;
  • 安全框架;
  • SDK。

所以要区分:

名称 含义
LiteOS 内核 操作系统最核心部分,负责调度、内存、中断等
LiteOS 操作系统 内核 + 中间件 + 安全框架 + SDK 等完整系统

十四、LiteOS 内核的两个层次

PPT 中说 Huawei LiteOS 内核分为两个层次:

  1. 基础内核;
  2. 扩展内核。

1. 基础内核

基础内核提供 RTOS 特性。

主要能力包括:

  • 任务调度;
  • 内存管理;
  • 中断机制;
  • 队列管理;
  • 事件管理;
  • IPC 机制;
  • 时间管理;
  • 软定时器;
  • 双向链表等常用数据结构。

基础内核是考试重点。


2. 扩展内核

扩展内核提供更高级的能力。

PPT 中提到主要包括:

  • 运行-暂停机制;
  • 动态框架。

扩展内核可以理解为在基础 RTOS 能力之上增加的增强功能。


十五、LiteOS 基础内核的主要子系统

PPT 中说 LiteOS 基础内核具有 6 个主要子系统:

  1. 任务管理;
  2. 内存管理;
  3. 任务同步;
  4. 任务间通信;
  5. 时间管理;
  6. 中断和硬件定时器管理。

十六、任务管理

LiteOS 认为:

一个任务就是一个线程。

任务管理模块负责管理 CPU 资源调度,让多个任务能够合理使用 CPU。

任务管理模块提供的功能包括:

  • 任务创建;
  • 任务删除;
  • 任务延迟;
  • 任务挂起;
  • 任务恢复;
  • 锁定任务调度;
  • 解锁任务调度。

LiteOS 支持:

  1. 按优先级高低进行抢占调度;
  2. 同优先级任务采用时间片轮转调度。

1. 抢占调度

优先级高的任务可以抢占优先级低的任务。

例如:

  • 报警任务优先级高;
  • 数据上传任务优先级低。

当报警事件发生时,报警任务可以立即抢占 CPU 执行。


2. 时间片轮转

如果多个任务优先级相同,系统可以让它们轮流执行。

例如:

  • 任务 A 执行一个时间片;
  • 任务 B 执行一个时间片;
  • 任务 C 执行一个时间片。

这样可以保证同优先级任务公平运行。


十七、内存管理

LiteOS 在有限资源上提供静态内存和动态内存管理。

PPT 中提到支持的内存管理算法包括:

  1. 固定大小 BOX 算法;
  2. 动态申请 SLAB;
  3. DLINK 算法。

还提供:

  • 内存统计;
  • 内存越界检测。

1. 静态内存管理

静态内存管理通常在系统初始化或编译阶段确定内存分配。

特点:

  • 分配速度快;
  • 确定性强;
  • 不容易产生碎片;
  • 灵活性较差。

适合实时性要求高、内存大小固定的场景。


2. 动态内存管理

动态内存管理允许程序运行时申请和释放内存。

特点:

  • 灵活;
  • 适合复杂应用;
  • 可能产生内存碎片;
  • 分配时间可能不如静态方式确定。

十八、任务同步

任务同步是指:

多个任务通过特定机制控制执行顺序。

LiteOS 支持的同步机制包括:

  • 互斥锁;
  • 信号量。

如果没有同步,多个任务之间执行顺序可能混乱。


举例

假设任务 A 和任务 B 都要访问同一个串口。

如果没有同步机制,两个任务可能同时发送数据,导致串口输出混乱。

使用互斥锁后:

  1. 任务 A 先获得锁;
  2. 任务 B 等待;
  3. 任务 A 使用完串口后释放锁;
  4. 任务 B 再使用串口。

这就是任务同步。


十九、任务间通信 IPC

IPC 全称是:

Inter Process Communication,进程间通信。

在 LiteOS 中,IPC 用于任务之间交换信息。

PPT 中提到 LiteOS 支持 POSIX 规范中的标准 IPC 机制,也支持其他常用 IPC 机制。

常见 IPC 包括:

  • 队列;
  • 事件;
  • 信号量;
  • 互斥锁;
  • 消息队列。

任务间通信的作用是:

让不同任务之间可以传递数据、通知事件、协同工作。


二十、时间管理

LiteOS 时间管理包括:

  1. 系统时间;
  2. Tick 时间;
  3. 软件定时器。

1. 系统时间

系统时间由定时器或计数器产生的输出脉冲触发中断而产生。

简单理解:

硬件定时器周期性地产生中断,操作系统根据这些中断维护时间。


2. Tick

Tick 是操作系统调度的基本时间单位。

Tick 时长由:

  • 系统主频;
  • 每秒 Tick 数。

共同决定。

例如每秒 1000 个 Tick,则一个 Tick 是 1ms。

任务延时、时间片轮转、软件定时器都依赖 Tick。


3. 软件定时器

软件定时器是以 Tick 为单位的定时器功能。

当软件定时器超时时,会调用对应的超时处理函数。

PPT 中提到,软件定时器的超时处理函数在系统创建的 tick 软中断中被调用。


二十一、中断和硬件定时器管理

LiteOS 基础内核中硬件相关部分主要是:

  • 中断管理;
  • 硬件定时器管理。

中断用于响应外部事件,例如:

  • 串口接收;
  • 按键触发;
  • 定时器溢出;
  • 传感器报警。

硬件定时器用于产生系统节拍、计时、定时任务等。


二十二、LiteOS SDK 是什么?

SDK 是 Software Development Kit,软件开发工具包。

LiteOS SDK 的作用是:

帮助设备快速接入物联网平台,实现数据上报、命令接收、端云协同等功能。

PPT 中提到:

  • 支持 TCP/IP 协议栈的设备,可以集成 Agent Lite SDK 或 Agent Tiny SDK,直接与物联网平台通信;
  • 不支持 TCP/IP 协议栈的设备,例如蓝牙设备、ZigBee 设备,需要通过网关转发数据;
  • 智能设备可以集成 LiteOS 操作系统,并利用 LiteOS SDK 与平台通信。

二十三、Agent Lite SDK 与 Agent Tiny SDK(🌟)

这是考试重点。

PPT 中给出了二者区别。

SDK 类型 面向设备 支持协议
Agent Lite SDK 运算、存储能力较强的嵌入式设备,例如工业网关、采集器 HTTPS + MQTTS
Agent Tiny SDK 功耗、存储、计算资源受限的终端设备,例如单片机、芯片、模组 LwM2M over CoAP、MQTT

1. Agent Lite SDK

Agent Lite SDK 面向资源较强的设备。

例如:

  • 工业网关;
  • 数据采集器;
  • 边缘网关;
  • 具备较强计算和存储能力的嵌入式设备。

它支持 HTTPS + MQTTS,适合更复杂、更安全、更稳定的联网场景。


2. Agent Tiny SDK

Agent Tiny SDK 面向资源受限设备。

例如:

  • MCU;
  • 单片机;
  • 小型通信模组;
  • 电池供电终端;
  • 简单传感器节点。

它支持:

  • LwM2M over CoAP;
  • MQTT。

适合低功耗、小资源、轻量级通信场景。


二十四、Agent Tiny SDK 软件结构

PPT 中列出 Agent Tiny SDK 的软件结构,包括:

  1. 应用编程接口;
  2. 端云互通组件;
  3. 物联组件;
  4. 基础组件;
  5. OS 适配层;
  6. 硬件平台抽象层 HAL。

可以这样理解:

层次 作用
应用编程接口 给应用程序调用
端云互通组件 负责设备接入云平台
物联组件 提供物联网协议和功能
基础组件 提供基础功能支撑
OS 适配层 适配不同操作系统
HAL 屏蔽不同硬件差异

二十五、Agent Lite SDK 软件结构

Agent Lite SDK 架构包括:

  1. 应用编程接口;
  2. 数据上报;
  3. 命令接收;
  4. 回调监听;
  5. 端云互通;
  6. 日志收集;
  7. 子设备管理;
  8. 硬件平台抽象层 HAL。

它比 Agent Tiny 更适合网关类设备,因为网关可能需要管理多个子设备。

例如一个 ZigBee 网关可以接入多个 ZigBee 传感器,Agent Lite SDK 就可以帮助网关管理这些子设备并上报到云平台。


二十六、Huawei LiteOS SDK

Huawei LiteOS SDK 是部署在资源受限终端设备上的轻量级互联互通中间件。

用户只需要调用 API,就可以实现:

  • 设备快速接入物联网平台;
  • 数据上报;
  • 命令接收;
  • 端云协同。

它集成了:

  • MQTT;
  • LwM2M;
  • CoAP;
  • mbedtls;
  • LwIP。

并在这些协议栈之上提供开放 API。


二十七、LiteOS SDK 的结构

PPT 中说 LiteOS SDK 主要由三部分组成:

  1. 端云组件;
  2. LPWA 增强;
  3. IDE 集成开发环境。

其中端云组件又分为几个层次:

1. 开放 API 层

为应用程序定义通用接口。

开发者可以通过 API 快速完成:

  • 接入 OceanConnect IoT 平台;
  • 业务数据上报;
  • 下发命令处理。

2. 协议层

集成多种协议:

  • LwM2M;
  • CoAP;
  • DTLS;
  • TLS;
  • UDP。

3. 适配层

用于适配具体硬件平台。

包括:

  • 硬件随机数;
  • 内存管理;
  • 日志;
  • 数据存储;
  • 网络 Socket;
  • AT 命令适配。

二十八、两种应用场景

LiteOS SDK 针对两种场景提供不同软件架构:

  1. 单模组、单 MCU;
  2. 外置 MCU + 模组。

1. 单模组、单 MCU

这种场景下,设备本身具备主控和联网能力。

例如某些 NB-IoT 模组内部已经有 MCU,可以直接运行应用。


2. 外置 MCU + 模组

这种场景下,外置 MCU 是主控制器,负责连接传感器和执行业务逻辑;模组负责联网。

例如:

  • STM32 负责采集温度;
  • NB-IoT 模组负责上传云平台。

这时 LiteOS SDK 端云互通组件提供 AT 命令适配层,用于解析和发送 AT 命令。


二十九、SDK 源代码目录

PPT 中介绍了一些源码目录:

目录 作用
Doc 存放使用文档和 API 说明
Drivers 存放第三方 MCU 厂商 BSP 库
Iot_link SDK 重要目录,包含丰富组件
Compression_algo 存放 LZMA 压缩算法
Driver 存放驱动框架
Fs 存放文件系统
Inc 存放内核内部头文件
Network 存放网络适配和协议实现代码

其中最重要的是:

Iot_link 目录。

因为它包含了 SDK 中很多核心物联网组件。


三十、OSAL 操作系统抽象层

OSAL 全称是:

Operating System Abstract Layer,操作系统抽象层。

PPT 中专门问:为什么需要 OSAL?

原因是:

SDK 可能运行在不同操作系统上,例如 LiteOS、Linux、MacOS。为了让 SDK 不依赖某一个具体操作系统,需要把操作系统相关功能抽象出来。

OSAL 需要抽象的功能包括:

  • 任务创建;
  • 任务删除;
  • 互斥锁;
  • 信号量;
  • 内存管理;
  • 操作系统服务注册。

这样 SDK 的上层代码不用关心底层到底是 LiteOS 还是 Linux。


OSAL 的适配方法

PPT 中提到通过 osal_install 函数注册操作系统服务。

结构大意是:

typedef struct
{
    const char *name;       // 操作系统名,如 linux、macos
    const tag_os_ops *ops;  // 系统功能接口
} tag_os;

int osal_install(const tag_os *os);

osal_install 的作用是:

向抽象层注册具体操作系统的服务接口。

如果系统还没有注册,就把当前操作系统接口保存下来。


三十一、什么是 LiteOS 移植?

移植就是:

把 LiteOS 内核和相关配置适配到某一个具体硬件平台和工程环境中,使它能够在该硬件上正常运行。

例如把 LiteOS 移植到 STM32F103C8T6 开发板上,就是让 LiteOS 能够管理 STM32 上的任务、中断、内存、时间等资源。


三十二、为什么要移植?

因为 LiteOS 虽然提供了通用内核代码,但不同硬件平台有差异:

  • CPU 架构不同;
  • 中断向量不同;
  • 时钟配置不同;
  • RAM 大小不同;
  • 启动文件不同;
  • 外设驱动不同;
  • 编译器不同。

所以必须根据目标板进行适配。

一句话:

移植的目的,是让通用操作系统内核能够在具体硬件平台上正确运行。


三十三、移植前准备

PPT 中提到移植前需要下载 LiteOS 源码。

LiteOS 源码有两个版本:

  1. develop 版本;
  2. master 版本。

其中:

master 版本是最稳定的发布版本,官方建议使用 master 版本。

实际移植时,不需要把整个 LiteOS 源码都放进工程,否则工程代码量会太大。

只需要提取核心文件夹。


三十四、LiteOS 核心源码目录

PPT 中列出了几个核心目录。

1. arch

arch 是 CPU 架构相关代码。

例如 ARM Cortex-M 的:

  • 中断;
  • 调度;
  • Tick;
  • 上下文切换。

对于 STM32F103 这类 Cortex-M3 芯片,需要选择对应 cortex-m3 的架构代码。


2. kernel

kernel 是 LiteOS 内核代码。

包括:

  • 任务调度;
  • 队列;
  • 软件定时器;
  • 时间片;
  • 错误处理;
  • IPC;
  • 内存管理;
  • Tickless 等。

这是 LiteOS 移植的核心代码。


3. OS_CONFIG

OS_CONFIG 是内核配置文件目录。

里面的 target_config.h 非常重要。

它用于配置:

  • MCU 头文件;
  • 系统时钟;
  • Tick 数;
  • 任务数量;
  • 栈大小;
  • 信号量;
  • 互斥锁;
  • 队列;
  • 软件定时器;
  • 内存大小;
  • 是否启用某些内核功能。

三十五、LiteOS 移植主要步骤

PPT 中总结了基于 STM32F103C8T6 的 LiteOS 移植过程,开发工具是 MDK5。

主要步骤如下:

  1. 创建裸机工程;
  2. 添加 LiteOS 内核文件;
  3. 配置头文件路径;
  4. 添加 OS_CONFIG;
  5. 移除 SysTick 和 PendSV 中断;
  6. 修改 target_config.h
  7. 重定向 printf
  8. 创建任务测试;
  9. 编译下载验证。

三十六、第一步:创建裸机工程

PPT 示例使用 STM32F103C8T6 最小系统板。

板载资源包括:

  • 三个 LED;
  • 一个串口。

LED 引脚:

  • PB5;
  • PB6;
  • PB7。

串口:

  • USART1;
  • PA9;
  • PA10。

可以用 STM32CubeMX 创建工程。

STM32Cube 包含两个部分:

  1. STM32CubeMX 图形配置工具;
  2. STM32Cube HAL 库和中间件。

三十七、引脚配置

PPT 中的引脚配置包括:

  1. PB5、PB6、PB7 配置为推挽输出;
  2. PA9、PA10 配置为 USART1 复用功能;
  3. PA13 配置为 SWDIO;
  4. PA14 配置为 SWCLK;
  5. 使能串行调试功能。

其中 PA13 和 PA14 用于下载和调试。


三十八、验证裸机工程

在移植 LiteOS 前,先验证裸机工程是否正常。

PPT 中通过 LED 闪烁和串口输出测试。

逻辑是:

  1. 点亮 LED1、LED2、LED3;
  2. 延时 300ms;
  3. 熄灭 LED;
  4. 延时 300ms;
  5. 串口输出测试信息;
  6. 如果串口收到数据,则回显。

这样做的目的是:

先确保硬件、时钟、GPIO、串口和下载调试都正常,再开始移植 LiteOS。

如果裸机工程本身不正常,后面移植 LiteOS 时很难判断问题出在哪里。


三十九、第二步:添加 LiteOS 源码

需要把 LiteOS 核心源码复制到裸机工程中。

主要复制:

  1. arch
  2. kernel
  3. OS_CONFIG

其中:

  • archCPU 架构相关代码;
  • kernelLiteOS 内核代码;
  • OS_CONFIG内核配置文件。

四十、第三步:向 MDK 工程添加内核文件

在 Keil MDK 中需要新建分组,例如:

  1. LiteOS/Arch
  2. LiteOS/Kernel
  3. LiteOS/CMSIS
  4. LiteOS/Config

然后把对应 .c 文件和汇编文件添加进去。

PPT 中特别提醒:

添加 los_dispatch_keil.S 汇编文件时,需要选择文件类型为 All files。

因为 .S 文件默认可能不会显示。


四十一、需要添加的主要源码

根据 PPT,主要包括:

LiteOS/cmsis

  • cmsis_liteos.c

LiteOS/kernel

包括多个目录下的 .c 文件,例如:

  • kernel/base/core
  • kernel/base/ipc
  • kernel/base/mem
  • kernel/base/misc
  • kernel/base/om
  • kernel/extended/tickless
  • kernel/los_init.c

LiteOS/arch

包括:

  • arch/arm/arm-m/src 下的 .c 文件;
  • los_dispatch_keil.S

LiteOS/config

包括:

  • target_config.h
  • los_builddef.h
  • los_printf.h

其中最关键的是 target_config.h


四十二、第四步:配置头文件路径

如果只添加源码文件,但没有配置头文件路径,编译会报错。

PPT 中提到需要添加的头文件路径包括:

  1. arch/arm/arm-m/include
  2. kernel/include
  3. kernel/base/include
  4. kernel/extended/include
  5. OS_CONFIG
  6. Libraries/CMSIS/Include

这一步非常重要。

考试如果问移植流程,必须提到:

添加源码后,需要在工程配置中添加 LiteOS 相关头文件路径。


四十三、第五步:移除 SysTick 和 PendSV 中断

PPT 中要求打开 stm32f1xx_it.c,找到:

  • SysTick_Handler
  • PendSV_Handler

然后屏蔽掉这两个中断处理函数。

原因是:

LiteOS 内核会使用 SysTick 作为系统节拍,并使用 PendSV 进行任务切换。如果裸机工程中已经定义了这些中断函数,就可能与 LiteOS 的实现冲突,导致编译错误或运行异常(避免与原工程中断处理函数冲突)。

可以这样背:

SysTick 负责系统 Tick,PendSV 负责任务切换,移植 LiteOS 时需要避免与原工程中断处理函数冲突。


四十四、第六步:修改 target_config.h

target_config.h 是 LiteOS 移植中最重要的配置文件。

它主要配置:

  • MCU 驱动头文件;
  • 系统时钟;
  • Tick;
  • 中断;
  • 任务;
  • 信号量;
  • 互斥锁;
  • 队列;
  • 软件定时器;
  • 内存;
  • CMSIS;
  • 异常;
  • Tickless;
  • Runstop;
  • Track。

1. 修改 MCU 头文件

例如 STM32F103 需要包含对应头文件:

#include "stm32f10x.h"

如果使用 STM32F4,可能需要:

#include "stm32f4xx.h"

这一项必须和具体芯片型号匹配。


2. 修改 SRAM 大小

PPT 中示例:

#define BOARD_SRAM_START_ADDR    0x20000000
#define BOARD_SRAM_SIZE_KB       40
#define BOARD_SRAM_END_ADDR      (BOARD_SRAM_START_ADDR + 1024 * BOARD_SRAM_SIZE_KB)

这里要根据芯片实际 SRAM 大小修改。

例如 STM32F103C8T6 常见 SRAM 是 20KB,而 PPT 中某些例子可能是 40KB,所以实际移植时要看具体芯片。

如果 SRAM 配置错误,可能导致:

  • 内存越界;
  • 系统启动失败;
  • 任务创建失败;
  • 程序异常跑飞。

四十五、target_config.h 中的重要配置

下面按模块讲解。


1. 系统时钟配置

主要宏包括:

#define OS_SYS_CLOCK (SystemCoreClock)
#define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)

含义:

  • OS_SYS_CLOCK:系统时钟;
  • LOSCFG_BASE_CORE_TICK_PER_SECOND:每秒 Tick 数。

如果每秒 1000 个 Tick,则 1 个 Tick 是 1ms。


2. Tickless (低功耗功能)配置

#define LOSCFG_KERNEL_TICKLESS NO

Tickless 是低功耗功能。

开启后,系统空闲时可以关闭 SysTick 并进入睡眠状态,以降低功耗。

初学者移植时一般先设为 NO,保证系统稳定运行。


3. 硬件中断配置

#define LOSCFG_PLATFORM_HWI NO
#define LOSCFG_PLATFORM_HWI_LIMIT 96

其中:

  • LOSCFG_PLATFORM_HWI 表示 LiteOS 是否接管外部硬件中断;
  • 一般建议设置为 NO,也就是非接管中断方式;
  • LOSCFG_PLATFORM_HWI_LIMIT 表示支持的最大外部中断数。

PPT 中也提到:

非接管中断方式更简单,更适合初学者学习。


4. 任务模块配置

任务模块配置包括:

  • 默认任务优先级;
  • 最大任务数量;
  • 空闲任务栈大小;
  • 默认任务栈大小;
  • 最小任务栈大小;
  • 是否开启时间片;
  • 同优先级任务时间片长度;
  • 最高优先级;
  • 最低优先级。

重点:

#define LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO 10
#define LOSCFG_BASE_CORE_TSK_LIMIT 15
#define LOSCFG_BASE_CORE_TIMESLICE YES
#define LOS_TASK_PRIORITY_HIGHEST 0
#define LOS_TASK_PRIORITY_LOWEST 31

LiteOS 中:

优先级数值越小,优先级越高。

也就是说:

  • 0 是最高优先级;
  • 31 是较低优先级。

5. 信号量配置

#define LOSCFG_BASE_IPC_SEM YES
#define LOSCFG_BASE_IPC_SEM_LIMIT 20

信号量可以用于:

  • 任务间同步;
  • 任务与中断间同步;
  • 资源计数。

6. 互斥锁配置

#define LOSCFG_BASE_IPC_MUX YES
#define LOSCFG_BASE_IPC_MUX_LIMIT 15

互斥锁用于保护临界资源。

PPT 中提到,LiteOS 互斥锁具有优先级继承机制。

优先级继承可以缓解优先级反转问题。


7. 队列配置

#define LOSCFG_BASE_IPC_QUEUE YES
#define LOSCFG_BASE_IPC_QUEUE_LIMIT 10

消息队列用于任务之间或任务与中断之间传递数据。

特点:

  • 可以存储有限数量的数据;
  • 数据大小固定;
  • 适合异步通信。

8. 软件定时器配置

软件定时器依赖消息队列。

常见配置包括:

#define LOSCFG_BASE_CORE_SWTMR YES
#define LOSCFG_BASE_CORE_SWTMR_LIMIT 16

含义:

  • 是否启用软件定时器;
  • 最大支持的软件定时器数量。

软件定时器用于定时执行某些回调函数。


9. 内存模块配置

内存配置包括:

  • 系统内存起始地址;
  • 系统内存结束地址;
  • 系统内存大小;
  • 内存节点完整性检查;
  • 内存节点大小检查;
  • bestfit 算法;
  • 多内存池检查;
  • SLAB 分配机制。

重点理解:

LiteOS 需要知道自己可以管理哪一段 RAM,所以必须正确配置内存起始地址和大小。


10. CMSIS 配置

#define LOSCFG_COMPAT_CMSIS_FW YES
#define CMSIS_OS_VER 2

表示 LiteOS 对 CMSIS OS 接口的兼容配置。

如果 CMSIS_OS_VER 是 2,则使用 CMSIS-RTOS2 相关接口。


11. 异常配置、Runstop、Track

这些属于扩展或调试相关功能。

例如:

  • 异常模块;
  • 运行停止机制;
  • 跟踪模块。

初学移植时通常可以关闭,减少复杂度。


四十六、第七步:创建任务测试

PPT 中示例是创建两个任务:

  1. 一个任务每 2 秒控制 LED1;
  2. 另一个任务每 400ms 控制 LED2。

这样可以验证 LiteOS 的任务调度是否正常。

如果两个 LED 按不同周期闪烁,就说明:

  • LiteOS 内核启动成功;
  • 任务创建成功;
  • 调度器运行正常;
  • Tick 正常;
  • 延时函数正常。

这一步非常关键。


四十七、LiteOS 启动流程

PPT 习题中问到 “LiteOS 是如何启动的”。

可以按嵌入式 RTOS 的一般流程回答:

  1. 芯片上电复位;
  2. 执行启动文件;
  3. 初始化堆栈和中断向量表;
  4. 调用系统初始化函数,例如 SystemInit
  5. 进入 main 函数;
  6. 初始化硬件外设;
  7. 调用 LiteOS 内核初始化函数;
  8. 创建用户任务;
  9. 调用 LOS_Start() 启动调度;
  10. 系统进入多任务运行状态。

可以简化背成:

上电复位 → 硬件初始化 → 内核初始化 → 创建任务 → 启动调度器 → 多任务运行。


四十八、LiteOS 任务切换

PPT 习题中还问到 “LiteOS 的任务是如何切换的”。

LiteOS 任务切换主要依赖:

  • SysTick;
  • PendSV;
  • 调度器;
  • 上下文保存和恢复。

简单过程:

  1. SysTick 周期性产生系统节拍;
  2. 调度器判断是否需要任务切换;
  3. 如果需要切换,触发 PendSV;
  4. PendSV 保存当前任务上下文;
  5. 选择下一个任务;
  6. 恢复下一个任务上下文;
  7. CPU 开始执行新任务。

可以背成:

SysTick 触发调度时机,PendSV 完成上下文切换。


四十九、LiteOS 任务状态

虽然 PPT 当前内容没有详细展开任务状态图,但复习时建议掌握常见 RTOS 任务状态:

  1. 就绪态;
  2. 运行态;
  3. 阻塞态;
  4. 挂起态;
  5. 退出态或删除态。

1. 就绪态

任务已经具备运行条件,等待 CPU 调度。

2. 运行态

任务正在占用 CPU 执行。

3. 阻塞态

任务等待某个事件,例如:

  • 等待信号量;
  • 等待消息队列;
  • 延时未到;
  • 等待互斥锁。

4. 挂起态

任务被主动挂起,暂时不参与调度。

5. 删除态

任务被删除,资源被释放。


五十、本章重点背诵版

下面这部分适合考前直接背。


1. LiteOS 简介

Huawei LiteOS 是华为面向物联网领域推出的轻量级物联网操作系统,具有轻量级、低功耗、互联互通、组件丰富、快速开发、可裁剪、快速启动等特点,可应用于可穿戴设备、智能家居、车联网、智慧城市和制造业等领域。


2. LiteOS 的 “1+N” 架构

LiteOS 采用 “1+N” 架构。“1” 指 LiteOS 内核,包括基础内核和扩展内核,负责系统资源管理;“N” 指多个中间件和功能框架,包括互联互通框架、传感器框架、安全框架、JavaScript 框架、运行引擎、低功耗框架、SOTA 远程升级和轻量级 AI 框架等。


3. LiteOS 内核层次

LiteOS 内核分为基础内核和扩展内核。基础内核提供 RTOS 特性,包括任务调度、内存管理、中断机制、队列管理、事件管理、IPC 机制、时间管理、软件定时器和双向链表等;扩展内核提供运行-暂停机制和动态框架等能力。


4. LiteOS 基础内核子系统

LiteOS 基础内核主要包括:

  1. 任务管理;
  2. 内存管理;
  3. 任务同步;
  4. 任务间通信;
  5. 时间管理;
  6. 中断和硬件定时器管理。

5. 任务管理模块功能

任务管理模块负责 CPU 资源调度,提供任务创建、删除、延迟、挂起、恢复、锁定调度和解锁调度等功能。LiteOS 认为一个任务就是一个线程,支持优先级抢占调度和同优先级时间片轮转调度。


6. 静态内存与动态内存区别

静态内存管理在系统运行前或初始化时确定内存分配,分配速度快、确定性强、不易产生碎片,但灵活性较差;动态内存管理允许程序运行时申请和释放内存,灵活性高,但可能产生内存碎片。LiteOS 支持 BOX、SLAB、DLINK 等内存管理算法。


7. LiteOS SDK 作用

LiteOS SDK 是部署在物联网终端设备上的轻量级互联互通中间件,集成 MQTT、LwM2M、CoAP、mbedtls、LwIP 等协议栈,提供开放 API,帮助设备快速接入物联网平台,实现数据上报和命令接收。


8. Agent Lite SDK 与 Agent Tiny SDK 区别

Agent Lite SDK 面向计算和存储能力较强的嵌入式设备,如工业网关、采集器,支持 HTTPS 和 MQTTS;Agent Tiny SDK 面向功耗、存储、计算资源受限的终端设备,如单片机、芯片和模组,支持 LwM2M over CoAP 和 MQTT。


9. OSAL 作用

OSAL 是操作系统抽象层,用于屏蔽不同操作系统之间的差异。它将任务创建、任务删除、互斥锁、信号量、内存管理等操作系统相关接口抽象出来,使 SDK 可以运行在 LiteOS、Linux、MacOS 等不同系统上。


10. LiteOS 移植流程

LiteOS 移植到 STM32 的主要流程包括:

  1. 创建并验证 STM32 裸机工程;
  2. 下载 LiteOS 源码;
  3. 提取并复制 archkernelOS_CONFIG 等核心目录;
  4. 在 MDK 中添加 LiteOS 源码文件;
  5. 配置头文件路径;
  6. 屏蔽原工程中的 SysTick 和 PendSV 中断处理函数;
  7. 修改 target_config.h,配置 MCU 头文件、系统时钟、RAM 大小和内核功能;
  8. 重定向 printf
  9. 创建任务进行测试;
  10. 编译下载并验证运行结果。

五十一、考试可能这样问

题目1:LiteOS 内核可分为哪些层次?

答:

LiteOS 内核可分为基础内核和扩展内核两个层次。基础内核为终端设备提供 RTOS 特性,包括任务调度、内存管理、中断机制、队列管理、事件管理、IPC 机制、时间管理、软件定时器等功能;扩展内核提供运行-暂停机制和动态框架等扩展能力。


题目2:LiteOS 与 LiteOS SDK 有何关系?

答:

LiteOS 是面向物联网设备的轻量级操作系统,主要提供内核调度、内存管理、中断管理、时间管理等系统能力。LiteOS SDK 是运行在设备端的轻量级互联互通中间件,集成 MQTT、LwM2M、CoAP、mbedtls、LwIP 等协议栈,并提供开放 API,用于设备快速接入物联网平台、数据上报和命令接收。二者关系是:LiteOS 提供系统运行基础,LiteOS SDK 提供端云通信和物联网业务接入能力。


题目3:LiteOS 是如何启动的?

答:

LiteOS 启动一般包括上电复位、启动文件初始化、系统时钟和硬件初始化、进入 main 函数、LiteOS 内核初始化、创建用户任务、调用调度启动函数、进入多任务调度运行状态。可以概括为:上电复位 → 硬件初始化 → 内核初始化 → 创建任务 → 启动调度器 → 多任务运行。


题目4:Huawei LiteOS SDK 是如何分类的?

答:

Huawei LiteOS SDK 主要包括 Agent Lite SDK 和 Agent Tiny SDK。Agent Lite SDK 面向运算和存储能力较强的嵌入式设备,如工业网关、采集器等,支持 HTTPS 和 MQTTS;Agent Tiny SDK 面向功耗、存储和计算资源受限的终端设备,如单片机、芯片和模组,支持 LwM2M over CoAP 和 MQTT。


题目5:LiteOS 的任务是如何切换的?

答:

LiteOS 支持基于优先级的抢占调度和同优先级时间片轮转调度。系统通过 SysTick 产生周期性节拍,调度器根据任务优先级和状态判断是否需要切换任务。当需要任务切换时,通常通过 PendSV 异常完成上下文保存和恢复,从而从当前任务切换到下一个任务。


题目6:任务管理模块主要具有哪些功能?

答:

LiteOS 任务管理模块主要负责 CPU 资源调度,提供任务创建、删除、延迟、挂起、恢复、锁定调度和解锁调度等功能。LiteOS 中一个任务就是一个线程,系统支持优先级抢占调度和同优先级时间片轮转调度。


题目7:静态内存管理和动态内存管理有何区别?LiteOS 各自采用哪些算法?

答:

静态内存管理是在系统初始化或运行前确定内存分配,具有分配速度快、确定性强、不易产生碎片等特点,但灵活性较差;动态内存管理是在程序运行过程中按需申请和释放内存,灵活性较高,但可能产生内存碎片。LiteOS 支持固定大小 BOX 算法、动态申请 SLAB 算法和 DLINK 算法,并提供内存统计和越界检测功能。


题目8:LiteOS 移植需要哪些软硬件条件?

答:

LiteOS 移植一般需要具备目标硬件平台,例如 STM32 开发板;开发工具,例如 Keil MDK5 或 STM32CubeMX;LiteOS 源码;目标芯片对应的启动文件、CMSIS 文件和 HAL 或标准外设库;串口调试工具;下载调试器,如 ST-Link。软件上需要配置 LiteOS 内核源码、头文件路径、target_config.h、中断函数和任务测试程序。


五十二、本章一句话总结

这一章可以这样总结:

LiteOS 是华为面向物联网设备推出的轻量级操作系统,采用“1+N”架构,以基础内核和扩展内核提供任务调度、内存管理、中断和时间管理等 RTOS 能力,并通过 SDK、互联互通、安全、传感器、低功耗和远程升级等组件支持物联网端云协同;LiteOS 移植的关键在于添加内核源码、配置头文件和 target_config.h,并让系统正确接管 Tick、调度和任务运行。