把 wdt_feed() 放进内核定时器里,是很多固件的默认写法。问题是:定时器在中断上下文跑,哪怕所有线程都死锁,它照样按时喂狗,看门狗退化成"只检测 HardFault"。
改成报到 + 监督
每条关键线程在自己的循环里写一个时间戳(atomic_set,ISR 安全、无锁),监督线程按周期检查"谁的年龄超过窗口",只有全部新鲜才喂狗。
- 报到不能走 zbus:每次心跳都触发一次发布/回调,会把热路径做热,用原子变量就够。
- 监督线程的优先级要低于被监督线程,否则它自己抢 CPU 造成误判。
- “必需模块"要由初始化结果决定:USB 没起来就别把它算进去,否则外设故障会变成复位循环。
窗口怎么定
检查周期取超时时间的 1/16,窗口取周期的 4 倍。这样单次调度抖动不会误复位,而真正的卡死最多晚一个窗口被发现。
日志只在"陈旧集合变化"时打一条,避免刷屏掩盖现场。
- 本文链接: https://graveblog.cn/p/watchdog/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
