STM32MP157-M4os_config 三板斧详解【高危前置提醒】Makefile 的-I路径中os_config必须放在最前链接脚本 lds 的堆地址ASSERT必须与target_config.h的LOSCFG_SYS_HEAP_ADDR严格一致。0 前言os_config/是 LiteOS-M 移植的板级配置隔离层。依靠 Makefile 头文件搜索优先级覆盖内核默认的los_config.h全程不修改内核源码仅包含 3 个固定配置文件。1 三个配置文件分工文件作用影响范围target_config.h系统时钟、SRAM 堆区、RTOS 功能总开关内核初始化、堆管理、tick 频率los_builddef.h中断向量表对齐参数g_hwiForm数组大小和内存对齐los_printf.h内核打印宏底层封装所有PRINT_ERR/PRINT_INFO宏2 target_config.h 完整模板逐项注释#ifndef_TARGET_CONFIG_H#define_TARGET_CONFIG_H/* 系统时钟 *//* M4 工程模式仅 HSI 64MHz 可用HSE 振荡器依赖 A7 域不可用 */#defineOS_SYS_CLOCK64000000UL/* 系统节拍 */#defineLOSCFG_BASE_CORE_TICK_PER_SECOND1000/* 1000Hz 1ms/tick */#defineLOSCFG_BASE_CORE_TIMESLICE_TIMEOUT10000/* 时间片超时 10ms */#defineLOSCFG_BASE_CORE_TICK_RESPONSE_MAX0xFFFFFFUL#defineLOSCFG_BASE_CORE_TICK_PER_SECOND_MINI1000/* 外部堆配置 *//* 堆起始 0x10014000Skip 0~0x14000(80KB) 给向量表代码数据BSS * 堆大小 128KB任务栈、队列、信号量全部从堆分配 * 注意必须与 lds 中 ASSERT(_ebss 0x10014000) 保持一致 */#defineLOSCFG_SYS_EXTERNAL_HEAP1#defineLOSCFG_SYS_HEAP_ADDR((void*)0x10014000U)#defineLOSCFG_SYS_HEAP_SIZE0x00020000U/* 中断向量表大小 *//* g_hwiForm 向量表项数 OS_SYS_VECTOR_CNT(16) LOSCFG_PLATFORM_HWI_LIMIT * STM32MP157 外设中断最多 150 号必须设 16032 会越界 HardFault */#defineLOSCFG_PLATFORM_HWI_LIMIT160/* 内核功能开关 */#defineLOSCFG_KERNEL_PM0/* 电源管理关闭 */#defineLOSCFG_BASE_CORE_SWTMR0/* 软件定时器关闭避免抢占首任务 */#defineLOSCFG_BASE_CORE_SWTMR_ALIGN0/* SWTMR0 时必须也为 0 */#defineLOSCFG_BASE_IPC_SEM1/* 信号量 */#defineLOSCFG_BASE_IPC_MUX1/* 互斥锁 */#defineLOSCFG_BASE_IPC_QUEUE1/* 消息队列 */#defineLOSCFG_BASE_CORE_TSK_MONITOR0/* 任务监控关闭节省 RAM *//* 内核打印 */#defineLOSCFG_KERNEL_PRINT_SWITCH0/* 无 UART 串口输出关闭 */#endif3 los_builddef.h 模板#ifndef_LOS_BUILDDEF_H#define_LOS_BUILDDEF_H/* 中断向量表对齐 512 字节STM32MP1 M4 要求 */#defineLOSCFG_ARCH_HWI_VECTOR_ALIGN512U#endif4 los_printf.h 标准模板#ifndef_LOS_PRINTF_H#define_LOS_PRINTF_H#includestdio.h/* 声明实际 UART 打印函数在 uart_printf.c 中实现 */externvoiduart_printf(constchar*fmt,...);/* do{}while(0) 包裹防止 if/else 语法断裂 */#definePRINT_ERR(fmt,...)do{uart_printf([ERR] fmt\r\n,##__VA_ARGS__);}while(0)#definePRINT_INFO(fmt,...)do{uart_printf([INFO] fmt\r\n,##__VA_ARGS__);}while(0)#endif##__VA_ARGS__是 GCC 扩展特性当可变参数为空时自动去掉前面的逗号避免编译报错。5 Makefile 头路径优先级原理# os_config 必须写在所有路径最前面 INCLUDES : -I$(PROJ_ROOT)/os_config # 优先级 1 ← 覆盖内核默认配置 INCLUDES -I$(PROJ_ROOT)/kernel_liteos_m/kernel/include # 优先级 2 INCLUDES -I$(PROJ_ROOT)/kernel_liteos_m/kernel/arch/include INCLUDES -I$(PROJ_ROOT)/kernel_liteos_m/kernel/arch/arm/cortex-m4/gcc INCLUDES -I$(PROJ_ROOT)/kernel_liteos_m/kal INCLUDES -I$(PROJ_ROOT)/Drivers/CMSIS/Include INCLUDES -I$(PROJ_ROOT)/Drivers/CMSIS/Device/ST/STM32MP1xx/Include INCLUDES -I$(PROJ_ROOT)/Core/Inc INCLUDES -I$(PROJ_ROOT)/Drivers/STM32MP1xx_HAL_Driver/Inc原理GCC 编译时按-I从左到右搜索头文件。los_config.h同时存在于os_config/板级配置和kernel_liteos_m/kernel/include/内核默认。因为os_config排第一编译器优先读取我们的配置。6 M4 SRAM 内存布局384KB⚠️ 本节踩坑速览现象根因修复自定义堆、时钟宏不生效os_config路径在 Makefile-I列表后置路径放 INCLUDES 首行PRINT 宏在 if/else 中编译报错未用do{}while(0)包裹语法断裂所有 PRINT 系列宏套 do-while 结构链接报 BSS overflowlds ASSERT 地址与target_config.h堆地址不一致两处地址同步为0x10014000los_builddef.h/los_printf.h找不到未添加-I os_config头路径INCLUDES 增加os_config搜索路径IRQ 越界 HardFaultLOSCFG_PLATFORM_HWI_LIMIT默认 32设为 160任务堆分配失败LOSCFG_SYS_HEAP_SIZE不足至少 128KB0x20000U