# stm32mp157-liteos-m **Repository Path**: tstcoder/stm32mp157-liteos-m ## Basic Information - **Project Name**: stm32mp157-liteos-m - **Description**: STM32MP157 M4 核移植 LiteOS-M 极简工程:拨码001纯M4独立启动、三层分离架构、内核 submodule 零改动、VSCode+Makefile+arm-none-eabi-gcc 全开源。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-28 - **Last Updated**: 2026-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STM32MP157 M4 × LiteOS-M 教学基线版(v0.1-baseline) STM32MP157 双核 MPU 的 **Cortex-M4 核**运行 LiteOS-M 实时内核的极简工程。 拨码 **001 纯 M4 独立启动**(不依赖 A7/Linux),固件运行于 M4 内部 256KB SRAM, VSCode + Makefile + arm-none-eabi-gcc 全开源工具链,开箱即可编译、烧录、调试。 本分支(`main`)是**教学基线版 v0.1-baseline**:调度器完整可运行、代码最小化,是 CSDN 博客系列的代码对照基线。 演示效果:**红灯 200ms 快闪 + 绿灯 500ms 慢闪**,双任务独立调度(内核节拍 1000Hz)。 ## 分支说明 本仓库维护两条并行分支,定位不同: | 分支 | 定位 | 时钟域 | 当前版本 | |---|---|---|---| | **`main`**(本分支) | 教学基线版,配套 CSDN 博客系列的代码对照 | MC 域 `0xAA8`(M4 自托管,规范写法) | `v0.1-baseline` | | `master` | 演进实战版,记录从临时方案到原生启动的完整演进 | MP 域 `0xA28` | `v3.0-native-pendsv` | - **访客默认看到 `main`**(Gitee 默认分支),即博客配套的基线版 - `master` 上有 `v1.0-nosvc` → `v2.0-svc` → `v2.1-fix-reflash` → `v3.0-native-pendsv` 四个演进 tag,记录了"绕开 LOS_Start 临时方案 → SVC 标准 → 二次烧录修复 → 原生 HalStartToRun"的完整演进路径,可作为演进历史参考 > 两条分支**无共同祖先**(独立工程线),代码差异以 `board.c` 时钟域选择最典型:`main` 走 MC 域(M4 独立启动的规范写法),`master` 走 MP 域(双核共享写法)。本分支的口径以 CSDN 博客第 8 篇为准。 ## 工程亮点 - **三层分离架构**:`app/`(业务,硬件无关)+ `targets/`(BSP 板级)+ `kernel_liteos_m/`(内核子模块,零改动),换板只动 targets,业务代码一行不改 - **内核子模块化**:LiteOS-M 以 git submodule 引入官方源码(OpenHarmony-v3.0-LTS),物理零裁剪,`make git-status` 一键自检零改动 - **逻辑裁剪而非物理裁剪**:裁剪清单收敛于 Makefile `C_SOURCES` + `target_config.h` 宏开关;`-ffunction-sections -fdata-sections` + `--gc-sections` 链接回收,磁盘保留完整内核 ≠ 固件冗余 - **SRAM-only 内存预算**:链接脚本严格限制 `0x10000000~0x1003FFFF`(256KB),链接后自动打印 text/data/bss 占用 - **调试符号分离**:`_nodbg.elf` / `.bin`(烧录)与 `.dbg`(电脑端 GDB)独立产出,调试符号绝不占板子内存 - **纯 M4 独立启动**:官方 GCC 启动文件适配 + 自定义单 SRAM 区链接脚本(LMA==VMA,.data 免拷贝) ## 目录结构 ``` stm32mp157-liteos-m/ ├── app/ # 业务应用层(硬件无关,只 #include "board.h") │ ├── main.c # 启动流程串联:BoardInit → LOS_KernelInit → 建任务 → LOS_Start │ └── app_task.c # RedLed / GreenLed 两个演示任务 ├── targets/ # BSP 板级适配层(所有硬件相关收敛于此) │ ├── board/ # board.c/h、startup_stm32mp15xx.S、system_stm32mp1xx.c │ ├── cmsis/ # core_cm4.h │ ├── lds/ # stm32mp157_m4_256k.lds(单 SRAM 区 256KB) │ ├── OS_CONFIG/ # los_config.h、target_config.h(内核裁剪宏开关) │ └── securec/ # securec.h ├── kernel_liteos_m/ # LiteOS-M 内核(git submodule,官方源码零改动) ├── openocd/ # OpenOCD 板级配置 board_stm32mp157_m4.cfg ├── tools/ # flash_m4.bat 一键烧录脚本 + 烧录排错说明 └── Makefile # 唯一构建入口(业务/板级/内核三分离编译编排) ``` ## 环境要求 | 工具 | 版本 / 说明 | |---|---| | Arm GNU Toolchain | 14.3.rel1(arm-none-eabi-gcc / objcopy / objdump / readelf) | | GNU Make | Windows 下用 mingw32-make,或 Git Bash 内 make | | OpenOCD | 需支持 `stm32mp15x.cm4` 目标 | | Git | **Windows 下须把 Git 的 `usr/bin` 加入 PATH**(Makefile 依赖 sh.exe / rm.exe / grep.exe / awk.exe) | | 硬件 | 正点原子 STM32MP157 开发板 + ST-Link(SWD) | ## 快速开始 ### 1. 克隆(含内核子模块) ```bash git clone --recursive https://gitee.com/tstcoder/stm32mp157-liteos-m.git cd stm32mp157-liteos-m git checkout v0.1-baseline # 切到教学基线版 tag git submodule update --init # 初始化内核子模块 ``` > 若已克隆但漏了 `--recursive`:`git submodule update --init` ### 2. 编译 Makefile 默认工具链路径为 `D:/ArmGnu/14.3 rel1/bin`,按实际安装路径覆盖: ```bash make TOOLCHAIN="你的 arm-none-eabi-gcc bin 目录" ``` 编译产物(`build/` 目录): | 文件 | 用途 | |---|---| | `liteos_m.elf` | 完整版 ELF(电脑端 GDB 调试) | | `liteos_m_nodbg.elf` | 烧录用 ELF(已 strip 调试符号) | | `liteos_m.bin` | 烧录用 BIN | | `liteos_m.dbg` | 纯调试符号(GDB `add-symbol-file` 挂接) | | `liteos_m.map` | 内存映射表 | 链接结束自动打印 text/data/bss —— **三者合计即固件占用的 SRAM 总量**。 ### 3. 烧录运行 前提:拨码开关拨到 **001**(M4 工程启动,A7 不启动 Linux),ST-Link 已接 SWD。 ```bash make flash ``` 或双击 `tools/flash_m4.bat`。 > ⚠️ STM32MP157 的 M4 **没有片上 Flash**,"烧录"实为把固件加载进内部 SRAM(0x10000000)。 > SRAM 掉电即失,每次重新上电需重新加载;量产场景由 A7 侧 Linux 经 remoteproc 加载启动 M4。 ### 4. 其他常用目标 ```bash make git-status # 自检内核子模块零改动(无输出 = 通过) make dasm # 生成反汇编(教学:任务切换汇编、.isr_vector 布局) make clean # 清理 build/ ``` ## 配套博文(CSDN) | 篇目 | 内容 | 直达链接 | |---|---|---| | 第一篇·原理避坑 | 为什么禁止手转 Keil 启动文件、官方双版本启动文件体系、.data/.bss/VTOR 机制 | [CSDN](https://blog.csdn.net/xiao089412/article/details/164150193) | | 第二篇·实战落地 | Reset_Handler 改写、单 SRAM 区链接脚本、LiteOS-M 任务模板 | [CSDN](https://blog.csdn.net/xiao089412/article/details/164150997) | | 第三篇·Windows 排错 | mingw32-make vpath 大小写坑、.s/.S 后缀、玄学报错根因 | [CSDN](https://blog.csdn.net/xiao089412/article/details/164124784) | > 更多文章与后续更新见作者主页:[xiao089412 的 CSDN 博客](https://blog.csdn.net/xiao089412) ## 许可证 - 本工程自有代码(`app/` `targets/` `openocd/` `tools/`)以 MIT 协议开源 - 内核子模块 `kernel_liteos_m/` 遵循其原始协议(BSD 3-Clause,见 `kernel_liteos_m/LICENSE`)