
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》
❄专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连
目录
总结
前言
在前几期博客中,我们已经完成了机器人的下位机通信任务、运动控制任务、传感器采集任务、数据上报任务、MonitorTask系统监控任务、异步 LogTask日志任务的全业务多任务架构搭建。
在多任务系统中,我们得保证各关键任务都在正常运行。一般常用软件看门狗机制,让各任务周期性向专门的监测任务报告 "心跳" 状态,由监测任务汇总信号后刷新硬件看门狗。
本篇博客我们就来实现一下软件看门狗 + 硬件独立看门狗IWDG双保险方案,任何一个关键任务异常都会触发系统自动复位,同时配合LogTask的 PANIC 故障打印,实现死机可定位、故障可恢复。
一、硬件独立看门狗与软件看门狗原理概述
1.1、硬件看门狗(IWDG)原理
在 STM32 等 MCU 中,独立看门狗是一种专用硬件定时器模块,其核心特点与工作机制如下:
独立时钟源:自带低速RC时钟(LSI),即使CPU主时钟失效,看门狗仍可正常运行,不受系统时钟故障影响。
递减计数机制:内置12位递减计数器,若计数器递减至0前未执行 "喂狗"(刷新)操作,定时器将溢出并触发系统复位。
通俗理解:看门狗如同 "饥饿的狗",必须定期喂食(喂狗),否则将触发报警(复位 MCU),以此强制恢复系统运行状态。
1.2、软件看门狗原理
在 FreeRTOS 多任务系统中,为避免单一任务阻塞导致的误复位,常采用 任务心跳监测 + 硬件看门狗的软件看门狗机制,实现对所有关键任务的全面监控:
任务心跳上报:所有低优先级应用任务 定期向专门的监测任务发送 "心跳" 信号,报告自身存活状态。
集中监测与喂狗:最高优先级的监测任务 汇总所有心跳信号,仅当全部任务 均在规定时间内完成上报时,才调用 IWDG 刷新函数喂狗。
异常处理逻辑:若任一任务因卡死、阻塞或优先级过低无法执行心跳上报,监测任务将识别异常并停止喂狗,最终触发硬件看门狗复位。
该机制有效避免了单一任务短时延时导致的误复位,实现了对多任务运行状态的精准监控,大幅提升了系统可靠性。
二、整体工作流程时序图

三、核心配置与数据结构
cpp
/* 看门狗-任务超时时间配置 */
#define IWDG_TIMEOUT_COMM_MS (1000U) // 通信任务
#define IWDG_TIMEOUT_CONTROL_MS (300U) // 控制任务(最严格)
#define IWDG_TIMEOUT_SENSOR_MS (500U) // 传感器任务
#define IWDG_TIMEOUT_UPLINK_MS (1000U) // 数据上报任务
#define IWDG_TIMEOUT_LOG_MS (1000U) // 日志任务
#define IWDG_TIMEOUT_MONITOR_MS (1000U) // 监控任务自身
这是每个任务允许的最大无响应间隔,若某任务心跳间隔超过了此值,系统就认为异常,触发复位。
3.1、关键变量
cpp
g_lastKickTick[]:上次 "喂狗" 时间戳
g_timeoutTick[]:每个任务的超时上限(tick)
g_watchEnable[]:是否启用监控(避免初始化早期误判)
g_taskHandle[]:用于标识哪些任务被纳入监控范围
3.2、关键接口函数
cpp
IWDG_TaskInit(...):系统初始化时注册各任务句柄,并设置超时时间与初始心跳时间。
IWDG_Heartbeat(id):被监控任务需定期调用此函数,报告 "我还活着"。
IWDG_WatchEnable(id, true/false):动态开启 / 关闭某个任务的监控功能,适合延迟初始化完成后的任务。
总结
本篇博客我们就来实现一下软件看门狗 + 硬件独立看门狗IWDG双保险方案,任何一个关键任务异常都会触发系统自动复位,同时配合LogTask的 PANIC 故障打印,实现死机可定位、故障可恢复。