座右铭:“所谓坚持,就是觉得还有希望!”
软件运行过程中,如果进入某个循环无法退出,则会导致任务被block,譬如在AutoSar OS中,某个10ms任务卡死在某个循环,结果就是10ms任务包括比10ms任务优先级更低的20ms, 50ms等任务都被阻塞。这种情况,需要主动干预,或reset或重新上电。
基于上述背景,为提高软件稳定性和鲁棒性,引入看门狗概念:为了实现系统出现异常时能够自动完成系统复位操作保证整个功能的持续使用。
看门狗(Watchdog)在安全关键系统和非安全关键系统中的必要性:
1. 硬件与软件的不可靠性
2. 恶劣环境的现实挑战
汽车电子:
工业与野外设备:沙漠、深海等场景的维护成本极高。看门狗可减少90%以上的非硬件损坏类故障,显著降低运维频率。
3. 成本与口碑的隐性价值
4. 看门狗的技术实现层级
看门狗本质是一种定时器(Timer)。如果在规定的时间内没有"喂狗"(重置Timer),Timer就会溢出,当Timer溢出以后,执行用户自定义的一些异常处理动作,例如:重置系统。
针对被监视的目标设置一个计数器和一个阈值,watchdog会自己增加计数值,并等待被监视的目标周期性地重置计数值。一旦目标发生错误,没来得及重置计数值,watchdog会检测到计数值溢出,并采取恢复措施(通常情况下是重启)。
Table 5 定时器分类
ID |
类型 |
优势 |
缺陷 |
1 |
软件定时器 |
可以多个并存,资源限制小 |
易受负载影响,稳定性差 |
2 |
硬件定时器 |
精度高、响应快,不受负载影响 |
存在资源限制 |
软件看门狗的时间本质上也需要依赖硬件外设上的硬件定时器。
内狗和外狗关系,示意如下:
内狗、外狗、硬狗、软狗关系,示意如下:
外部看门狗一般而言,都是硬件狗。对嵌入式软件开发而言,外部看门狗一般采用中断触发方式喂狗。原因如下:
所以,外狗一般采用中断方式喂狗。
中断程序优先级高,进入中断例程以后,不能无判断直接执行"喂狗"动作,而是需要有条件地执行"喂狗",例如:判断喂狗条件是否满足。比如:Task#n Counter是否在有效范围内,如果在就喂狗,如果不再就执行异常处理动作(系统复位)。
控制MCU的内部看门狗定时器。它提供触发功能和模式选择服务。Wdg模块是直接访问相关硬件寄存器。主要监控程序运行后的软件状态,如监控OS启动后,周期性Task、非周期性Task、软件时序的运行状态。需要注意就是,内部watchdog存在程序初始化和程序shutdown的监控盲区。因为看门狗的主要作用是监控软件系统的运行状态,如果看门狗的任务优先级太低,那么可能会被其他任务阻塞(While(1)卡死),导致看门狗无法及时发现系统故障(无法设置异常条件,不能触发系统复位),从而影响系统的稳定性和可靠性。
一般来说,内部软件看门狗的任务优先级应该设置得比其他常规任务高。但是,它的任务优先级又不能高于系统关键性任务(刹车程序任务等safety相关)。所以,看门狗的任务优先级在兼顾有效监控程序的同时,也需要确保关键任务的正常运行。
--如果喂狗(软件看门狗)动作在中断程序中,当程序卡死以后,定时器溢出,进入中断程序,是否还需要喂狗?--此时不应该无条件喂狗,应该识别喂狗条件是否满足。由于程序卡死,因此也就很难满足喂狗条件。所以,即使程序进入了中断例程,也不应喂狗,而是进行异常处理(eg:复位系统)。
内部watchdog存在程序初始化和程序shutdown存在监控盲区,所以外部wdg可以fix这部分问题。如果uC没有及时喂外狗,导致外狗超时,同时拉低ROT Pin,也就是拉低uC的Reset Pin,触发uC的复位。参考上图。注意:外狗一旦被外部使能,一般不会关闭 。
如果软件只是开启了内狗,eg:仅使能 Alive Supervision。需要等到OS启动以后,内狗功能才发挥作用。但是,在程序的初始阶 段,OS启动之前,如果程序异常跑飞,内狗则无法起到监控作用。如下图所示:
在AUTOSAR架构下,ECU的启动流程由EcuM模块管理,分为以下几个阶段:
内部看门狗(Internal WDT)仅能在OS启动后生效(如Alive Supervision监控周期性任务)。OS启动前(如Bootloader、EcuM初始化阶段),若程序跑飞,内部看门狗无法监控,导致系统无法复位。根本原因:
1.内部看门狗依赖
2.监控盲区
解决方案:
1.启用外部看门狗(External WDT)
启动阶段:由Bootloader或EcuM_AL_DriverInit函数喂狗。
运行阶段:由OS任务(如WdgM_MainFunction)喂狗。
关闭阶段:在EcuM_Shutdown中延迟关闭外狗,确保安全下电。
2.内部看门狗优化
3.内外双狗协作
阶段 |
外部看门狗 |
内部看门狗 |
启动阶段 |
监控硬件初始化 |
未启用 |
OS运行阶段 |
备份监控 |
主监控(Alive/Deadline) |
关闭阶段 |
监控下电流程 |
已关闭 |
工作原理:
工作原理:
分类 |
优势 |
劣势 |
硬件Wdg |
✅高可靠性:不受软件错误(如死循环、内存溢出)影响,适合安全关键系统(如汽车ECU、医疗设备)。 ✅低延迟复位:硬件直接控制复位信号,响应速度快(通常<100ms)。 ✅抗干扰性强:电磁干扰(EMI)或电源波动不易导致看门狗失效。 |
❌灵活性低:超时时间通常固定或有限可调(如STM32的IWDG仅支持几档预分频)。 ❌依赖硬件支持:需MCU内置或外置看门狗电路,增加BOM成本(但通常仅需几分钱)。 |
软件Wdg |
✅高度灵活:可自定义超时时间、监控策略(如任务级看门狗)。 ✅低成本:无需额外硬件,仅依赖现有CPU资源。 ✅支持复杂逻辑:可结合系统状态判断是否复位(如仅重启特定任务而非整个系统)。 |
❌可靠性较低:若看门狗任务本身卡死(如优先级反转、内存泄漏),则失效。 ❌依赖CPU运行:若CPU死锁或电源异常,软件看门狗无法生效。 ❌响应延迟:需经过软件逻辑判断,复位速度较慢(可能数百ms)。 |
硬件看门狗是保障系统可靠性的关键组件,其设计需遵循以下核心原则,以确保安全性、鲁棒性、可维护性和兼容性:
1.独立于主系统运行
2. 抗干扰设计
1.不可关闭性(Locked Mode)
2.失效安全(Fail-Safe)
1. 匹配系统最坏执行时间(WCET)
2. 避免误触发
1.简单可靠的喂狗方式
2. 喂狗逻辑容错
1. 默认关狗(Power-On Disabled)
2.调试接口设计
1.多核系统支持
2.分层监控(Layered Watchdog)
1.超时时间测试
2.抗干扰测试
3.失效模式分析(FMEA)
这里主要是考虑软件升级过程中,如何"喂"外部硬件看门狗。一般来说,工程上常见的外部硬件看门狗触发原理如下:
如果uC没有在规定时间内有效喂狗,外部硬件看门狗(eg:SBC中的硬件狗)就会主动拉低ROT Pin脚,Reset uC。所以,在升级的过程中,进入Bootloader程序以后,需要关闭SBC中的外部看门狗,避免程序升级过程中,喂狗不及时导致的刷写失败。但是,一些SBC中,外狗一旦使能,不能关闭。这样的情形时,Bootloader程序需要及时喂狗,避免喂狗不及时导致的刷写失败。
刷写过程中,哪些动作会导致喂狗超时呢?答:比如,Application程序更新以后,使用非对称算法对Application进行验签,这样的动作比较耗时,很可能超过喂狗的窗口期。
后续系列围绕AutoSar WatchDog Stack定义和ISOLAR配置为主题展开,感兴趣请关注!
参考文章
承上
tbd
启下
CSDN