13a4e61c27
新增 App/algo/adc_health.c/h(纯逻辑判定层,零平台依赖免桩单测): - 静默:两侧帧序号连续 >=100ms 无前进(电平位可自愈,flags() 为 L5-4 闭锁预留) - 丢帧:TPAFE 序号一次前进 >1 计 tgap(与 STM32 侧 adc1_gap 对称,边沿事件) - 单调性:序号倒退锁存位;tick/计数差值法 (int32_t)(a-b) 回绕安全 - 错误增量:FRSTDATA / HAL 错误 / STM32 停摆计数增量,事件位与锁存位编号对齐, 消费者按位图做"每类每次开机留痕一次"编排 adc_task.c v2.9 告警编排(判定与编排分离):严重事件/电平上升沿 DBG_ERROR + SYSLOG_SELFTEST(每类每次开机一次防刷屏),下降沿 DBG_INFO 恢复;gap 不告警 (消费者超拍是已知现象,告警会淹没真故障);心跳行增 tgap 观测字段。 主机单测 test/host/adc_health/ 31 用例全绿(100ms 门限两侧 / 边沿语义 / 倒退锁存 / tick 回绕 / NULL 守卫 / init 幂等),登记 adc-health-unit-test 钩子。 台架 @test PASS:零 [ERR](健康不误报)、tgap=1->2 与 adc1_gap 同步可见、 frames 1000.0 Hz;证据 boot_log_data/20261011_prod_adc_health_boot_log.txt。 抬栈:adc_health_report->syslog_post 控制台回显尾使 adcTask 静态最坏链 832->1080 B(512 words 余 968 B < 1024 B ISR 底线)-> 512->640 words, 复测余 1480 B / 57%,堆 min_ever 7152->6640 B(-512 B 符合预算)。 AGENTS/README 任务表、RAM 方案 §2.3、规划文档 §3.1 L1-6 已同步置完成。
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