Files
STM32F4-Base/App/util
wandering1 73941da6b1 看门狗判定状态机增加主机侧单元测试(L0.5 层)
为 task_watchdog.c 的判定逻辑(位图取走清零 / 必需掩码 0x37 判定 /
miss_streak 连续 8 次停喂 / 100ms 抽样节流 / tick 回绕安全)补一层
主机侧纯逻辑单元测试,弥补此前只能靠真机或模拟器才能发现回归的空白。

架构(沿用项目既有"共享核心 + 平台后端"做法,参照 cfg_file_store):
- task_watchdog.h 末段新增"平台后端(内部)"声明 3 个钩子
  (wd_platform_feed / _start / _tick_ms),MCU 端以 __weak 提供默认实现,
  行为与重构前逐字一致(@build 0 错误 0 警告,Flash +20B)。
- 主机侧单测以同名强符号覆盖三钩子,即可离线注入/观测,无需碰 MCU 代码。
- 测试文件 #include 生产源文件本身,保证测的是真代码而非副本。
- 测试专用复位 task_wd_test_reset() 仅 TASK_WATCHDOG_UNIT_TEST 下编入,
  MCU 构建零代码零符号。

测试(test/host/watchdog/,MSVC 离线编译,纯标准库驱动):
- 39 项断言全过(退出码 0);注入故障可复现退出码 1。
- run_unit_test.py 直接拼 INCLUDE/LIB 调 cl.exe,绕开本机被禁的 reg.exe。
- stub/ 三桩头覆盖 main.h / iwdg.h / dbg_log.h。

门禁:pre-commit 新增 watchdog-unit-test 本地钩子(L0.5 层),仅被测文件
或其测试变动时触发;测试开发标准流程.md 新增 L0.5 层说明。

顺带改善:task_watchdog.c 的节流基线 s_last_tick 由函数内 static 提为文件
static(可测性 + 模块状态归一)。
2026-10-01 06:57:01 +08:00
..

App/util/ — 通用工具函数

平台无关的纯工具模块(无 FreeRTOS 依赖、无硬件依赖),可在 MCU 与 PC 模拟器中共用。

文件一览

文件 作用
crc.c/h 校验算法(CRC16/CRC32 等,供 RS-485 协议与数据校验使用)
ringbuf.c/h 环形缓冲(SPSC 无锁环形队列,用于串口/数据流收发)
sys_clock.c/h 墙钟时间管理:RTC 基准、tick 回绕防护、每 30 天惰性再基准化
task_watchdog.c/h 独立看门狗(IWDG)判定状态机:任务心跳位图 + defaultTask 单一喂狗者

设计要点

sys_clock

  • 以 SD2506 RTC 为基准,HAL tick 计数补齐亚秒精度
  • 49.7 天 tick 回绕防护:每 30 天惰性再基准化(sys_clock_get 内部触发)
  • RTC 故障时降级到默认时间基准并返回 -1,触发"时钟芯片异常"自检上报
  • 设计详见 docs/子系统设计/系统墙钟时间维护说明.md

ringbuf

  • 单生产者单消费者(SPSC)无锁设计,配合 DMA/中断收发
  • 容量为 2 的幂,用掩码取模(避免除法开销)

task_watchdog

  • 任务心跳位图:各任务只置位(task_wd_beat),校验者取走并清零(单字原子,无锁)
  • 单一喂狗者:defaultTask 每 100 ms 抽样判定,仅当位图等于必需掩码时才喂狗
  • 硬件访问收敛:IWDG 寄存器与 HAL_GetTick() 经 wd_platform_* 弱钩子访问 (声明在 task_watchdog.h 末段),MCU 端为 __weak 默认实现,主机侧单测以同名强符号覆盖 → 可在 PC 上跑纯逻辑回归
  • 设计详见 docs/子系统设计/看门狗设计说明.md;单测见 docs/测试说明/看门狗单元测试说明.md

相关文档

  • docs/子系统设计/系统墙钟时间维护说明.md
  • docs/子系统设计/看门狗设计说明.md
  • docs/测试说明/看门狗单元测试说明.md