7feeea6c56
经 CubeMX 图形界面启用 IWDG(Prescaler=64 / Reload=1249,标称 2498ms /
最坏 1701ms),并落地心跳位图判定、各任务埋点、RCC_CSR 复位原因上报与
configASSERT 改造。重生成覆盖的既有定制已全部恢复。
P0(开机死循环):HAL_IWDG_Init() 内部立即启动看门狗,而 CubeMX 把
MX_IWDG_Init() 插在 app_main_init() 之前——该段 NAND/RTC/ADC 初始化耗时
数秒无喂狗点,按 2.5s 超时必然复位。改 Src/iwdg.c 为只填参数不启动,
启动移交 task_wd_start(),由 defaultTask 在存储 bring-up 完成后调用。
恢复的三处定制(重生成覆盖):
- Src/stm32f4xx_it.c:HardFault_Handler 崩溃现场采集被打回空 while(1)
- Inc/FreeRTOSConfig.h:栈溢出检测与堆失败钩子两个宏被整块删除
- Src/freertos.c:三处任务栈实测记录中文注释丢失(数值未丢)
新增:
- App/util/task_watchdog.{c,h}:心跳位图 + 抽样判定 + IWDG 延后启动
- time_sync.c 长等待切片:net_recv_to 单次可睡满 30s 预算,切成 200ms 片
- Src/main.c 复位原因锁存(读后即清 RMVF,防残留误判)
埋点:defaultTask(唯一喂狗者)/ netTask(含 PHY 等待循环)/ uiTask /
timeSyncTask。ftpTask 首期剔除掩码,待二期改 lftpd。
门禁:build 0 错误 0 警告;pre-commit 10 钩子全通过;Flash +2956B / RAM +40B。
App/sync/ — 时间同步
墙钟时间与外部时间源的同步(timeSyncTask)。墙钟本身由
../util/sys_clock.c维护, 本目录负责从时间源拉取/接收时间并校准。
文件一览
| 文件 | 作用 |
|---|---|
time_sync.c/h |
时间同步任务:等待网络就绪 → 与时间源交互 → 校准墙钟 |
工作流
timeSyncTask 启动
↓ osEventFlagsWait(SYS_EVT_NET_READY, ...|osFlagsNoClear) // 状态位不可消费!
time_sync 主循环 → 与时间源通信 → sys_clock 校准
↓
置 SYS_EVT_TIMESYNC_READY
⚠️ 等待就绪位(
SYS_EVT_NET_READY)必须osFlagsNoClear——它是状态位, 用默认消费型等待会把它清掉,导致后续消费者(如 ftpTask)永远等不到。
相关文档
docs/子系统设计/系统墙钟时间维护说明.md— 墙钟基准 / tick 回绕防护test/host/time_sync_server.py— PC 端对时推送服务(测试用)docs/架构设计/项目启动顺序管理.md— 就绪屏障