67d26ac37a
第二次重生成验证了审计机制,并证伪了上一轮的一处假设: - 审计脚本 check_cubemx_survival.py 准确检出全部 5 处覆盖(16 项中 5 FAIL), 机制有效;Src/main.c 复位原因锁存(USER CODE BEGIN Init 区)完好, 是"USER CODE 区有效"的正向证据。 - 关键发现:CubeMX 本次换了一代中断函数模板(旧 HardFault_Handler / HardFault_Report 自造区 → 新函数体内 HardFault_IRQn 0 / W1_HardFault_IRQn 0), "生成区之外的自造标记区"同样不被保留,旧假设被证伪。 恢复方案(第二次升级): - stm32f4xx_it.c:报告实现迁入 USER CODE BEGIN 0(区名从未变过的标准保护位); Handler 本体改为生成区整函数替换,用 #define HardFault_Handler HardFault_Handler_Gen 把生成实体改名保留,链接器自动移除(.map 实证 Removing ... (2 bytes)),向量表指向手工 __asm 版(0x080001a1,18 字节)。 - iwdg.c:去掉 HAL_IWDG_Init() 调用,补 IWDG-DEFER-START-ANCHOR 锚点注释。 - FreeRTOSConfig.h:恢复 FREE_RTOS_CONFIG_HARDENING 块(两个加固宏)。 - freertos.c:补回两处任务栈中文注释(栈值未丢,.ioc 已同步)。 配套: - check_cubemx_survival.py:hardfault-handler 改 wholefile + 锚点检查; UNPROTECTED_LEGACY 清单更新。 - AGENTS.md:新增"CubeMX 换模板"与"ARMCC 内联汇编语法"两条铁律, 以及"uvprojx 被 Keil 自动改写不入库"条目。 - 看门狗设计说明.md:§10.1 补第二次重生成验证结论与模板换代发现, §10.2 L2/L3 全面改写(自造区名不可依赖)。 验证:@build 0 错误 0 警告;pre-commit 13 钩子全通过;审计 16 通过 / 2 警告 / 0 失败。
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