5.9 Watchdog 设备
2026/7/19大约 3 分钟设备驱动驱动Watchdog看门狗系统可靠性
5.9 Watchdog 设备
📚 本节导读
学习时长:约 20 分钟
难度级别:⭐⭐☆☆☆
前置知识:第 5.1 节设备驱动框架
🎯 学习目标
- 理解看门狗的工作原理和分类
- 掌握独立看门狗(IWDG)和窗口看门狗(WWDG)的配置
- 掌握喂狗操作和超时处理
- 了解看门狗在系统可靠性中的作用
一、概述
Watchdog(看门狗)是一种硬件定时器,用于监控系统运行状态。OneOS 看门狗驱动位于 drivers/watchdog/,核心头文件 watchdog.h(第 47-57 行定义 os_watchdog_device 结构体和 os_watchdog_ops 操作接口)。
看门狗类型
| 类型 | 时钟源 | 特点 |
|---|---|---|
| 独立看门狗(IWDG) | 独立 RC 振荡器 | 独立于主时钟,系统时钟故障仍可工作 |
| 窗口看门狗(WWDG) | 系统时钟 | 必须在特定时间窗口内喂狗,更精确 |
二、核心数据结构
typedef struct os_device_watchdog
{
struct os_device parent; /* 继承自 os_device_t */
const struct os_watchdog_ops *ops; /* 看门狗操作接口 */
os_uint32_t timeout_ms; /* 超时时间(毫秒) */
os_bool_t is_running; /* 运行状态 */
} os_device_watchdog_t;三、核心 API
/* 打开/关闭看门狗设备 */
os_device_t *os_device_open(const char *name);
os_err_t os_device_close(os_device_t *dev);
/* 设置超时时间 */
os_err_t os_watchdog_set_timeout(os_device_t *dev, os_uint32_t timeout_ms);
/* 启动看门狗 */
os_err_t os_watchdog_start(os_device_t *dev);
/* 喂狗(刷新看门狗计数器) */
os_err_t os_watchdog_refresh(os_device_t *dev);
/* 停止看门狗(部分硬件支持) */
os_err_t os_watchdog_stop(os_device_t *dev);四、使用示例
#include <device.h>
#include <watchdog.h>
/* 看门狗喂狗任务 */
void watchdog_feed_task(void *arg)
{
os_device_t *wdg = (os_device_t *)arg;
while (1)
{
/* 定期喂狗,间隔需小于超时时间 */
os_watchdog_refresh(wdg);
os_task_msleep(500); /* 每 500ms 喂一次 */
}
}
void watchdog_demo(void)
{
os_device_t *wdg;
/* 打开看门狗设备 */
wdg = os_device_open("wdg");
if (wdg == NULL) return;
/* 设置 2 秒超时 */
os_watchdog_set_timeout(wdg, 2000);
/* 启动看门狗 */
os_watchdog_start(wdg);
os_kprintf("Watchdog started, timeout: 2s\r\n");
/* 创建喂狗任务 */
os_task_t *task;
os_task_create(&task, "wdg_feed", watchdog_feed_task,
wdg, OS_TASK_PRIORITY_NORMAL, 1024);
}五、使用建议
5.1 喂狗策略
- 独立任务喂狗:创建独立的喂狗任务,避免被异常任务阻塞
- 多任务联合喂狗:多个任务设置标志位,只有全部正常才喂狗
- 喂狗间隔:通常设置为超时时间的 1/3 ~ 1/2
5.2 调试注意事项
- 调试时暂停看门狗,避免断点导致系统复位
- 使用
OS_USING_WATCHDOG宏控制编译 - 生产环境务必启用看门狗
📝 本节小结
- 看门狗是系统可靠性的重要保障,防止系统死锁
- IWDG 独立于主时钟,WWDG 提供精确窗口控制
- 喂狗操作需在超时前定期执行
- 建议使用独立任务喂狗,避免被异常代码阻塞