🎯 本文主线(先吃颗定心丸):本篇是
target_config.h三篇的收尾,不用怕——没有新概念,把它当工具书,移植卡住时翻回来对照即可。本篇主线就一句:target_config.h里每个=0都是你主动关掉的功能(有判据、不是漏写),你的配置靠-I顺序 + 内核末行 include盖过内核默认、不侵入内核;而改错和换板都有"分级排雷"套路(红黄绿三色灯,详见第三站)。下面四站全是它的展开。
🗺️ 详细拆解路线(四站,跟着走不迷路):
- 🚉第一站·逐条理由:每个
=0为什么是0——逐条给判据,外加"关宏三条纪律"(关宏≠删源、宏与 Makefile 成对、改前先 grep)。- 🚉第二站·覆盖机制:你的配置怎么"盖过"内核默认——靠
-I顺序 + 内核末行 include,只改工程侧那份,内核源码一字不动。- 🚉第三站·改错速查:一张"改错会怎样"速查表,按危险度排成红黄绿三色灯分级。
- 🚉第四站·换板阶梯:把这张表搬到你的板子(抄判据不抄数字)+ 一份换芯片三级排错阶梯(先查时钟/IRQ,再查栈/堆,最后动裁剪串)。
读完全文,记得回来看末尾的「全文总结」,它会把上面四站串成一句话。
🏠零基础导读(接第 15/16 篇那张"总菜单"):本篇主角还是那张"菜单"——
第 15 篇你"点了菜"(列基础三件:时钟/中断/裁剪),第 16 篇"后厨做菜"(填中间三件:FPU/栈/堆)。本篇讲两件事:吃出问题怎么查(配置改错会怎样),以及换一家分店还照这张单点(配置怎么搬到你的板子)。
先把 4 个对应关系记牢,后面就不晕了:
现实比喻 配置文件里的真名 你手写的便签盖掉总菜单原字 你的 target_config.h覆盖内核默认(头文件覆盖)便签粘贴的顺序(先总单、后你的) 头文件 -I包含顺序菜谱上"不供应"(=0)却是你主动划掉 LOSCFG_XXX = 0是主动裁剪,非漏写换一家分店还照这张单点 换芯片三级排错阶梯
一、第一站·逐条理由:每个=0为什么是0
一句话理解:光抄一串= 0没用,得知道每个 0 背后的判据——换到你的项目时才知道哪些该留、哪些该开回来。
| 宏 | 关掉的模块 | 本工程为什么敢关(判据) | 什么时候该改回1 |
|---|---|---|---|
LOSCFG_KERNEL_PM | 电源管理 | M4 独立启动、HSI 64MHz 恒定供电,无休眠/降频 | 做电池续航、需要 tickless 低功耗时 |
LOSCFG_KERNEL_TRACE | 执行追踪 | trace 需 host 端解析工具和额外缓冲,LED 演示用不上 | 要抓调度时序、分析耗时分布时 |
LOSCFG_DYNLINK | 动态链接 | 裸机既无文件系统也无加载器,"运行时加载模块"无从谈起 | 要做固件热补丁、模块化升级时 |
LOSCFG_BASE_CORE_CPUP | CPU 占用率统计 | 需周期性采样钩子,运行时有开销 | 性能调优、想看各任务 CPU 占比时 |
LOSCFG_BASE_CORE_TSK_MONITOR | 任务监控 | 额外统计开销,只有 2 个任务肉眼看得过来 | 调试任务栈溢出、异常退出时 |
LOSCFG_BACKTRACE_TYPE | 栈回溯 | 需符号表 + 帧指针配合,还会撑大固件 | 配合第 21 篇(FPU 栈帧与 backtrace 实战)做死机回溯时开(那时很香) |
LOSCFG_MEM_LEAKCHECK | 内存泄漏检查 | 需记录每次分配的调用点,内存与性能开销都大 | 长期运行稳定性验证阶段开 |
LOSCFG_MPU_ENABLE | MPU 内存保护 | 需按内存区逐个配权限,配错直接 MemManage Fault | 产品化做内存隔离/安全加固时 ⚠️ 开它必须同时把los_mpu.c加回 Makefile |
LOSCFG_TEST | 测试套件 | 依赖testsuits/与 host 测试框架,本工程跑不了 | 需要跑官方测试用例时 |
📌白话领路:上面把每个 0 的理由讲清了。但"关宏"这件事本身还有三条铁纪律——比抄清单更重要,先刻进脑子,再去抄。
关宏的三条纪律(比抄清单重要):
- 关宏 ≠ 删源码。模块源码仍在内核里(如 MPU 的
los_mpu.c在kernel_liteos_m/kernel/arch/arm/cortex-m4/gcc/,测试套件在kernel_liteos_m/testsuits/),只是不参与编译——改一行宏就能回来。 - 宏与编译清单必须成对。关掉
X,就要把只被X用到的.c从 Makefile 剔除(本工程:LOSCFG_MPU_ENABLE=0↔ 剔除los_mpu.c)。反之开回来时也要成对加回——只改宏不加文件,链接期一堆undefined reference。 - 关之前先 grep 一遍。
grep -rn "LOSCFG_XXX"看看有没有别的模块在#if分支里依赖它;有些宏关掉会顺带把别的模块 API 一起"关没了",报错现场离你改的宏十万八千里。
🚏第一站小结:每个
=0都是"主动划掉"的菜(有判据、非漏写),换项目时该开的要开回来。关宏牢记三条纪律:① 关宏≠删源(改一行宏就能回来)② 宏与 Makefile 成对增减(否则undefined reference)③ 改前先grep依赖,防顺带关掉别的模块。
二、第二站·覆盖机制:你的配置怎么盖过内核默认
一句话理解:“你的配置能盖过内核默认”,靠的是编译器的头文件搜索顺序 + 内核末行那句 include。
本文件能"覆盖"内核默认配置,靠两件事:
-I顺序:Makefile 里-Itargets/OS_CONFIG排在-Ikernel/include之前(-I是 GCC 头文件搜索路径选项,写在前面的目录优先被找)。内核los_config.h(实测第40行,文件共 822 行)#include "target_config.h"时,编译器先找到你工程侧的这一份。- 内核自带这一行 include:v3.0-LTS 的
los_config.h本来就写了#include "target_config.h"(和#include "los_compiler.h"并列,位于文件靠前的第 40 行),所以你不用改内核源码——这是"配置不侵入内核"的前提。
验证技巧:在
target_config.h里临时加一行#error "using MY target_config.h",能编译报这个错,说明你的文件被正确读取;不报就是搜索路径写反了。
🚏第二站小结:配置不侵入内核——靠
-I顺序(工程目录排前)+ 内核末行#include "target_config.h",你只改工程侧那份,内核源码一字不动;用#error可验证你的文件被正确读取。
三、第三站·改错速查:红黄绿灯分级
一句话理解:这张表是"排错地图"——以后板子不对劲,先按你动过的宏来查。
📌图注:把常见坑按"踩了多惨"分成三色灯:红灯最要命(时钟/中断号配错,板子直接不启动);黄灯是慢性病(栈堆不够,跑一阵崩);绿灯最轻(裁剪宏 =0,某个功能用不了但能跑)。改配置时先扫红灯,再扫黄灯。
💡白话领路:把下面每一行当成"你亲手埋的雷"——你改了哪个宏,就先看那一行"踩下去会怎样"。本篇把它叫"排雷图",移植卡住时直接照着查。
| 你动的宏 | 设错后果 |
|---|---|
OS_SYS_CLOCK/TICK_PER_SECOND | 节拍周期算错,LOS_TaskDelay()延时不准 |
FPU 双宏(__FPU_PRESENT+__FPU_USED)与 Makefile 硬浮点配置不匹配 | 一用 float 就 HardFault;漏一个还导致死机栈帧错位 104/176、bt全瞎 |
TSK_LIMIT太小 | 建任务超上限,LOS_TaskCreate返回失败 |
任务栈 <TSK_MIN_STACK_SIZE | 栈溢出,踩坏相邻内存 |
HEAP_SIZE不够 | 任务/对象分配失败,OOM |
中断号 >HWI_LIMIT | 向量表越界 |
-I顺序写反 | 读到内核默认配置,你的全不生效 |
🚏第三站小结:改错速查按红黄绿三色灯分级(红灯最要命 > 黄灯跑着崩 > 绿灯功能缺),动过哪个宏就先查那一行"踩下去会怎样"。
四、第四站·换板阶梯:把配置搬到你的板子
一句话理解:别抄数字,抄**“数字是怎么算出来的”**——那才是能复用的部分。
| 配置项 | 本工程取值 | 这个数由什么决定(判据) | 换到你的板子去哪查 |
|---|---|---|---|
OS_SYS_CLOCK | 64 MHz | 时钟树的实际频率 | 芯片手册时钟树;且与 CMSISSystemCoreClock必须相等 |
TICK_PER_SECOND | 1000(1ms) | 你要求的节拍精度 | 应用需求;改它必须同步核对TICK_RESPONSE_MAX |
HWI_LIMIT→OS_VECTOR_CNT | 32 → 48 | 系统异常 16 +最大外设 IRQ 号 | 芯片IRQn列表最大值 |
TSK_LIMIT | 8 | 实际任务数 + 余量 | 你的任务数 ×1.5,宁可略大 |
三档栈0x800/0x600/0x200 | 默认/idle/最小 | 局部变量 + 调用深度 + printf 缓冲 | 实测栈水位,别拍脑袋 |
HEAP_SIZE | 0x14000(80KB) | 所有任务栈 + 内核对象都从这里分 | 任务数×栈 + 对象开销,再留 30% 余量 |
LOSCFG_* = 0那一串 | 全关 | 判据④:移植阶段用不上 →关宏不删源 | 见第一站三条纪律 |
💡换芯片的排错顺序(能省一半时间):
① 先按芯片手册填时钟和最大 IRQ 号——这两项填错是灾难级(跑不起来 / 随机 HardFault);
② 再按应用填任务数 / 栈 / 堆——这三项填错是**"跑着跑着 OOM"级**;
③ 最后才动LOSCFG_*=0那串——这项填错只是功能缺失,随时能开回来。
按这个顺序排查,永远先怀疑前面那两级。
📌图注:这是换芯片时的"排雷顺序"——先排会炸板的(时钟/IRQ 配错,灾难级),再排会内存爆的(任务/栈/堆,OOM 级),最后排功能缺失的(一串 =0 的裁剪宏)。照这个顺序查,能省你三天瞎调。
🚏第四站小结:换板"抄判据不抄数字"——每个配置项对应一个"由什么决定"的公式,按公式重算;换芯片排错按三级阶梯走(见上文"换芯片的排错顺序"块),先怀疑前两级。
五、全文总结(回到主线)
本文一句话总结(建议收藏):
target_config.h里每个=0都是你主动划掉的(有判据、不是漏写,换板时该开的要开回来且宏与 Makefile 成对增减);你的配置靠-I顺序 + 内核末行 include"盖过"内核默认、不侵入内核;改错按红黄绿分级查、换芯片按三级阶梯排错(先时钟/IRQ、再栈堆、最后裁剪串)。
用四站回顾一遍:
- 🚉第一站·逐条理由:每个
=0都有判据(非漏写),换项目该开的要开回来;关宏三条纪律(关宏≠删源、宏与 Makefile 成对、改前先 grep)。 - 🚉第二站·覆盖机制:靠
-I顺序 + 内核末行 include,配置盖过内核默认、不侵入内核。 - 🚉第三站·改错速查:红黄绿三色灯分级速查表(红灯 > 黄灯 > 绿灯),动过哪个宏先查哪行。
- 🚉第四站·换板阶梯:抄判据不抄数字(按公式重算);换芯片三级排错——先时钟/IRQ(灾难级)→ 任务/栈/堆(OOM 级)→
=0裁剪串(功能缺失级)。
🧰本篇可复用经验速记(照着做,别只读):
- □ 关宏前先查依赖:
grep -rn LOSCFG_XXX看谁在#if里靠它;关 X 必同步把只被 X 用的.c从 Makefile 剔除,开回来也成对加回(否则undefined reference)。- □ 配完
-I验一次:在target_config.h临时加#error "using MY target_config.h"编译,报错 = 你的文件盖对了,不报 = 搜索路径写反。- □ 换芯片排错顺序:先时钟/最大 IRQ 号(灾难级)→ 再任务数/栈/堆(OOM 级)→ 最后
=0裁剪串(功能缺失级),永远先怀疑前两级。
术语表(本文出现)
| 缩写/符号 | 含义 |
|---|---|
LOSCFG_KERNEL_PM | 宏:电源管理开关(本工程 =0 关) |
LOSCFG_KERNEL_TRACE | 宏:执行追踪开关(本工程 =0 关) |
LOSCFG_DYNLINK | 宏:动态链接开关(本工程 =0 关) |
LOSCFG_BASE_CORE_CPUP | 宏:CPU 占用率统计开关(本工程 =0 关) |
LOSCFG_BASE_CORE_TSK_MONITOR | 宏:任务监控开关(本工程 =0 关) |
LOSCFG_BACKTRACE_TYPE | 宏:栈回溯开关(本工程 =0 关,死机回溯时开) |
LOSCFG_MEM_LEAKCHECK | 宏:内存泄漏检查开关(本工程 =0 关) |
LOSCFG_MPU_ENABLE | 宏:MPU 保护开关(本工程 =0 关,开须加回 los_mpu.c) |
LOSCFG_TEST | 宏:测试套件开关(本工程 =0 关) |
| MPU | Memory Protection Unit,内存保护单元(给内存区设只读/不可执行权限) |
| los_mpu.c | MPU 实现源文件(MPU_ENABLE=1 时必须加回 Makefile) |
-I | GCC 头文件搜索路径选项(写在前面的目录优先被找) |
| los_config.h | 内核总配置文件(第 40 行#include "target_config.h",靠-I顺序被工程覆盖) |
| OOM | Out Of Memory,内存耗尽(堆不够分配) |
| IRQn | 芯片中断号枚举(决定 HWI_LIMIT 下限) |
| 头文件覆盖机制 | 靠-I顺序 + 内核末行 include,让工程侧配置盖过内核默认,不侵入内核 |
系列导航
上一篇:第 16 篇 · target_config FPU 三件套与栈档 |本篇:第 17 篇 · target_config 改错速查| 下一篇:第 18 篇 · LED 任务与 LOS_TaskCreate 详解板级适配与应用 07–25:07 工程全景 | 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 经验增删改留
基础 01–06:01 环境准备 | 02 源码下载裁剪 | 03 os_config | 04 Makefile | 05 链接脚本 | 06 烧录
切换汇编 01–06:汇编1 | 汇编2 | 汇编3 | 汇编4 | 汇编5 | 汇编6
代码仓库:stm32mp157-liteos-m @ Gitee · 基线 v0.1-baseline · 全部版本标签
57-liteos-m) · 基线 v0.1-baseline · 全部版本标签