ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

第二篇 STM32MP157-M4:LiteOS-M 源码下载与工程搭建 STM32MP157-M4LiteOS-M 源码下载、裁剪与工程搭建【高危前置提醒】LOSCFG_PLATFORM_HWI_LIMIT必须配置 160TIM6 中断必须在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 源码标准裁剪流程裁剪原则最小化保留 M4STM32MP1 需要的内核代码其余全部删除。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.hDrivers/CMSIS/Device/ST/STM32MP1xx/Source/Templates/gcc→GCC 专用启动文件⚠️ 过滤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 版启动文件必须进行两处修改文件首行添加浮点声明.fpu fpv4-sp-d16 /* 开启 M4 硬件单精度浮点 */PendSV 向量指向 LiteOS 调度器/* 改前PendSV_Handler → Default_Handlerbx 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.c中LOS_KernelInit前关闭 TIM6之后用LOS_HwiCreate注册IRQ 32 上电 HardFault默认g_hwiForm仅 3216 槽MP157 外设中断超量target_config.h设LOSCFG_PLATFORM_HWI_LIMIT 160编译时 LOSCFG_PLATFORM_HWI_LIMIT 不生效os_config/路径在 Makefile 的-I列表后置os_config/路径放在 INCLUDES 首行
返回列表