1. 课程导入

各位同学,咱们今天正式开讲。我是老赵,在嵌入式这行摸爬滚打了十几年,从早期的RT-Thread到FreeRTOS,再到这几年深度参与鸿蒙南向适配,踩过的坑确实不少。今天咱们聊LiteOS-M内核,这是鸿蒙南向开发的核心基础。你想想看,一个设备要跑鸿蒙,底层总得有个“管家”吧?LiteOS-M就是这个角色。

1.1 鸿蒙系统架构:从宏观到微观

先看整体。鸿蒙系统不是单一的内核,它是个分层架构。我习惯把它分成三层:

  • 应用层:你写的APP、UI界面,都在这一层。
  • 系统服务层:包括分布式软总线、文件系统、图形栈等核心能力。
  • 内核层:这就是咱们的主战场。鸿蒙支持多内核方案,LiteOS-M是面向轻量级MCU的。

说白了,LiteOS-M就是给那些只有几十KB内存、几MHz主频的“小芯片”准备的。比如智能灯、传感器、小家电。我在项目里见过有人拿它跑在Cortex-M0上,内存才8KB,照样跑得稳。

核心认知:鸿蒙的“大一统”理念,不是让所有设备跑同一个内核,而是让不同内核通过统一的驱动框架和HDF(硬件驱动框架)对外暴露一致接口。LiteOS-M负责最底层的任务调度、内存管理、中断响应。

下面这张图,是我自己画的鸿蒙南向软件栈,你看一眼就明白了。

鸿蒙南向软件栈架构图 鸿蒙南向软件栈架构 应用层(APP / UI / 业务逻辑) 系统服务层 分布式软总线 | 文件系统 | 图形栈 | HDF驱动框架 内核抽象层(KAL) LiteOS-M 内核 轻量级MCU(Cortex-M/RISC-V) Linux 内核 高性能SoC(Cortex-A/RISC-V) 硬件层(MCU / SoC / 外设) 说明:LiteOS-M 与 Linux 内核通过 KAL 层向上提供统一的 POSIX 接口,驱动开发只需关注 HDF 框架。

1.2 LiteOS-M内核特性:小而精,快而稳

LiteOS-M不是凭空造出来的。它借鉴了传统RTOS的设计思路,但针对鸿蒙场景做了大量优化。我个人觉得,它最突出的特性有这几个:

特性 说明 我的经验
轻量级内核 ROM最小可裁剪到6KB,RAM占用约1KB 我在某款智能传感器上,ROM只给了8KB,硬是塞进去了
实时性 任务切换时间可控制在1μs以内(Cortex-M4 @ 100MHz) 做电机控制时,这个指标直接决定了PID环路的响应
模块化可裁剪 通过宏开关,按需编译调度、IPC、内存管理等模块 建议:产品定型后,一定要做一次裁剪,能省不少资源
支持多架构 Cortex-M0/M3/M4/M7/RISC-V/ARM9 移植时注意中断向量表差异,我在这上面吃过亏
低功耗管理 支持Tickless模式,空闲时自动进入深度睡眠 电池类产品必开,功耗能降一个数量级

避坑指南:我曾经在移植LiteOS-M到某国产RISC-V芯片时,发现任务切换总丢数据。查了三天,最后发现是编译器对栈对齐的处理不一致。嗯,这里要注意:LiteOS-M默认要求8字节栈对齐,如果你的芯片不支持,得手动改汇编上下文切换代码。

1.3 内核源码目录结构解析

搞懂源码目录,就像拿到一张藏宝图。我第一次看LiteOS-M源码时,也被一堆文件夹搞晕过。后来我总结了一个规律:按功能模块分目录,按架构分文件。咱们直接看核心目录:

liteos_m/
├── arch/                  # 架构相关代码(移植重点)
│   ├── arm/               # ARM Cortex-M系列
│   │   ├── cortex-m4/     # M4具体实现
│   │   └── common/        # ARM通用代码
│   └── risc-v/            # RISC-V系列
├── kernel/                # 内核核心
│   ├── src/               # 调度、IPC、时间管理
│   └── include/           # 内核头文件
├── fs/                    # 文件系统(可选)
├── net/                   # 网络协议栈(可选)
├── drivers/               # 驱动框架
│   └── hdf/               # HDF驱动框架适配层
├── utils/                 # 工具函数
├── osdep/                 # 操作系统抽象层
└── build/                 # 编译脚本与配置

这里我重点说几个目录:

  • arch/:这是移植工作的核心。你换一个芯片,主要就是改这个目录下的汇编代码和中断处理。我记得第一次移植到Cortex-M7时,发现M7支持双精度浮点,但LiteOS-M默认没开,得手动在上下文切换里保存FPU寄存器。
  • kernel/src/:调度器、信号量、消息队列都在这里。代码量不大,但逻辑非常紧凑。建议初学者先通读一遍调度器代码,能帮你理解整个内核的运转机制。
  • drivers/hdf/:这是鸿蒙的硬件驱动框架层。LiteOS-M通过HDF向上层提供统一的外设访问接口。说白了,你写一个GPIO驱动,只要实现了HDF规定的回调函数,上层应用就能用同一套API操作。

警告:千万不要直接修改kernel/src/下的核心代码!我见过有人为了“优化”调度器,把时间片轮转逻辑改了,结果整个系统跑飞。正确的做法是:通过配置宏或钩子函数来定制行为。LiteOS-M提供了丰富的配置选项,在target_config.h里可以开关大部分功能。

最后,我建议你拿到源码后,先做一件事:编译一次默认配置。不管用什么板子,先跑通Hello World。这能验证你的工具链、编译环境、下载链路都没问题。后面咱们再一步步深入移植。

好,这一节就到这里。记住:LiteOS-M是鸿蒙南向的基石,搞懂它的架构和目录,后面写驱动、做移植才能游刃有余。