看门狗不该只是定时喂

看门狗不该只是定时喂

本文字数:395  阅读时长:1分钟

访客数:加载中... | 阅读量:加载中...

把 wdt_feed() 放进内核定时器里,是很多固件的默认写法。问题是:定时器在中断上下文跑,哪怕所有线程都死锁,它照样按时喂狗,看门狗退化成"只检测 HardFault"。

改成报到 + 监督

每条关键线程在自己的循环里写一个时间戳(atomic_set,ISR 安全、无锁),监督线程按周期检查"谁的年龄超过窗口",只有全部新鲜才喂狗。

  • 报到不能走 zbus:每次心跳都触发一次发布/回调,会把热路径做热,用原子变量就够。
  • 监督线程的优先级要低于被监督线程,否则它自己抢 CPU 造成误判。
  • “必需模块"要由初始化结果决定:USB 没起来就别把它算进去,否则外设故障会变成复位循环。

窗口怎么定

检查周期取超时时间的 1/16,窗口取周期的 4 倍。这样单次调度抖动不会误复位,而真正的卡死最多晚一个窗口被发现。

日志只在"陈旧集合变化"时打一条,避免刷屏掩盖现场。