第二篇 STM32MP157-M4:LiteOS-M 源码下载与工程搭建

STM32MP157-M4:LiteOS-M 源码下载、裁剪与工程搭建

【高危前置提醒】LOSCFG_PLATFORM_HWI_LIMIT必须配置 160;TIM6 中断必须在LOS_KernelInit之前关闭(main.c 中HAL_NVIC_DisableIRQ(TIM6_IRQn)+ 清 pending + 停硬件计数器),初始化完成后用LOS_HwiCreate注册回来。

0 前言

LiteOS-M 是华为鸿蒙 OpenHarmony 的轻量级 RTOS 内核,专门面向 Cortex-M 等小资源 MCU。本工程基于OpenHarmony-v3.0-LTS独立内核仓库移植,通过os_config板级配置隔离层做到内核源码只读不修改,升级仅替换kernel_liteos_m/文件夹。

1 源码拉取

# 从 Gitee OpenHarmony 独立内核仓库下载gitclone https://gitee.com/openharmony/kernel_liteos_m.git-bOpenHarmony-v3.0-LTS

网络问题可直接从 Gitee 页面下载 ZIP 压缩包解压。

2 源码标准裁剪流程

裁剪原则:最小化保留 M4+STM32MP1 需要的内核代码,其余全部删除

2.1 删除顶层无用文件

移除 BUILD.gn、文档目录、测试套件、/targets/目录(v3.0-LTS 仅含 RISC-V 板级配置,无 STM32 支持——我们的os_config/就是替代品)。

2.2 精简架构目录

只保留kernel/arch/arm/cortex-m4/gcc,删除 m3/m33/m7/arm9/riscv 架构目录以及全部iar/编译器目录。

2.3 裁剪可选组件

直接删除/components/目录。后续需要网络、shell、文件系统等高级功能时再单独恢复对应子目录。

2.4 裁剪后最小内核结构

kernel_liteos_m/ ├── kernel/ │ ├── include/ # 内核头文件(los_config.h, los_task.h...) │ ├── src/ # 内核 C 源码(任务、信号量、队列...) │ └── arch/arm/cortex-m4/gcc/ │ ├── los_dispatch.S # 任务上下文切换汇编 │ ├── los_context.c # 任务栈初始化 │ ├── los_exc.S # 异常处理 │ ├── los_interrupt.c # 中断管理 │ └── los_timer.c # 系统节拍 └── kal/ ├── kal.c # 内核抽象层 └── cmsis/ # CMSIS-RTOS 适配层(可选编译)

3 工程文件拷贝规范

3.1 CMSIS / HAL 驱动

从 STM32CubeMP1 包拷贝到Drivers/

  • Drivers/CMSIS/Include→ CMSIS Core 头文件(cmsis_gcc.h,core_cm4.h等)
  • Drivers/CMSIS/Device/ST/STM32MP1xx/Include→ 芯片头文件(stm32mp1xx.h
  • Drivers/CMSIS/Device/ST/STM32MP1xx/Source/Templates/gccGCC 专用启动文件

⚠️ 过滤ll_开头的底层驱动文件——我们使用 HAL 库,不需要 LL 库。

3.2 BSP / SYSTEM 驱动

从正点原子或官方 SDK 拷贝:

  • LED、Key、UART 等 BSP 驱动 →Drivers/BSP/
  • sys、delay 等系统驱动 →Drivers/SYSTEM/
  • 修改头文件引用#include "xxx.h"改为纯文件名(不使用上层路径),配合 Makefile 的-I搜索路径

3.3 启动文件关键修改

GCC 版启动文件必须进行两处修改:

  1. 文件首行添加浮点声明:
.fpu fpv4-sp-d16 /* 开启 M4 硬件单精度浮点 */
  1. PendSV 向量指向 LiteOS 调度器:
/* 改前:PendSV_Handler → Default_Handler(bx lr 直接返回,调度器无效) */ .thumb_set PendSV_Handler,HalPendSV /* LiteOS 上下文切换入口 */

3.4 放置裁剪后内核

将裁剪完成的kernel_liteos_m/文件夹直接放入工程根目录。内核文件全部只读,后续升级只需替换整个文件夹。

4 完整工程目录

m4_liteos_project/ ├── os_config/ # 板级配置隔离层 │ ├── target_config.h # 系统时钟、堆区、RTOS 功能总开关 │ ├── los_builddef.h # 中断向量表对齐参数 │ └── los_printf.h # 内核打印宏封装 ├── Core/ │ ├── Inc/ # 头文件 │ ├── Src/ │ │ ├── main.c # 主程序 │ │ ├── system_stm32mp1xx.c # 系统初始化(时钟、VTOR) │ │ └── stm32mp1xx_it.c # 中断服务函数 │ └── Startup/ │ └── startup_stm32mp15xx.s # GCC 启动文件 ├── Drivers/ │ ├── CMSIS/ # CMSIS 核心 │ ├── STM32MP1xx_HAL_Driver/ # HAL 外设驱动 │ ├── BSP/ # 板级支持包(LED、Key...) │ └── SYSTEM/ # 系统驱动(delay、sys...) ├── kernel_liteos_m/ # LiteOS-M 内核(只读) ├── stm32mp157_m4.lds # 链接脚本 ├── Makefile # 编译脚本 ├── openocd/ # OpenOCD 板级配置 ├── flash-m4.bat # 一键烧录 └── m4_debug.gdb # GDB 调试脚本

5 移植核心硬性规则

所有芯片时钟、内存、RTOS 功能开关全部写在os_config/目录中。

禁止修改kernel_liteos_m/内部任意文件。Makefile 的-I搜索路径把os_config/放在第一优先级,编译器优先读取我们的配置文件而非内核默认值。

这样做的好处:内核升级时直接把旧的kernel_liteos_m/删掉、放进新版本即可,零适配成本。


⚠️ 本节踩坑速览

现象根因修复
编译大量unknown type name裁剪误删los_typedef.h/los_compiler.h/los_list.h基础头文件还原kernel/include/全部头文件
出现UNUSED宏编译报错内核宏定义与 HAL 库参数格式冲突修改los_compiler.h#define UNUSED(X) (void)(X)
cmsis_os2.h 提示找不到依赖原文件是软链接,裁剪后链接断开替换为 ARM 官方完整版cmsis_os2.h
内核初始化后注册 TIM6,上电直接死循环内核接管 VTOR 后默认HalHwiDefaultHandler接手未注册中断main.cLOS_KernelInit前关闭 TIM6,之后用LOS_HwiCreate注册
IRQ > 32 上电 HardFault默认g_hwiForm仅 32+16 槽,MP157 外设中断超量target_config.hLOSCFG_PLATFORM_HWI_LIMIT 160
编译时 LOSCFG_PLATFORM_HWI_LIMIT 不生效os_config/路径在 Makefile 的-I列表后置os_config/路径放在 INCLUDES 首行