☰
板级适配 · target_config.h 平台裁剪清单(下):改错速查与换板经验
2026/10/14 3:32:31 网站建设 项目流程

🎯 本文主线(先吃颗定心丸):本篇是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_CPUPCPU 占用率统计需周期性采样钩子,运行时有开销性能调优、想看各任务 CPU 占比时
LOSCFG_BASE_CORE_TSK_MONITOR任务监控额外统计开销,只有 2 个任务肉眼看得过来调试任务栈溢出、异常退出时
LOSCFG_BACKTRACE_TYPE栈回溯需符号表 + 帧指针配合,还会撑大固件配合第 21 篇(FPU 栈帧与 backtrace 实战)做死机回溯时开(那时很香)
LOSCFG_MEM_LEAKCHECK内存泄漏检查需记录每次分配的调用点,内存与性能开销都大长期运行稳定性验证阶段开
LOSCFG_MPU_ENABLEMPU 内存保护需按内存区逐个配权限,配错直接 MemManage Fault产品化做内存隔离/安全加固时 ⚠️ 开它必须同时把los_mpu.c加回 Makefile
LOSCFG_TEST测试套件依赖testsuits/与 host 测试框架,本工程跑不了需要跑官方测试用例时

📌白话领路:上面把每个 0 的理由讲清了。但"关宏"这件事本身还有三条铁纪律——比抄清单更重要,先刻进脑子,再去抄。

关宏的三条纪律(比抄清单重要):

  1. 关宏 ≠ 删源码。模块源码仍在内核里(如 MPU 的los_mpu.c在kernel_liteos_m/kernel/arch/arm/cortex-m4/gcc/,测试套件在kernel_liteos_m/testsuits/),只是不参与编译——改一行宏就能回来。
  2. 宏与编译清单必须成对。关掉X,就要把只被X用到的.c从 Makefile 剔除(本工程:LOSCFG_MPU_ENABLE=0↔ 剔除los_mpu.c)。反之开回来时也要成对加回——只改宏不加文件,链接期一堆undefined reference。
  3. 关之前先 grep 一遍。grep -rn "LOSCFG_XXX"看看有没有别的模块在#if分支里依赖它;有些宏关掉会顺带把别的模块 API 一起"关没了",报错现场离你改的宏十万八千里。

🚏第一站小结:每个=0都是"主动划掉"的菜(有判据、非漏写),换项目时该开的要开回来。关宏牢记三条纪律:① 关宏≠删源(改一行宏就能回来)② 宏与 Makefile 成对增减(否则undefined reference)③ 改前先grep依赖,防顺带关掉别的模块。

二、第二站·覆盖机制:你的配置怎么盖过内核默认

一句话理解:“你的配置能盖过内核默认”,靠的是编译器的头文件搜索顺序 + 内核末行那句 include。

本文件能"覆盖"内核默认配置,靠两件事:

  1. -I顺序:Makefile 里-Itargets/OS_CONFIG排在-Ikernel/include之前(-I是 GCC 头文件搜索路径选项,写在前面的目录优先被找)。内核los_config.h(实测第40行,文件共 822 行)#include "target_config.h"时,编译器先找到你工程侧的这一份。
  2. 内核自带这一行 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_CLOCK64 MHz时钟树的实际频率芯片手册时钟树;且与 CMSISSystemCoreClock必须相等
TICK_PER_SECOND1000(1ms)你要求的节拍精度应用需求;改它必须同步核对TICK_RESPONSE_MAX
HWI_LIMIT→OS_VECTOR_CNT32 → 48系统异常 16 +最大外设 IRQ 号芯片IRQn列表最大值
TSK_LIMIT8实际任务数 + 余量你的任务数 ×1.5,宁可略大
三档栈0x800/0x600/0x200默认/idle/最小局部变量 + 调用深度 + printf 缓冲实测栈水位,别拍脑袋
HEAP_SIZE0x14000(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 关)
MPUMemory Protection Unit,内存保护单元(给内存区设只读/不可执行权限)
los_mpu.cMPU 实现源文件(MPU_ENABLE=1 时必须加回 Makefile)
-IGCC 头文件搜索路径选项(写在前面的目录优先被找)
los_config.h内核总配置文件(第 40 行#include "target_config.h",靠-I顺序被工程覆盖)
OOMOut 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 · 全部版本标签

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询