FreeRTOS看门狗任务设计---软件看门狗 + 硬件 IWDG 双保险实现

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏》《Ai智能体专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、硬件独立看门狗与软件看门狗原理概述

1.1、硬件看门狗(IWDG)原理

1.2、软件看门狗原理

二、整体工作流程时序图

三、核心配置与数据结构

3.1、关键变量

3.2、关键接口函数

总结


前言

在前几期博客中,我们已经完成了机器人的下位机通信任务、运动控制任务、传感器采集任务、数据上报任务、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 故障打印,实现死机可定位、故障可恢复。

相关推荐
与你40317 小时前
CLion 中为什么要重写 _write,而不是 fputc?
嵌入式
桃蹊、19 小时前
FreeRTOS(二)之堆和栈:内存基础入门
freertos·内存管理··
Freak嵌入式20 小时前
MicroPython 开发避坑:用 Signal 类解决不同电路的电平兼容问题
嵌入式
桃蹊、20 小时前
FreeRTOS(四)之任务管理(上):创建、删除与任务参数
freertos·任务·task·创建任务
智码看视界1 天前
Edge AI 全栈1:ESP32 传感器采集到云端大模型推理的完整链路
人工智能·物联网·嵌入式·esp32·aiot·全栈开发·edgeai
Freak嵌入式2 天前
告别硬件差异!MicroPython Signal 类:让你的 GPIO 代码跨板运行无压力
嵌入式
v_for_van2 天前
C语言__attribute__
服务器·c语言·开发语言·mcu·嵌入式·嵌入式实时数据库
xx~t2 天前
嵌入式——进程与线程1
linux·c语言·学习·嵌入式·进程与线程
潘潘的嵌入式日记3 天前
协议旧指令该不该删?4 个检查决定删除还是保留兼容
重构·嵌入式·协议·经验·代码维护
论迹复利3 天前
PendSV与RISC-V trap——上下文切换的两种设计哲学
内核·freertos·risc-v