Go 1.27.1 指针初始化新范式:用 new(expr) 消除 Agent 状态快照的样板代码与堆逃逸
2026/10/5 5:45:26
今天解决:程序卡住为何能自动复位?为什么不能在滴答里无脑喂?
独立的“倒计时”:
一直倒数 → 你必须在归零前“喂狗” 没喂到 → 硬件复位| 在哪喂 | 保护效果 |
|---|---|
| SysTick/滴答里一直喂 | 主循环死了也可能不复位(滴答还活着) |
| 所有关键任务都正常时才喂 | 主逻辑挂了才会复位 |
推荐:任务 A、B、C 都更新“新鲜时间戳”,都在允许窗口内才reload。
有的看门狗还要求“不能喂太早”,用来抓“跑太快/节奏乱”。
调试器单步时容易误复位,可临时关掉;发布前再打开并测复位路径。
#include"stm32f4xx.h"#include<stdbool.h>#include<stdint.h>voidwdt_init(uint32_treload){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(IWDG_Prescaler_64);IWDG_SetReload(reload);/* 按 LSI 与预分频算超时,查手册 */IWDG_ReloadCounter();IWDG_Enable();}voidwdt_feed(void){IWDG_ReloadCounter();}typedefstruct{uint32_tt0_ms,t1_ms,now_ms;uint32_twindow_ms;}health_t;boolsys_healthy(consthealth_t*h){return(h->now_ms-h->t0_ms<h->window_ms)&&(h->now_ms-h->t1_ms<h->window_ms);}voidmain_loop_step(consthealth_t*h){/* ... 各任务更新 t0/t1 ... */if(sys_healthy(h)){wdt_feed();}}| 误区 | 正解 |
|---|---|
| 中断里无脑喂 | 掩盖主逻辑挂死 |
| 超时设得很短 | 初始化没跑完就复位 |
| 看门狗打开就万事大吉 | 喂错地方等于没开 |
| 调试不测复位 | 上线后难查 |
作者:shuifanyu
标签:看门狗复位可靠性