为了检测程序正常运行,大多数时候都会选择利用看门狗(watchdog)的特性,程序需要周期性地喂狗(feed)来不停地重制看门狗,以免出发典型的reset操作。
对于应用来说,可以将这个模式抽象化,不再单单的去监控硬件看门狗,而以Supervised Entities为单元进行监控,保证程序正在运行而且是照着预期的状态在运行。三种监控机制:
Alive Supervision |
用于监控周期运行的软件 |
Deadline Supervision |
用于监控非周期运行的软件 |
Logical Supervision |
用于监控软件运行的执行流程 |
一、Supervised Entities and Checkpoints
WdgM模块监控的逻辑单元就是Supervised Entities(下文简称为SE),它可以代表一个SWC,或者SWC中的某一Runnable,也可以代表一个BSW模块,或者CDD模块。
当Supervised Entities执行时,每当运行到某一Checkpoint时,会调用对应的WdgM接口上报状态。一个Supervised Entity可以拥有一个或者多个Checkpoint,它们在Supervised Entity内部的关联信息(Transistion)构成了一个Graph,也可以叫它Internal Graph,对应的,不同Supervised Entities之间的Checkpoints的关联则构成了External Graph。每一种WdgM模式下都可以有多个External Graph。
在一个Graph中,可以有多个Initial Checkpoint或者多个Final Checkpoints,这种情况下,无论从哪一个Initial Checkpoint开始这个执行流程都可以,同样,无论在哪个Final Checkpoint结束此次执行流程也是可以的。
二、本地状态&全局状态
一个Supervised Entity可以同时设置多种Supervision机制,基于每一种机制返回的状态,可以计算出当前Supervised Entity的状态,也即Local Status(本地状态)。
当每一个Supervised Entity的状态都得到的时候,就能计算出整个MCU的状态了,也即Global Supervision Status(全局状态)。
如上图蓝色所示,每一种Supervision功能都会返回状态列表,代表正确或者不正确,最后对于每一个Supervised Entity来说会有三个状态,Alive Supervision状态,Deadline Supervision状态,Logical Supervision状态。然后计算出本地状态,也即绿色框所示。最后是红色框所示的全局状态。
执行WdgM_CheckpointReached()函数,会更新Deadline Supervision和Logical Supervison的状态,执行WdgM_Mainfunction()更新Alive Supevision的状态。
三、本地状态迁移图
WdgM初始化后,在初始化模式激活的SE的本地状态将处在OK状态(上图路径10).
如果不在初始化模式激活,SE的本地状态将处在DEACTIVATED状态(上图路径11).
如果初始化模式激活的SE的WdgMInitialMode没有设置为OK,那么SE的本地状态将处在DEACTIVATED状态(上图路径11).
如果三种监控状态都返回的是正确,并且最近一次记录的本地状态是OK,那么本地状态将停留在OK状态(上图路径1).
如果上次记录的本地状态是OK,满足任一条件时,本地状态为EXPIRED(上图路径2):
- 至少一个Alive Supervision返回的是incorrect,且容忍度(Tolerance)设置为0
- 至少一个Dealine Supervision或者Logical Supervision返回的状态时incorrect
如果容忍度不为0,那么会设置为FAILED,并记录错误次数。如果超过了配置的允许错误次数,则设置为EXPIRED。
四、全局状态迁移图
WdgM有一个全局状态,初始化状态为DEACTIVATED。
当WdgM初始化函数调用之后,全局状态为OK(上图路径13).
上次记录的全局状态为OK,当前SE的本地状态为OK或者DEACTIVATED,那么全局状态保持在OK(上图路径1).
上次记录的全局状态为OK,当前SE至少有一个本地状态是FAILED,且没有SE状态是EXPIRED,那么全局状态为FAILED。(上图路径2).
上次记录的全局状态为OK,当前至少有一个SE的本地状态是EXPIRED,且未超过允许值,那么全局状态为EXPIRED(上图路径3)
上次记录的全局状态为EXPIRED,当前至少有一个SE的本地状态是EXPIRED, 且Exprired Cycle Counter超过了设定值,那么全局状态为STOPPED(上图路径11).
五、错误处理/失败恢复
当发生监控错误时,WdgM可以帮助进行相应的错误处理,主要有这么五种:
1. 通过RTE通知SWC和CDD
2. 在WDGM_GLOBAL_STATUS_STOPPED状态上报DEM错误
3. 重启/关闭SE所在的non-trusted OS Application
4. 在WDGM_GLOBAL_STATUS_STOPPED状态停止出发WdgIf接口,引发硬件看门狗超时重启
5. 立即触发MCU重启
六、总结
WdgM主要用作程序执行中和时间相关的监控,在CP AUTOSAR的架构中对监控的实体叫做Supervised Entities(SE),检测的SE特定的位置叫做Checkpoint。
监控的概念主要体现在三个方面,分别是监控特定SE的执行频率,避免执行频率过快和过慢;监控两个Checkpoint的Deadline以及对特定的程序流进行监控(多个Checkpoint的执行逻辑)。
WdgM监控的SE可以是和功能安全相关的Function,也可以是一个SWC或者CDD甚至一个BSW模块。对于CP AUTOSAR中提供的监控模块主要包括WdgM、WdgIf、Internal Wdg Driver、External Wdg Driver。
根据系统定义和软件架构的设计可以选择对应的内外部驱动实现对SE的监控,下图展示了WdgM监控的整个逻辑,在相关的SWC或者CDD中设置对应的Checkpoint,然后周期的触发WdgM的服务,从而对程序流监控,而在监控出现时间的偏差则会触发Wdg Driver触发对应的Reaction。
注:本文基本转述了知乎中的某篇文章,但链接未找到,有心人士可提供帮忙,感谢感谢。