第6章 LiteOS 操作系统及其移植
本章的核心是:LiteOS 是什么、它由哪些部分组成、LiteOS SDK 有什么作用,以及怎样把 LiteOS 移植到 STM32 工程中。
一、本章总体框架
这章可以分成四大块:
- LiteOS 操作系统概述
- LiteOS 的来源;
- LiteOS 的特点;
- LiteOS 的 “1+N” 架构。
- LiteOS 内核
- 基础内核;
- 扩展内核;
- 任务管理、内存管理、任务同步、任务通信、时间管理、中断管理。
- LiteOS SDK
- Agent Lite SDK;
- Agent Tiny SDK;
- Huawei LiteOS SDK;
- OS 适配层 OSAL。
- 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 的主要特点包括:
- 轻量级
- 低功耗
- 互联互通
- 组件丰富
- 快速开发
- 可裁剪
- 快速启动
它可以应用在:
- 可穿戴设备;
- 智能家居;
- 车联网;
- 城市公共服务;
- 制造业;
- 工业网关;
- 智能传感器终端。
一句话理解:
LiteOS 是面向物联网终端设备的轻量级实时操作系统,它既提供 RTOS 内核能力,又提供物联网连接、安全、升级、传感器和端云协同能力。
三、LiteOS 的 “1+N” 架构
LiteOS 采用 “1+N” 架构。
1. “1” 是 LiteOS 内核
这个 “1” 指 LiteOS 内核。
LiteOS 内核包括:
- 基础内核;
- 扩展内核。
内核主要负责物联网设备端的系统资源管理,例如:
- 任务调度;
- 内存管理;
- 中断管理;
- 时间管理;
- 任务同步;
- 任务间通信。
也就是说,内核是 LiteOS 的核心。
2. “N” 是多个中间件和功能框架
“N” 指多个中间件,包括:
- 互联互通框架;
- 传感器框架;
- 安全框架;
- JavaScript 框架;
- 运行引擎;
- 低功耗框架;
- OpenCPU 架构;
- SOTA 远程升级;
- 轻量级人工智能框架。
可以这样理解:
LiteOS 的内核负责“设备怎么运行”,中间件负责“设备怎么联网、怎么安全、怎么升级、怎么开发、怎么智能化”。
四、互联互通框架
互联互通框架是 LiteOS 中非常重要的部分。
它主要提供:
- IP;
- TCP;
- UDP;
- CoAP;
- MQTT;
- LwM2M;
- mbed TLS;
- LwIP 等协议栈。
作用是:
帮助终端设备接入物联网云平台,实现端云通信。
例如,一个传感器设备使用 LiteOS 后,可以通过 MQTT 或 LwM2M 协议把数据上传到华为 OceanConnect IoT 平台。
互联互通框架的意义在于:
- 降低开发门槛;
- 减少开发者自己写协议栈的工作;
- 实现不同设备之间互通;
- 支持设备快速接入云平台。
五、传感器框架
传感器框架主要面向各种传感器设备。
物联网设备中经常会连接很多传感器,例如:
- 温度传感器;
- 湿度传感器;
- 加速度传感器;
- 陀螺仪;
- 光照传感器;
- 气体传感器。
不同传感器硬件接口和数据格式可能不同。 如果每个传感器都单独开发,会非常麻烦。
LiteOS 传感器框架的作用是:
抽象不同类型传感器接口,屏蔽硬件细节,使应用层可以更方便地调用传感器能力。
传感器框架有三个主要特征:
- 实时传感器事件机制;
- 多传感器数据融合算法;
- 传感器管理。
1. 实时传感器事件机制
当传感器数据发生变化时,可以通过事件机制通知应用。
例如:
- 温度超过阈值;
- 姿态发生变化;
- 加速度异常;
- 光照强度变化。
这样应用不需要一直轮询传感器,可以提高效率。
2. 多传感器数据融合
有些应用需要多个传感器共同判断状态。
例如智能手环判断运动状态,可能需要:
- 加速度传感器;
- 陀螺仪;
- 心率传感器。
传感器框架可以提供数据融合算法,让系统获得更准确的判断结果。
3. 传感器管理
传感器管理包括:
- 传感器注册;
- 传感器初始化;
- 传感器数据读取;
- 传感器状态维护;
- 传感器事件处理。
六、安全框架
物联网设备通常连接云平台,并且可能部署在开放环境中,所以安全非常重要。
LiteOS 安全框架从三个方面覆盖物联网安全需求:
- 终端安全;
- 传输安全;
- 端云安全。
1. 终端安全
主要保证设备本身可信。
例如:
- 防止非法固件运行;
- 防止设备被恶意篡改;
- 保护设备中的密钥和敏感数据。
2. 传输安全
主要保证数据在传输过程中不被窃听、篡改。
例如:
- TLS;
- DTLS;
- mbed TLS;
- 加密通信;
- 身份认证。
3. 端云安全
主要保证终端和云平台之间的身份可信、通信可信。
例如:
- 设备认证;
- 云端认证;
- 安全接入;
- 访问控制;
- 端云协同安全。
一句话总结:
LiteOS 安全框架要保证设备安全、通信安全和云端接入安全。
七、JavaScript 框架与运行引擎
LiteOS 支持 JavaScript 开发框架和轻量级 JavaScript 运行引擎。
这部分的意义是:
让物联网开发者可以使用更高级、更容易上手的语言开发应用,而不完全依赖 C 语言。
JavaScript 框架的优势包括:
- 简化跨硬件平台和中间件的系统集成;
- 用高级语言抽象隐藏底层编程细节;
- 可以兼容大量第三方库;
- JS 虚拟机提供基于语言的安全性;
- 常与运行引擎结合使用。
运行引擎则构建在 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。
它的特点是:
- 通过差分方式降低升级包大小;
- 适合低带宽网络;
- 适合电池供电设备;
- 差分合并算法对 RAM 要求较少;
- 满足海量低资源终端升级需求。
为什么差分升级重要?
因为物联网终端通常带宽低、功耗低、内存小。如果每次升级都传完整固件,代价很高。 差分升级只传变化部分,可以显著减少升级数据量。
十二、轻量级人工智能框架
PPT 中提到:
LiteOS + MindSpore Lite 面向物联网端侧提供轻量级 AI 解决方案。
它主要解决的问题是:
物联网端侧设备资源受限、算力低,但又需要部署 AI 推理能力。
例如:
- 智能摄像头本地识别;
- 可穿戴设备健康状态判断;
- 工业传感器异常检测;
- 智能家居语音或行为识别。
MindSpore Lite 可以帮助开发者把 AI 模型部署到端侧设备,实现轻量级推理。
十三、LiteOS 内核是什么?
PPT 中对内核的解释是:
内核是提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件,为系统其他部分提供系统服务。
在 LiteOS 中,内核是最核心的部分。
建立在 LiteOS 内核之上的完整系统,还包括:
- 扩展中间件;
- 安全框架;
- SDK。
所以要区分:
| 名称 | 含义 |
|---|---|
| LiteOS 内核 | 操作系统最核心部分,负责调度、内存、中断等 |
| LiteOS 操作系统 | 内核 + 中间件 + 安全框架 + SDK 等完整系统 |
十四、LiteOS 内核的两个层次
PPT 中说 Huawei LiteOS 内核分为两个层次:
- 基础内核;
- 扩展内核。
1. 基础内核
基础内核提供 RTOS 特性。
主要能力包括:
- 任务调度;
- 内存管理;
- 中断机制;
- 队列管理;
- 事件管理;
- IPC 机制;
- 时间管理;
- 软定时器;
- 双向链表等常用数据结构。
基础内核是考试重点。
2. 扩展内核
扩展内核提供更高级的能力。
PPT 中提到主要包括:
- 运行-暂停机制;
- 动态框架。
扩展内核可以理解为在基础 RTOS 能力之上增加的增强功能。
十五、LiteOS 基础内核的主要子系统
PPT 中说 LiteOS 基础内核具有 6 个主要子系统:
- 任务管理;
- 内存管理;
- 任务同步;
- 任务间通信;
- 时间管理;
- 中断和硬件定时器管理。
十六、任务管理
LiteOS 认为:
一个任务就是一个线程。
任务管理模块负责管理 CPU 资源调度,让多个任务能够合理使用 CPU。
任务管理模块提供的功能包括:
- 任务创建;
- 任务删除;
- 任务延迟;
- 任务挂起;
- 任务恢复;
- 锁定任务调度;
- 解锁任务调度。
LiteOS 支持:
- 按优先级高低进行抢占调度;
- 同优先级任务采用时间片轮转调度。
1. 抢占调度
优先级高的任务可以抢占优先级低的任务。
例如:
- 报警任务优先级高;
- 数据上传任务优先级低。
当报警事件发生时,报警任务可以立即抢占 CPU 执行。
2. 时间片轮转
如果多个任务优先级相同,系统可以让它们轮流执行。
例如:
- 任务 A 执行一个时间片;
- 任务 B 执行一个时间片;
- 任务 C 执行一个时间片。
这样可以保证同优先级任务公平运行。
十七、内存管理
LiteOS 在有限资源上提供静态内存和动态内存管理。
PPT 中提到支持的内存管理算法包括:
- 固定大小 BOX 算法;
- 动态申请 SLAB;
- DLINK 算法。
还提供:
- 内存统计;
- 内存越界检测。
1. 静态内存管理
静态内存管理通常在系统初始化或编译阶段确定内存分配。
特点:
- 分配速度快;
- 确定性强;
- 不容易产生碎片;
- 灵活性较差。
适合实时性要求高、内存大小固定的场景。
2. 动态内存管理
动态内存管理允许程序运行时申请和释放内存。
特点:
- 灵活;
- 适合复杂应用;
- 可能产生内存碎片;
- 分配时间可能不如静态方式确定。
3. BOX、SLAB、DLINK
BOX 算法
固定大小内存块管理。
适合频繁申请固定大小内存的场景。
SLAB 算法
动态内存分配方法,适合管理固定类型对象,效率较高。
DLINK 算法
基于双向链表的动态内存管理方法,适合动态申请和释放内存。
十八、任务同步
任务同步是指:
多个任务通过特定机制控制执行顺序。
LiteOS 支持的同步机制包括:
- 互斥锁;
- 信号量。
如果没有同步,多个任务之间执行顺序可能混乱。
举例
假设任务 A 和任务 B 都要访问同一个串口。
如果没有同步机制,两个任务可能同时发送数据,导致串口输出混乱。
使用互斥锁后:
- 任务 A 先获得锁;
- 任务 B 等待;
- 任务 A 使用完串口后释放锁;
- 任务 B 再使用串口。
这就是任务同步。
十九、任务间通信 IPC
IPC 全称是:
Inter Process Communication,进程间通信。
在 LiteOS 中,IPC 用于任务之间交换信息。
PPT 中提到 LiteOS 支持 POSIX 规范中的标准 IPC 机制,也支持其他常用 IPC 机制。
常见 IPC 包括:
- 队列;
- 事件;
- 信号量;
- 互斥锁;
- 消息队列。
任务间通信的作用是:
让不同任务之间可以传递数据、通知事件、协同工作。
二十、时间管理
LiteOS 时间管理包括:
- 系统时间;
- Tick 时间;
- 软件定时器。
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 的软件结构,包括:
- 应用编程接口;
- 端云互通组件;
- 物联组件;
- 基础组件;
- OS 适配层;
- 硬件平台抽象层 HAL。
可以这样理解:
| 层次 | 作用 |
|---|---|
| 应用编程接口 | 给应用程序调用 |
| 端云互通组件 | 负责设备接入云平台 |
| 物联组件 | 提供物联网协议和功能 |
| 基础组件 | 提供基础功能支撑 |
| OS 适配层 | 适配不同操作系统 |
| HAL | 屏蔽不同硬件差异 |
二十五、Agent Lite SDK 软件结构
Agent Lite SDK 架构包括:
- 应用编程接口;
- 数据上报;
- 命令接收;
- 回调监听;
- 端云互通;
- 日志收集;
- 子设备管理;
- 硬件平台抽象层 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 主要由三部分组成:
- 端云组件;
- LPWA 增强;
- IDE 集成开发环境。
其中端云组件又分为几个层次:
1. 开放 API 层
为应用程序定义通用接口。
开发者可以通过 API 快速完成:
- 接入 OceanConnect IoT 平台;
- 业务数据上报;
- 下发命令处理。
2. 协议层
集成多种协议:
- LwM2M;
- CoAP;
- DTLS;
- TLS;
- UDP。
3. 适配层
用于适配具体硬件平台。
包括:
- 硬件随机数;
- 内存管理;
- 日志;
- 数据存储;
- 网络 Socket;
- AT 命令适配。
二十八、两种应用场景
LiteOS SDK 针对两种场景提供不同软件架构:
- 单模组、单 MCU;
- 外置 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 源码有两个版本:
- develop 版本;
- 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。
主要步骤如下:
- 创建裸机工程;
- 添加 LiteOS 内核文件;
- 配置头文件路径;
- 添加 OS_CONFIG;
- 移除 SysTick 和 PendSV 中断;
- 修改
target_config.h; - 重定向
printf; - 创建任务测试;
- 编译下载验证。
三十六、第一步:创建裸机工程
PPT 示例使用 STM32F103C8T6 最小系统板。
板载资源包括:
- 三个 LED;
- 一个串口。
LED 引脚:
- PB5;
- PB6;
- PB7。
串口:
- USART1;
- PA9;
- PA10。
可以用 STM32CubeMX 创建工程。
STM32Cube 包含两个部分:
- STM32CubeMX 图形配置工具;
- STM32Cube HAL 库和中间件。
三十七、引脚配置
PPT 中的引脚配置包括:
- PB5、PB6、PB7 配置为推挽输出;
- PA9、PA10 配置为 USART1 复用功能;
- PA13 配置为 SWDIO;
- PA14 配置为 SWCLK;
- 使能串行调试功能。
其中 PA13 和 PA14 用于下载和调试。
三十八、验证裸机工程
在移植 LiteOS 前,先验证裸机工程是否正常。
PPT 中通过 LED 闪烁和串口输出测试。
逻辑是:
- 点亮 LED1、LED2、LED3;
- 延时 300ms;
- 熄灭 LED;
- 延时 300ms;
- 串口输出测试信息;
- 如果串口收到数据,则回显。
这样做的目的是:
先确保硬件、时钟、GPIO、串口和下载调试都正常,再开始移植 LiteOS。
如果裸机工程本身不正常,后面移植 LiteOS 时很难判断问题出在哪里。
三十九、第二步:添加 LiteOS 源码
需要把 LiteOS 核心源码复制到裸机工程中。
主要复制:
arch;kernel;OS_CONFIG。
其中:
arch是 CPU 架构相关代码;kernel是 LiteOS 内核代码;OS_CONFIG是内核配置文件。
四十、第三步:向 MDK 工程添加内核文件
在 Keil MDK 中需要新建分组,例如:
LiteOS/ArchLiteOS/KernelLiteOS/CMSISLiteOS/Config
然后把对应 .c 文件和汇编文件添加进去。
PPT 中特别提醒:
添加
los_dispatch_keil.S汇编文件时,需要选择文件类型为 All files。
因为 .S 文件默认可能不会显示。
四十一、需要添加的主要源码
根据 PPT,主要包括:
LiteOS/cmsis
cmsis_liteos.c
LiteOS/kernel
包括多个目录下的 .c 文件,例如:
kernel/base/corekernel/base/ipckernel/base/memkernel/base/misckernel/base/omkernel/extended/ticklesskernel/los_init.c
LiteOS/arch
包括:
arch/arm/arm-m/src下的.c文件;los_dispatch_keil.S。
LiteOS/config
包括:
target_config.hlos_builddef.hlos_printf.h
其中最关键的是 target_config.h。
四十二、第四步:配置头文件路径
如果只添加源码文件,但没有配置头文件路径,编译会报错。
PPT 中提到需要添加的头文件路径包括:
arch/arm/arm-m/includekernel/includekernel/base/includekernel/extended/includeOS_CONFIGLibraries/CMSIS/Include
这一步非常重要。
考试如果问移植流程,必须提到:
添加源码后,需要在工程配置中添加 LiteOS 相关头文件路径。
四十三、第五步:移除 SysTick 和 PendSV 中断
PPT 中要求打开 stm32f1xx_it.c,找到:
SysTick_HandlerPendSV_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 NOTickless 是低功耗功能。
开启后,系统空闲时可以关闭 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 31LiteOS 中:
优先级数值越小,优先级越高。
也就是说:
- 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 中示例是创建两个任务:
- 一个任务每 2 秒控制 LED1;
- 另一个任务每 400ms 控制 LED2。
这样可以验证 LiteOS 的任务调度是否正常。
如果两个 LED 按不同周期闪烁,就说明:
- LiteOS 内核启动成功;
- 任务创建成功;
- 调度器运行正常;
- Tick 正常;
- 延时函数正常。
这一步非常关键。
四十七、LiteOS 启动流程
PPT 习题中问到 “LiteOS 是如何启动的”。
可以按嵌入式 RTOS 的一般流程回答:
- 芯片上电复位;
- 执行启动文件;
- 初始化堆栈和中断向量表;
- 调用系统初始化函数,例如
SystemInit; - 进入
main函数; - 初始化硬件外设;
- 调用 LiteOS 内核初始化函数;
- 创建用户任务;
- 调用
LOS_Start()启动调度; - 系统进入多任务运行状态。
可以简化背成:
上电复位 → 硬件初始化 → 内核初始化 → 创建任务 → 启动调度器 → 多任务运行。
四十八、LiteOS 任务切换
PPT 习题中还问到 “LiteOS 的任务是如何切换的”。
LiteOS 任务切换主要依赖:
- SysTick;
- PendSV;
- 调度器;
- 上下文保存和恢复。
简单过程:
- SysTick 周期性产生系统节拍;
- 调度器判断是否需要任务切换;
- 如果需要切换,触发 PendSV;
- PendSV 保存当前任务上下文;
- 选择下一个任务;
- 恢复下一个任务上下文;
- CPU 开始执行新任务。
可以背成:
SysTick 触发调度时机,PendSV 完成上下文切换。
四十九、LiteOS 任务状态
虽然 PPT 当前内容没有详细展开任务状态图,但复习时建议掌握常见 RTOS 任务状态:
- 就绪态;
- 运行态;
- 阻塞态;
- 挂起态;
- 退出态或删除态。
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 基础内核主要包括:
- 任务管理;
- 内存管理;
- 任务同步;
- 任务间通信;
- 时间管理;
- 中断和硬件定时器管理。
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 的主要流程包括:
- 创建并验证 STM32 裸机工程;
- 下载 LiteOS 源码;
- 提取并复制
arch、kernel、OS_CONFIG等核心目录; - 在 MDK 中添加 LiteOS 源码文件;
- 配置头文件路径;
- 屏蔽原工程中的 SysTick 和 PendSV 中断处理函数;
- 修改
target_config.h,配置 MCU 头文件、系统时钟、RAM 大小和内核功能; - 重定向
printf; - 创建任务进行测试;
- 编译下载并验证运行结果。
五十一、考试可能这样问
题目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、调度和任务运行。