编辑推荐: |
本文主要介绍了AUTOSAR看门狗相关内容。
希望对您的学习有所帮助。
本文来自于微信公众号谦益行,由火龙果软件Linda编辑、推荐。 |
|
1 看门狗基础知识
WdgM是标准的Autosar架构中的服务层,主要负责监控程序的执行,其监控的单元称为独立实体(Entity)。WdgM提供了三种监控机制:
1 针对周期运行软件的的Alive监控;
2 针对非周期运行软件的DeadLine监控;
3 针对执行顺序的逻辑(Logical)监控。
Alive监控通过配置一段时间内的软件期望执行次数来监测Entity是否执行的过快或者过慢。DeadLine监控通过设置两个监控点(Checkpoint)间允许运行的时间来监测Entity的执行时间是否符合要求。Logical监测聚焦于流程的运行,主要用来监测Entity是否按照给定的流程运行。
当发生看门狗错误时,一般有4种处理方式供用户选择:
1 通过RTE通知SWC或者CDD;
2 当监测到non-trusted发生错误时,可以通过BswM模块停止这个partion;
3 重新初始化硬件和软件(先deinit再init);
4 复位MCU。
1.2 Local Status & Global Status
Overview of Watchdog Manager Supervision
WdgM的状态机由两部分组成:Local Status(每个Entity的状态)和Global Status(对所有Local
Status的状态进行逻辑判断,上边的错误处理就是针对Global Status而言的)。
1.2.1 Local Status
Local Supervision Status
当调用WdgM_Init初始化后,各个Entity的local状态为WDGM_LOCAL_STATUS_OK。
1)当出现喂狗错误(Alive监控的错误次数大于配置的WdgMFailedAliveSupervisionRefCycleTol或者出现DeaDline监控错误)时,Local状态将在WdgM_MainFunction中切换为WDGM_LOCAL_STATUS_EXPIRED;
2)当Alive监控出现错误且错误次数不大于配置的WdgMFailedAliveSupervisionRefCycleTol时,Local状态将在WdgM_MainFunction中切换为WDGM_LOCAL_STATUS_FAILED;
3)用户可以通过WdgM_SetMode函数将Local状态设置为WDGM_LOCAL_STATUS_DEACTIVATED,当在DEACTIVATED设置为ACTIVE时,将返回到WDGM_LOCAL_STATUS_OK状态;
4)处于WDGM_LOCAL_STATUS_EXPIRED时,WdgM_MainFunction会一直监测到Alive监控的正确性,正确时会减小错误的counter计数,不正确时会增加错误counter计数,从而决定是跳到OK还是EXPIRED状态(当然Deadline错误会直接跳转到EXPIRED)。
1.2.2 Global Status
Global Supervision Status
当调用WdgM_Init初始化后,Global状态为WDGM_GLOBAL_STATUS_OK。
1) 当至少一个Entity的Local状态为Failed且没有一个Entity的状态为EXPIRED时,Global状态在WdgM_MainFunction中切换为WDGM_GLOBAL_STATUS_FAILED;
2)当至少一个Entity的Local状态为EXPIRED且次数小于配置的WdgMFailedAliveSupervisionRefCycleTol时,Global状态切换为WDGM_GLOBAL_STATUS_EXPIRED(如果WdgMFailedAliveSupervisionRefCycleTol为0,则直接进入WDGM_GLOBAL_STATUS_STOPPED);
3) 当Global状态处于WDGM_GLOBAL_STATUS_EXPIRED时,会对EXPIRED的错误次数进行监测,当错误次数大于配置的WdgMFailedAliveSupervisionRefCycleTol时,切换到WDGM_GLOBAL_STATUS_STOPPED状态;
4) 处于WDGM_GLOBAL_STATUS_STOPPED时,可以通过WdgM_DeInit函数进入WDGM_GLOBAL_STATUS_DEACTIVATED状态。
1.3 监控原理
1.3.1 Alive监控原理
监控实体(SE)通过调用WdgM_CheckpointReached函数增加监测点(Checkpoint)的Alive
Counter来进行监控。WdgM在WdgM_MainFunction中通过监测给定的周期(WdgMSupervisionReferenceCycle倍的WdgM_MainFunction运行周期)checkpoint的Alive
Counter是否在给定范围内(Expected – Min Margin;Expected + Max
Margin),当不在给定的范围内时,SE的local状态是否需要跳到FAILED或者expired。
1.3.2 Deadline监控原理
对于每个Deadline监控的SE来说,需要配置两个checkpoint(start和end).当执行start
checkpoint时,WdgM记录当前的时间(读取OS Ticks),当执行end checkpoint时,WdgM通过调用GetElapsedTime的OS服务函数来计算时间差并判断是否在WdgMDeadlineMin和WdgMDeadlineMax之间。
1.3.3 Logical监控原理
Supervised Entity
Control Flow Graph
每个Logical监控实体都有自己的一个Active标志。当调用WdgM_Init后,其为False。当checkpoint到达时(调用WdgM_CheckpointReached函数),分两种情况:
1)是Initial Checkpoint(通过WdgMInternalCheckpointInitialRef配置的checkpoint),那么就会将Active标志置为True,表示后续将会对SE进行逻辑判断;
2) 不是Initial Checkpoint触发(其他的checkpoint到达了),那么本次Logical监控的SE的运行结果就是错误的(Local状态变为FAILED或者EXPIRED(如上描述,根据配置决定))。
当Active标志为True后,WdgM会存储每个SE的最近一个到达的checkpoint,从而判断当前到达的checkpoint是否是正确的,最终达到逻辑判断的目的。
2 看门狗的使用
Autosar中看门狗架构
Autosar中WdgM负责提供用户设置的监控点,WdgIf负责对看门狗进行抽象,向WdgM提供统一的接口,Wdg可以是内狗也可以是外狗。
看门狗按位置可以分为内狗与外狗。顾名思义,内狗就是单片机内部的看门狗,外狗就是挂在单片机外部的看门狗。内狗一般通过操作寄存器来喂狗,而外狗可以通过硬件(如SPI/I2C/IO)来喂狗。
按照类型可以分为独立狗和窗口狗。独立狗可以理解为在看门狗启动后,一个计数器开始递减,用户必须在递减到0之前之前喂狗,而窗口狗是是计数器递减后,用户需要在计数器给定值的范围内喂狗。
按照喂狗时间的长短,还可以分为快狗和慢狗。快狗的最大允许喂狗范围远小于慢狗的范围值。
2.1 内部看门狗
单片机内部的看门狗定时器(WDGT)是一个硬件计时电路,用来监测由软件故障导致的系统故障。片上有两个看门狗定时器外设,独立看门狗定时器(FWDGT)和窗口看门狗定时器(WWDGT)。
2.1.1 独立看门狗
向控制寄存器(FWDGT_CTL)中写给定的值可以开启独立看门狗定时器,计数器开始向下计数。当计数器记到0x000,产生一次复位。在任何时候向控制寄存器(FWDGT_CTL)中写给定的值可以重装载计数器,重装载值来源于FWDGT_RLD寄存器。软件可以在计数器计数值达到0x000之前可以通过重装载计数器来阻止看门狗定时器复位。
某单片机独立看门狗定时器框图
2.1.2 窗口看门狗
窗口看门狗定时器开启后,窗口看门狗定时器开启后,向下递减计数器值逐渐减小。计数值达到给定值时会产生复位。在计数器计数值达到窗口寄存器值之前,计数器的更新也会产生复位。因此软件需要在给定的区间内更新。
某单片机窗口看门狗定时器框图
2.2 外部看门狗
SBC与MCU的连接示意图
Window watchdog and functional watchdog
Watchdog state diagram
上图为TLF35584的看门狗示意图,我们以此为例来说明。从图上可以看出,该SBC内有两种看门狗:窗口狗和功能狗。其中窗口狗可以通过IO(WDI)或者SPI来喂狗,而功能狗只能通过SPI来喂狗。看门狗未及时喂狗时会导致Watchdog
Failure Counter的增加,当超过设定值时,会上报给该SBC的安全状态控制模块(Safe
State Control).
2.3 不同类型看门狗的使用场景
2.3.1 窗口狗VS独立狗
窗口狗可以用于Autosar的Deadline监控,独立狗一般用于Alive监控。
2.3.2 外狗VS内狗
对于外狗(SBC内部的看门狗),一般上电后就会自动开启,而内狗一般在进入main函数之后(或者说是OS启动后)才开启,因此在启动的这段时间可以由外狗来监测(超时后通过SBC自己复位不再输出从而达到复位MCU的目的,如上图Watchdog
state diagram所示,在Initialization中连续不喂狗TLF35584就会产生复位,复位时就会停止对外输出)。
3 实战喂狗
看门狗的喂狗一般是任务中喂狗而不是定时器中断喂狗,因为如果出现了任务跑飞或者陷入某个死循环,定时器中断可能还在正常运行并正常喂狗,那么看门狗就会失去作用。但是,对于使用窗口狗来说,可以结合定时器中断来进行喂狗,下边我们将详细叙述这两种模式。
3.1 主任务喂狗
如上图所示,在WdgM_MainFunction中先判断各个监控实体(SE)的Local Status,再根据Local
Status决定当前的Global Status的状态。
1) 当Global状态为STOPPED时,此时不再喂狗(将TimeOutValue设置为0);
2) 当Global状态为其他状态时,将TimeOutValue设置为用户通过Autosar工具配置的值(WdgMTriggerConditionValue配置的值)
3.2 中断喂狗
WdgM通过WdgIf调用Wdg_SetTriggerCondition时,判断两次调用的时间时间间隔ElapsedTime,
1) 如果ElapsedTime大于看门狗超时时间那么就不需要再在中断中喂狗,此时只需要停止定时器中断即可(调用Gpt_StopTimer);
2) 如果ElapsedTime小于看门狗超时时间,那么只需要设置新的超时时间并等待定时器中断到达后,在中断服务函数中进行喂狗即可。
在中断中喂狗一般适用于窗口狗,因为可以起一个窗口狗窗口中间值作为定时喂狗的时间,但是假如用在外狗的喂狗上需要注意的是尽量用IO去喂狗而不要通过总线,因为这可能会增加中断服务函数的时间! |