MCU/CPU/*PU的 WatchDog/看门狗 使用注意事项

类比于 Heartbeat/心跳 检测多用在软件及服务领域,

WatchDog/看门狗 多用在硬件与系统领域(硬件看门狗),

也有用在软件与应用及服务领域的(软件看门狗)。

“喂狗”即“心跳探活”, 系统分三部分:

  • 监控部分: 有规律性的心跳检测,
  • 响应部分: 硬件/系统或进程/服务/应用/任务 的心跳响应,
  • 异常处理部分: 看门狗/心跳 检测异常时触发的机制与行为,

    例如触发硬件中断或系统软件中断,硬重启(冷启动)与软重启(热启动)。

回到顶部

前言

最近因为项目产品硬件设计有问题,导致设计的一款产品把硬件电源开关以及硬件系统复位功能去掉了。

更严重的是,这产品已经开始生产了,硬件已经无法修改,

所以软件必须上看门狗,否则设备死机或是异常后就只能拆设备拔电池复位了。

关于看门狗在低功耗场景的应用,几个问题点可以提前思考:

在看门狗初始化之前系统异常了会怎样?软件独立看门狗与硬件独立看门狗它们有什么区别?

如果异常不可避免,有没一个地方可以缓存设备状态,系统异常复位后状态不被清除。

选项字节里开启硬件看门狗与软件代码开启有什么区别?

看门狗是在中断过程喂狗还是在主程序中喂狗比较好?

​看门狗初始化可以放到时钟初始化之前么?如果时钟死掉了,看门狗还能正常工作么?

低功耗深度休眠后还需要喂狗么?如果需要,要怎么设计?使用什么唤醒设备喂狗?

回到顶部

(一)看门狗分类

看门狗的分类,根据实现方式的不同,可以分为软件看门狗和硬件看门狗:

  • 软件看门狗:通过软件实现的一种机制,通常由系统中的软件来设置和管理
  • 硬件看门狗: 嵌入在处理器或芯片中的专用硬件模块

根据使用方式的不同,又可以区分为独立看门狗和窗口看门狗

  • 独立看门狗: 独立看门狗通常用于监控整个系统的运行状态,而不特定于某个任务或进程;

    当系统故障,死锁,无响应时,应用程序无法正常喂狗,看门狗超时从而产生复位。
  • 窗口看门狗: 窗口看门狗更专注于监控特定任务或进程的运行状态,并在特定的时间窗口内完成。

    比如在某个任务执行时间要求非常高,可以使用窗口看门狗,

    它有一个时间窗口,如果太早喂狗和太晚喂狗,都会产生异常,

    正因为它喂狗时间有个时间窗口,所以才叫窗口看门狗。

软件独立看门狗与硬件独立看门狗的区别:

软件独立看门狗通过软件初始化,可以通过关闭时钟以关闭。

如果在设备上电到初始化看门狗之前系统异常,看门狗是不生效的,这种情况多出现在软件初始化的时候异常。

硬件独立看门狗通过烧录器烧录的时候配置,或者是通过软件程序修改选项字节里面参数进行修改。

硬件独立看门狗一旦配置好,上电的时候开始生效并且无法关闭,除非重新修改配置项参数。

硬件独立看门狗开启之后,硬件时钟会自动开启并且无法关闭。

休眠唤醒喂狗

超低功耗设备的*PU处理器多是深度睡眠模式以达到省功耗的目的;此模式状态的看门狗还是在正常运行的。

即在深度休眠模式,还是需要有规律的唤醒设备进行喂狗。

我使用的硬件内核带有独立看门狗IWDG和窗口看门狗WDG。

其中,独立看门狗和窗口看门狗,还有软件和硬件的区别,主要差异是在看门狗的启动方式上不同。

下面我们的介绍,主要针对独立看门狗。

(二)启动看门狗

看门狗的启动有多种方式:

  • 通过接口设置启动
  • 直接设置寄存器启动
  • 设置Setting/Config Bits的Flags(选项字节启动)

设置Setting/Config Bits的Flags(选项字节启动)

MCU内部有一个小的flash,有个FLASH user option可以设置MCU的一些配置参数包括看门狗参数。

注意这些参数是可以通过烧录器在烧录的时候就把参数配置进去,即硬件级全局配置。

对于已经烧录的设备,可以通过写选项字节的方式把IWDG_SW置位或是重置。

直接设置寄存器启动

直接往Datasheet上公开的*WDG寄存器地址写入对应参数使能IWDG, 例:

void init_wtd(void)

{

volatileu int32_t *IWDG_KR_ADDR = (volatileuint32_t *)0x40003000UL;

volatileu int32_t *IWDG_PR_ADDR = (volatileuint32_t *)0x40003004UL;

volatileu int32_t *IWDG_RLR_ADDR = (volatileuint32_t *)0x40003008UL;

*IWDG_KR_ADDR = 0x5555;

*IWDG_PR_ADDR = 0x03;

*IWDG_RLR_ADDR = 0xF40;

}

实际IWDG是有四个寄存器,还有一个IWDG_PR,

如果不初始化时钟,看门狗不会启动的,即使设置完看门狗也是不会启动。

如果要使能时钟,可以添加时钟设置语句:SET_BIT(RCC->CSR, RCC_CSR_LSION);

直接设置寄存器有一个好处,就是在boot中, 因为对代码量要求比较高,可以比较精简的实现功能。

通过接口设置

可以直接参考官方sample进行初始化:

IWDG_HandleTypeDef IwdgHandle;

HAL_Init();

/##-3- Configure & Start the IWDG peripheral ########/

IwdgHandle.Instance = IWDG;

IwdgHandle.Init.Prescaler = IWDG_PRESCALER_32;//T=1MS

IwdgHandle.Init.Reload = (1000); //1ms1000=1s

IwdgHandle.Init.Window = IWDG_WINDOW_DISABLE;

if(HAL_IWDG_Init(&IwdgHandle) != HAL_OK)

{

/
Initialization Error */

