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 故障打印,实现死机可定位、故障可恢复。

相关推荐
Dr.kangder1 小时前
嵌入式处理器架构解析(十)——DSP+FPGA
fpga开发·架构·嵌入式
圆奋奋13 小时前
FreeRTOS学习(三)- 任务调度模块
学习·开源·freertos
不弃君15 小时前
在 Windows 上用 MinGW 搭建 lwIP 调试环境:方法与踩坑实录
windows·网络协议·tcp/ip·嵌入式·mingw·lwip
Embedded-Xin19 小时前
中间件—zenoh零基础入门
linux·中间件·rust·机器人·自动驾驶·嵌入式
橘色的喵20 小时前
ARM-Linux 嵌入式消息总线:高优先级驱逐机制设计
linux·arm开发·性能优化·嵌入式·newosp
橘色的喵21 小时前
ARM-Linux 嵌入式共享内存环形缓冲区:内存序的设计选择
linux·arm开发·性能优化·嵌入式·newosp
Dr.kangder2 天前
嵌入式总线设备解析——TTE总线应用与实践
开发语言·网络·算法·嵌入式·多任务·同步机制
平凡的小蚂蚁2 天前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
大辉狼_音频架构2 天前
第 01 篇:音频采样与量化 —— 从 I2S 帧到奈奎斯特定理
嵌入式·音视频开发