配套代码stm32mp157-liteos-m· 本系列工程基于基线版 v0.1-baseline· 全部版本标签 /tags本文是移植实战系列的总览篇第七篇。基础六篇环境准备 → 源码裁剪 → os_config → Makefile → 链接脚本 → 一键烧录解决了怎么跑起来切换汇编六篇解决了内核怎么换任务从这一篇开始我们把镜头拉远给你一张完整的工程地图哪些文件要自己写、它们怎么协作、main 函数里的四行代码凭什么能让两个 LED 各闪各的。读完这篇后面每一篇你都知道自己在地图的哪个位置。工程限定OpenHarmony LiteOS-M v3.0-LTS STM32MP157 M4 独立启动Cortex-M4 硬件 FPUGCC Makefile。文章目录一、为什么需要一张地图二、三层架构自改文件全在两层里2.1 应用层 app/只有两个文件2.2 板级适配层 targets/所有脏活都在这2.3 内核层 kernel_liteos_m/禁改但要读得懂三、启动四步法main.c 里的四行代码四、抽掉第 4 步会怎样一个真实的课堂演示态五、文件 → 文章地图建议收藏当目录六、小结一、为什么需要一张地图前十二篇有个共同特点单点深潜。讲 Makefile 时整个世界只有编译参数讲los_dispatch.S时整个世界只有寄存器和栈帧。这就像学车时单独练打方向盘、单独练踩离合——每个动作都会了但第一次上路还是懵这些动作按什么顺序串起来移植一个 RTOS 也一样。你可能在某个深夜对着工程目录发呆app/里就两个 .c 文件targets/里一大堆看不懂名字的文件kernel_liteos_m/里几千个文件到底哪些和我有关我移植到底移植了什么内核一行没改那我的工作价值在哪这篇就回答这三个问题。先给结论后面逐层展开移植的工作量 app/ 和 targets/ 里那十几个文件内核kernel_liteos_m/一行都不用改也不许改。二、三层架构自改文件全在两层里把工程当成一家餐厅三层各司其职层目录餐厅类比谁来写① 应用层app/菜单上的菜叉烧、清炒时蔬。顾客只点菜不关心用什么锅炒你自己写② 板级适配层targets/后厨设备灶台、烤箱、水电。换一家店设备全变但菜谱不用重写你自己写③ 内核层kernel_liteos_m/运营制度排班规则、交接流程。总部统一制定分店不许改官方 submodule禁改2.1 应用层 app/只有两个文件app/ ├── main.c —— 启动四步法串联本篇第三节细讲 └── app_task.c —— 两个 LED 业务任务 任务创建函数这一层的特点是完全不知道硬件长什么样。app_task.c想点亮红灯时写的是LED_RED_ON();——一个宏不是寄存器。硬件长什么样去问②层。2.2 板级适配层 targets/所有脏活都在这targets/ ├── board/ │ ├── board.h —— BSP 对外契约下一篇主角 │ ├── board.c —— BSP 实现时钟/LED/内核堆/打印口 │ ├── system_stm32mp1xx.c —— 官方 CMSIS 裁剪版SystemInit/FPU/VTOR │ └── startup_stm32mp15xx.S —— 启动文件复位后第一段汇编 ├── cmsis/core_cm4.h —— 精简 CMSIS 头SCB/SysTick 寄存器定义 ├── lds/stm32mp157_m4_256k.lds —— 链接脚本256KB SRAM 硬约束 ├── OS_CONFIG/ —— los_config.h target_config.h 配置总入口 └── securec/securec.h —— 手写安全函数垫片内核编译依赖移植的八小时工作量九成花在这层。后面每一篇拆一个文件文件讲它的文章board.hboard.c第 8 篇BSP 契约与实现下一篇system_stm32mp1xx.c第 9 篇CMSIS 裁剪stm32mp157_m4_256k.lds第 10/11/12 篇链接脚本上/中/下startup_stm32mp15xx.S第 13 篇启动文件与五步启动target_config.h第 15/16/17 篇裁剪清单 / FPU 与栈档 / 改错速查2.3 内核层 kernel_liteos_m/禁改但要读得懂它是 git submodule官方代码原封不动。“禁改不等于不用懂”——切换汇编六篇讲的los_dispatch.S就在这里。你不需要改它但出问题时得能看懂它。唯一的例外是调试调试篇会把cpsie i临时改成cpsid i制造卡死现场——那是教学实验改完就还原不算移植改动。三、启动四步法main.c 里的四行代码app/main.c全文不到 40 行去掉注释核心就这几句intmain(void){UINT32 ret;BoardInit();/* 1. 板级硬件初始化BSP 层完成纯寄存器 */retLOS_KernelInit();/* 2. 内核初始化堆 / arch / 任务 / IPC / idle */if(ret!LOS_OK){while(1){/* 初始化失败卡死便于调试器断点定位 */}}(VOID)AppTaskCreate();/* 3. 创建 RedLed / GreenLed 两个任务 */LOS_Start();/* 4. 启动调度器永不返回 */return0;/* 永不执行 */}四步一步都不能少顺序也不能乱。用开店流程来记第 1 步BoardInit()——开灯烧水。把要用的硬件先弄就绪GPIO 时钟使能、LED 引脚配成输出细节在下一篇。为什么放最前因为后面所有环节的可见现象都靠它——如果硬件没就绪就算内核跑起来了你也看不见 LED 闪。第 2 步LOS_KernelInit()——查库存、排班表。内核在这一步拿到仓库g_liteosHeap[]那块 80KB 内存下一篇讲、初始化调度器数据结构、顺手创建 idle 任务。任何一步失败都会返回非LOS_OK这里的while(1)卡死是故意的——留个明显的现场给调试器断点比悄悄跑飞好查一百倍。第 3 步AppTaskCreate()——安排今天的菜。调用LOS_TaskCreate()两次把闪红灯“闪绿灯两个函数登记成任务各自领到独立栈空间和优先级。注意此刻它们还没跑只是排上了班”。第 4 步LOS_Start()——正式营业永不打烊。启动调度器。从这一行之后CPU 就不再顺着 main 往下走了而是由内核安排哪个任务该跑、跑多久、什么时候换人。return 0永远执行不到——不是写错是给读者一个明确信号main 的使命到 LOS_Start 为止。四、抽掉第 4 步会怎样一个真实的课堂演示态四步法里最不起眼、又最要命的就是第 4 步。我们把LOS_Start()删掉、换成直接调用RedLedTask();现象是红灯常亮、绿灯完全不亮。有意思的是红灯其实亮过了——任务函数真的开始跑了LED_RED_ON()都执行了。卡住的是紧跟着的那句LOS_TaskDelay(200)它想让出 CPU 等 200ms可调度器压根没启动没有任何人能来换班。这就像员工举手喊我到时间了换人——结果发现店里根本没排班表全店冻结在他这一声喊上。这个破坏现场可以一键复现和还原调试篇会带着你用 GDB 亲手抓这个现场bashtools/demo_hang.sh a# 施加抽掉 LOS_Start破坏bashtools/demo_hang.sh restore# 一键还原基线踩坑实录真事这个脚本会直接改写main.c/app_task.c/los_dispatch.S原始版本备份在隐藏目录.demo_hang_bak/里。我给这套课程规划写作大纲时打开工程读到的正是演示态的 main.c——当时差点把没有 LOS_Start当成工程的真实写法写进教程。所以立一条铁规矩读这套工程的任何代码之前先跑一遍bash tools/demo_hang.sh restore确保看到的是基线而不是上一堂课留下的破坏现场。五、文件 → 文章地图建议收藏当目录整个系列剩下的部分就是把这十几个文件逐个讲透。序号文章对应文件一句话定位————07本篇·工程全景与启动四步法全工程地图与四步法08BSP 契约与实现board.h/board.c业务与硬件的插座标准09SystemInit 与 CMSIS 裁剪system_stm32mp1xx.c、core_cm4.hSystemInit 里到底干了什么10链接脚本 lds上stm32mp157_m4_256k.lds256KB SRAM 怎么分房子11链接脚本 lds下①stm32mp157_m4_256k.lds逐段解剖各内存段12链接脚本 lds下②stm32mp157_m4_256k.lds契约断言与照妖镜13启动文件与五步启动startup_stm32mp15xx.S复位后、main 前的五步14内核如何接管中断los_interrupt.c、los_dispatch.S、los_exc.SVTOR 重定向与g_hwiForm15target_config 裁剪清单上target_config.h时钟 / 中断 / 裁剪开关16target_config 的 FPU 与栈档target_config.hFPU 双宏成套与三档任务栈17target_config 改错速查target_config.h、Makefile宏名写错、漏配的急救18LED 任务与 LOS_TaskCreate 详解app_task.c任务三要素栈、优先级、入口19LED 任务实战与错误码app_task.c跑起来以及错误码怎么读20死机定位los_exc 与三破坏现场tools/三件套、los_exc.S卡死了GDB 怎么问现场21死机定位FPU 栈帧与 backtracelos_exc.S异常帧 104/176 两本账与回溯22移植总 Checklist八环节与四铁律全工程换芯片照着走的总清单23移植总 Checklist全文件对账与目录全工程逐文件对账表24移植复用六类判据与换板五步—什么能复用、什么必须重写25移植复用经验与增删改留—移植决策的四象限已发内容的位置基础篇 01-06环境/源码/配置/构建/链接/烧录是让板子跑起来切换汇编 01-06 是让任务换起来本篇之后的 08-25是让工程长成一个像样的产品——08~14 打通板级适配15~17 讲配置裁剪18~19 讲应用落地20~21 讲死机定位22~23 是移植总清单24~25 讲如何把这套经验复用到新芯片。六、小结三句话带走本篇移植 写好两层app/业务不碰寄存器targets/板级硬件脏活全在这内核是禁改的 submodule。启动四步法BoardInit → LOS_KernelInit → AppTaskCreate → LOS_Start——硬件就绪、内核就绪、任务排队、调度器接管LOS_Start之后 main 不再回头。读代码先对基线这套工程带课堂演示态切换脚本动笔/动手前先bash tools/demo_hang.sh restore。下一篇进入②层第一站board.h和board.c——看一个 46 行的头文件凭什么当唯一接口以及内核的打印函数为什么反过来要我们板级来提供。系列导航基础 01–0601 环境准备 02 源码下载裁剪与工程搭建 03 os_config 详解 04 Makefile 详解 05 链接脚本与编译运行 06 一键烧录踩坑实录切换汇编 01–06汇编1 汇编是什么与寄存器地图篇 汇编2 指令异常机制全景表篇 汇编3 首任务启动篇 汇编4 临界区与触发篇 汇编5 HalPendSV机制篇 汇编6 完整调度接力与调试篇板级适配与应用 07–2507 工程全景 08 BSP 09 SystemInit 10 lds上 11 lds下·解剖 12 lds下·照妖镜 13 启动文件 14 接管中断 15 target_config上 16 FPU栈档 17 改错速查 18 LED详解 19 LED实战 20 los_exc 21 FPU栈帧 22 八环节 23 全文件对账 24 六类判据 25 经验增删改留代码仓库stm32mp157-liteos-m Gitee · 基线 v0.1-baseline · 全部版本标签