51bc325b57
既有债收口(非新引入):B7 定值持久化把 defaultTask 静态最坏链推到 3016 B、timeSyncTask 推到 1264 B,两者跌破 stack_report 判据 (余量 >= max(1024 B ISR, 配置 x 30%))。本轮只抬栈,不动调用链。 前基线(stack_report,9 任务): - defaultTask cfg 4096 B / 静态 3016 B / 余 1080 B (26%) FAIL - timeSyncTask cfg 2048 B / 静态 1264 B / 余 784 B (38%) FAIL - 其余 7 任务 PASS(net 2112/1728、ftp 1456/2640、ui 1336/15048、 test 736/7456、adc 1320/1240、iec104 1456/1104、protect 872/1176) 改动: - defaultTask 1024 -> 1280 words(4096 -> 5120 B):余 2104 B / 41% - timeSyncTask 512 -> 640 words(2048 -> 2560 B):余 1296 B / 50% - 后基线:9 任务 0 FAIL(stack_report 退出码 0) 堆开销(任务栈来自 FreeRTOS 堆,.map 静态数字不变): - defaultTask +1024 B、timeSyncTask +512 B,合计 +1536 B - 台架背书基线 heap free=17936 / min_ever=10000 B(B6),抬后 min_ever 预计 ~8464 B,仍远高于 3072 B 告警线 防丢失(CubeMX 存活 L1 纪律): - STM32F407-Demo.ioc 的 FREERTOS.Tasks01 同步改 1024 -> 1280 (.ioc 是 CubeMX 生成任务栈值的事实源,未跑重生成) - Src/freertos.c 生成区 .stack_size 与 .ioc 保持一致 - USER CODE BEGIN Variables 核算注释块补 N-33 依据(栈值理由唯一落点) - .cubemx_survival_baseline.json 经 --write 重建(仅 ioc-task-stacks 一行) task-table 生成区随栈变更再生成(README.md + AGENTS.md 的 TASK_TABLE 锚点区各 2 行,锚点区外无任何改动)。 验证:@build 0 错误 0 警告(Program Size 与改前逐字节一致); ci_local 全绿(L0 + L0.5,826/826 断言);stack_report 前后各跑一次。 台架 @test 与串口 [STACK] 水位复测在提交后单独跑。
Src/ — CubeMX 生成的源文件
⚠️ 本目录文件由 STM32CubeMX 生成(
.ioc重生成会覆盖),不是自研代码。 但允许在USER CODE BEGIN/END标记区之间写自定义代码。
文件一览
| 文件 | 生成 | 作用 |
|---|---|---|
main.c |
CubeMX | 程序入口:HAL_Init → SystemClock_Config → 外设初始化 → app_main_init → osKernelStart |
freertos.c |
CubeMX | FreeRTOS 任务创建(MX_FREERTOS_Init)+ 任务栈/优先级定义 |
gpio.c / dma.c / spi.c / i2c.c / usart.c |
CubeMX | 各外设 MX_xxx_Init |
stm32f4xx_hal_msp.c |
CubeMX | HAL 外设底层初始化(时钟使能、NVIC、引脚复用) |
stm32f4xx_hal_timebase_tim.c |
自研覆盖 | HAL 时基改用 TIM7(非 SysTick),tick = 1ms |
stm32f4xx_it.c |
CubeMX | 中断服务函数(ISR) |
system_stm32f4xx.c |
CMSIS | 系统时钟初始化(SystemInit) |
⚠️ 修改约定(铁律)
- 自定义代码只写
USER CODE BEGIN xxx/USER CODE END xxx标记区之间—— 标记区外的内容在 CubeMX 重新生成时会被无条件覆盖丢失 - 本目录被 pre-commit 的 C 代码规范检查排除(因是生成代码,风格不受控)
Drivers/BSP/才是纯手工代码区;应用逻辑放App/
关键点
- HAL 时基 = TIM7,不是 SysTick;FreeRTOS 用 SysTick 之外的方式,tick = 1ms
- NVIC 4 位优先级分组;外设中断优先级 ≥ 5(0~4 预留给 FreeRTOS)
- 时钟:HSE 8MHz → PLL M=4/N=168/P=2 → 168MHz
相关文档
- 架构全景:
docs/架构设计/项目架构总览.md - 启动顺序:
docs/架构设计/项目启动顺序管理.md - 任务表(唯一事实源 =
freertos.c):根README.md