Error_Handler();

}

需要特别注意,因为IWDG是依赖于LSI时钟的,在HAL_IWDG_Init 函数调用之前必须先打开LSI时钟。

以上官方给的sample,是在HAL_Init()中把LSI时钟打开的

MCU/CPU/*PU的 WatchDog/看门狗 使用注意事项的更多相关文章

  1. android -- WatchDog看门狗分析

    在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生 ...

  2. 服务器watchdog看门狗的理解

    1.什么是watchdog?watchdog,中文名称叫做“看门狗”,全称watchdog timer,从字面上我们可以知道其实它属于一种定时器.然而它与我们平常所接触的定时器在作用上又有所不同.普通 ...

  3. Resin 的watchdog(看门狗)介绍和resin负载均衡实现

    为了稳定和安全,Resin使用一个独立的watchdog进程来启动和监视Resin服务器.watchdog连续你检测Resin服务器的状态,如果其没有反应或者迟钝,将会重启Resin服务器进程.大多数 ...

  4. 基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读

    本文将介绍看门狗驱动的实现. 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行"喂狗“,如 ...

  5. 【分享】iTOP-iMX6UL开发板驱动看门狗 watchdog 以及 Linux-c 测试例程

    iTOP-iMX6UL开发板看门狗测试例程,iTOP-iMX6UL 开发板的看门狗驱动默认已经配置,可以直接使用测试例程. 版本 V1.1:1.格式修改:2.例程修改完善,其中增加喂狗代码.1 看门狗 ...

  6. 在多任务(RTOS)环境中使用看门狗

    最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章.从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁.为了阅读方便,有些航天领域名词 ...

  7. tiny4412 裸机程序 三、关闭看门狗和调用C程序【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37112779 一.原理说明 上是章中大家可能有会觉得奇怪,CPU不是有看门狗嘛?为什么CPU没有 ...

  8. 【分析笔记】Linux gpio_wdt.c 看门狗设备驱动源码分析

    基本原理 该看门狗的设备驱动实现原理很简单,比较主要的有两点: 一.定时器喂狗 通过定时器根据配置文件配置的喂狗方式(如脉冲切换.电平切换),对指定的 gpio 进行脉冲切换或电平切换实现喂狗. 脉冲 ...

  9. 给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用   配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...

  10. 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...

随机推荐

  1. 前端 Vue 后端返回流,前端通过流进行下载

    前端写法 //文件下载 async handleDownload(row) { try { // 假设文件是通过 GET 请求获取的,url 为文件资源的 API 地址 const response ...

  2. 银河麒麟系统 jenkins docker 部署 自动化打包部署git 项目

    Jenkins 是一个开源的自动化服务器,主要用于实现 持续集成(CI) 和 持续交付/部署(CD),其核心作用在于通过自动化流程提升软件开发和交付的效率与质量 一.环境准备 1. 安装 Docker ...

  3. 6.4K star!企业级流程引擎黑马,低代码开发竟能如此高效!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 AgileBPM 是一个基于Activiti7深度优化的企业级流程引擎开发平台,支持低代码. ...

  4. DeepSeek又在节前放大招!

    写在前面 事情是这样的,就在五一假期开始前夕,DeepSeek放出了模型DeepSeek-Prover-V2-671B: 这是延续了节假日狂飙的传统?   言归正传,我们看看这次放出了哪些核心技术. ...

  5. 基于Vue3搭建ChantGPT前后端端源码及搭建教程-官方接口

    ChantGPT很多,网上很多说的ChantGPT搭建及源码都是假的,无法使用的,自己研究了好几天,搞定了基于Vue3搭建ChantGPT前后端端源码及搭建教程,现在分享出来,有喜欢的朋友自行下载搭建 ...

  6. java基础之“深复制和浅复制的区别”

    一.浅复制 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都任然指向原来的对象. 二.深复制 深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用对象 三.举例 产品 ...

  7. 深度解析大厂vue 高频面试题(附答案)

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  8. IPO——LeetCode⑫

    //原题链接https://leetcode.com/problems/ipo/ 题目描述 Suppose LeetCode will start its IPO soon. In order to ...

  9. [Redis] Redis (7) 连接与会话管理

    序:文由 因今日排查问题,发现微服务因 ERR max number of clients reached (已达到客户端的最大数量) redis异常,而导致服务在健康检测时未通过,进而导致高频宕机. ...

  10. curl ifconfig.me 查看Linux服务器公网IP地址

    命令作用:curl ifconfig.me 用于查看Linux服务器公网IP地址. 使用场景:配置Linux服务器IP白名单的时候,需要知道服务器的IP地址,这就到此命令大显身手的时候了.