E
Member
板子跑着跑着自己复位,查 log 是看门狗复位,但代码里明明喂了狗。这种"灵异复位"一般是这几个原因:
1. 喂狗放在中断里,主循环卡死照样喂
最常见的错误:把喂狗写在 SysTick 中断里,主循环死锁了中断还在跑,狗永远饿不死。喂狗必须放在主循环的关键路径上,或者喂狗前检查任务心跳。
2. 喂狗间隔抖动太大
独立看门狗超时时间是固定的,如果主循环某次执行时间波动大(比如偶发的大数据量处理),就会偶发复位。实测主循环最坏执行时间,超时时间留 2 倍以上余量。
3. 上电/低功耗模式没处理好
从 Standby 唤醒后看门狗状态、时钟源可能变了,唤醒流程里要重新初始化看门狗。独立看门狗一旦使能就停不下来,进低功耗前要算好账。
4. 窗口看门狗喂早了也复位
窗口看门狗不光不能晚喂,还不能喂太早。喂狗时机必须落在窗口期内,中断里随手喂狗反而会触发复位。用窗口看门狗的场景,喂狗点要精心设计,别图省事。
5. 复位原因要记录
复位后第一时间读复位标志寄存器,区分是上电复位、软件复位还是看门狗复位,存到 Flash 里。没有复位原因记录,查灵异复位就是盲人摸象。
你们项目里看门狗一般配多长的超时?欢迎交流。
1. 喂狗放在中断里,主循环卡死照样喂
最常见的错误:把喂狗写在 SysTick 中断里,主循环死锁了中断还在跑,狗永远饿不死。喂狗必须放在主循环的关键路径上,或者喂狗前检查任务心跳。
2. 喂狗间隔抖动太大
独立看门狗超时时间是固定的,如果主循环某次执行时间波动大(比如偶发的大数据量处理),就会偶发复位。实测主循环最坏执行时间,超时时间留 2 倍以上余量。
3. 上电/低功耗模式没处理好
从 Standby 唤醒后看门狗状态、时钟源可能变了,唤醒流程里要重新初始化看门狗。独立看门狗一旦使能就停不下来,进低功耗前要算好账。
4. 窗口看门狗喂早了也复位
窗口看门狗不光不能晚喂,还不能喂太早。喂狗时机必须落在窗口期内,中断里随手喂狗反而会触发复位。用窗口看门狗的场景,喂狗点要精心设计,别图省事。
5. 复位原因要记录
复位后第一时间读复位标志寄存器,区分是上电复位、软件复位还是看门狗复位,存到 Flash 里。没有复位原因记录,查灵异复位就是盲人摸象。
你们项目里看门狗一般配多长的超时?欢迎交流。
