在AUTOSAR架构中,WdgM是看门狗最重要也是最复杂的模块。所以这里单开一篇来记录它。
1、SE与CP
WdgM负责看门狗的逻辑控制。在WdgM中,受监测的程序被抽象成了两个概念:SE(Supervised Entities) and CP(Checkpoints)。SE简单理解就是一段被监测的程序,可以是一个SWC(software component),一个BSW Module(基础软件模块),一个OS调度的task。CP则可以理解为SE中的一个位置。
WdgM定义了两个数据类型,WdgM_SupervisedEntityIdType和WdgM_CheckpointIdType
,用于给SE和CP赋予相应的ID号。
如下图的API,WdgM_CheckpointReached(),调用该函数,用于表示程序运行到了相应SE中的CP。WdgM的监测逻辑都是基于该API完成的。
这两个概念还是有点抽象,这里留个例子:
void core0_50ms_task(void)
{
Std_ReturnType WdgM_CheckpointReached(3,1)
}
这里有一个执行周期为50ms的task, WdgM_CheckpointReached(3,1)表示程序运行到了3号SE中的1号CP。监测task运行的方法:(SE需要使用配置工具指定,比如达芬奇下的ISOLAR,在配置工具中定义一个运行周期为50ms,ID为3的SE,且SE包含一个ID为1的CP。那么把WdgM_CheckpointReached(3,1)这个函数放在执行周期为50ms的函数才是正常的。如果放在周期为100ms的函数里,则SE的到达周期不对,会导致WdgM停止喂狗)
2、三种监测方式
针对SE的监测方法有三种:
(1)Alive Supervision
(2)Deadline Supervision
(3) Logical Supervision
Alive Supervision用于监测SE中CP执行的频率。 Deadline Supervision用于监测两个CP之间的执行时间;logical supervision用于监测程序执行流(个人理解就是CP的到达顺序)。每个Supervision都只有两种结果:correct和incorrect。
如下图所示,Deadline Supervision和Logical Supervision的结果在调用WdgM_CheckpointReached()函数时就会更新;而Alive Supervision是先通过WdgM_CheckpointReached()函数改变Alive Indication Counters(这个参数可以理解为一个计数器,每个CP都有一个,每当程序执行到CP,对应的计数器会加1),然后在WdgM_MainFunction()函数中,根据Alive Indication Counters,得到Alive Supervision的结果。
WdgM定义了两种状态:Local Supervision Status和Global Supervision Status。Local Supervision Status即单个被监测SE的状态,而Global Supervision Status为全局状态,由所有SE的Local Supervision Status决定。
2.1、Alive Supervision
由于本人目前只用过Alive Supervision,所以暂时只展开记录下Alive Supervision的使用经验,另外两种后续有机会再添加。
前文说过 Alive Supervision用于监测SE中CP执行的频率。如下图解释:在一个周期(WdgMSupervisionReferenceCycle)内,到达CP的次数有一个期望值(WdgMExpectedAliveInidications)。
但是肯定做不到绝对的准确,所以一个周期(WdgMSupervisionReferenceCycle)内到达CP的次数有一个可接受的范围(WdgMExpectedAliveInidications-WdgMMinMargin
到WdgMExpectedAliveInidications+WdgMMaxMargin)。如下图:
前文提过 :Alive Supervision是先通过WdgM_CheckpointReached()函数改变Alive Indication Counters,然后在WdgM_MainFunction()函数中,根据Alive Indication Counters,得到Alive Supervision的结果。如下图提到了两个时间概念:WdgMSupervisionCycle和WdgMSupervisionReferenceCycle。WdgM_MainFunction()的执行周期为WdgMSupervisionCycle,每个WdgMSupervisionCycle,会更新局部和全局状态;对Alive Indication Counters(该参数会记录CP的到达次数)进行周期性检测,该周期为WdgMSupervisionReferenceCycle,每个WdgMSupervisionReferenceCycle,会更新Alive Supervision的结果。 WdgMSupervisionReferenceCycle是WdgMSupervisionCycle的倍数。
总结就是一个WdgMSupervisionReferenceCycle得到一次Alive Supervision的结果(为correct或incorrect),根据这个结果,每个WdgMSupervisionCycle(即WdgM_MainFunction()每执行一次)更新全局和局部状态
3、局部状态机制和全局状态机制
3.1、局部状态机制
每个SE有4种局部状态;
1、WDGM_LOCAL_STATUS_DEACTIVATED
2、WDGM_LOCAL_STATUS_OK
3、WDGM_LOCAL_STATUS_FAILED
4、WDGM_LOCAL_STATUS_EXPIRED
局部状态的主要转换规则如下:
设备或WdgM模块未启用的话,局部状态为如果DEACTIVATED;设备启用并正常初始化,局部状态为OK;后续,根据3种Supervision的结果,局部状态会进行相应的转换。
如下图:如果局部状态为OK,且至少有一个SE的Alive Supervision的结果为incorrect,且WdgMFailedAliveSupervisionRefCycleTol为0;同时,存在Deadline Supervision或Logical Supervision的结果为incorrect,则局部状态变为EXPIRED。
这里提到了一个参数,WdgMFailedAliveSupervisionRefCycleTol。文档对这个参数的定义为:This parameter shall contain the acceptable amount of reference cycles with incorrect/failed alive supervisions for this Supervised Entity。即对一个SE来说,可以接受的,结果为incorrect的Alive Supervision的reference cycles(即WdgMSupervisionReferenceCycle)的数量。这个定义也有点jb抽象,这里举个例子:比如WdgMFailedAliveSupervisionRefCycleTol设置为20,当出现某个SE的Alive Supervision的结果为incorrect时(某个WdgMSupervisionReferenceCycle得到的结果),在WdgM_MainFunction()中,会更新该SE的局部状态为FAILED,这时,就认为有了一个failed supervision reference cycles。WdgM_MainFunction()的执行周期为WdgMSupervisionCycle,如果该SE的局部状态为一直为FAILED,每次执行WdgM_MainFunction(),failed supervision reference cycles就会加1,所以20个WdgMSupervisionCycle后(即WdgM_MainFunction()执行20次后),failed supervision reference cycles超过WdgMFailedAliveSupervisionRefCycleTol,局部状态由FAILED转变为EXPIRED。
其余局部状态转换规则如下图,就不11翻译了:
3.2、全局状态机制
全局状态机和局部状态机类似。
主要有一个参数:WdgMExpiredSupervisionCycleTol。当某个SE的局部状态为FAILED的时候,全局状态转变为FAILED;当某个SE的局部状态为EXPIRED的时候,全局状态转变为EXPIRED;当全局状态为EXPIRED的时候,最多经过WdgMExpiredSupervisionCycleTol个WdgMSupervisionCycle(即WdgM_MainFunction()函数执行WdgMExpiredSupervisionCycleTol次),全局状态为STOPED。
4、主要API
4.1、用于初始化WdgM模块