【AutoSar_诊断协议栈】FiM模块详解
1 术语解释
1.1 缩略语
缩写 | 描述 | 解释 |
---|---|---|
BSW | Basic Software | 基础软件 |
Dem | Diagnostic Event Manager | 诊断事件管理 |
ECU | Electronic Control Unit | 电子控制单元 |
FID | Function Identifier | 功能标识符 |
NVRAM | Non volatile Memory | 非易失性内存 |
EcuM | ECU State Manager | ECU状态管理模块 |
2 相关模块
Module | dependencies |
---|---|
Dem | 将改变的Event或Component的状态告知给FiM,用计算并判断相应FID的状态(对应功能是否能执行) |
SW-C | 通过FiM提供的FID和接口问询功能是否执行或者禁止 |
EcuM | 负责相关模块的初始化和去初始化的过程 |
BSW | BSW内部的功能可以使用FiM的功能降级机制 |
RTE | 主要负责相关模块的调度函数执行顺序,优先级,但并负责SW-C和FiM之间的交互 |
3 功能简介
3.1 功能概述
FiM提供以下功能:
- FiM模块提供一种用于功能抑制场景的功能降级策略,并且该功能抑制关系和条件能够配置;
- 可通过特定的FID来实现相应的功能降级策略;
- 功能降级可由Dem模块的Event或Component在FiM模块中根据降级需求完成映射(map FID);
- FiM模块为BSW以及SW-C各模块提供了一种有效的降级手段(特定功能的降级或者抑制需要知道对应的FID)。
总而言之,当SW-C或者BSW层发生故障发生时,会将故障即Event上报给到Dem模块;通过Dem内部的计算,当Event或Component发生状态变化时,Dem会告知FiM(这个动作需要在Dem配置才会执行),当然FiM也会通过Dem的接口来获取Event或Component的状态;SW-C以及BSW层通过接口获取FID的permission做出相应的降级行为。
如下图所示,包含整体功能降级架构组成:
3.2 Dem和FiM的交互
3.2.1 Event或Component和FID的映射
在说Event或Component和FID的映射关系之前,先提一下Dem中Event和Component之间的映射关系:==一般地,多个同类的Event mapping一个Component, 且在Event进入FAILED状态后,其关联的Component也会进入FAILED状态。==更多的关系请参考Dem的规范文档。
在FiM的配置中往往需要实现一下的映射关系,可以参考下图:
- FID - Event - Inhibition Mask(每个Event都有其对应的Mask)
- FID - ComponentId - inhibition configuration
下图是Event和FID的映射关系图:
注:这里一个Event可以mapping多个不同的FID(一般不推荐),一个FID也可以mapping多个Event(同一类的);但是FID只能mapping一个component,且Event和Component对于FID的映射是可以同时存在的。
3.2.2 Dem和FiM之间的交互接口
在运行时,Dem内部有Event状态发生变化时,会调用FiM_DemTriggerOnMonitorStatus通知FiM,之后FiM会调用Dem_GetMonitorStatus去查询Event最新的状态,并计算FID的permission,permission由SW-C轮询;具体流程如下图:
在Dem Component状态发生变化时,Dem会调用接口FiM_DemTriggerOnComponentStatus告知FIM;这种情况该动作需要在Dem的配置中使能。不仅如此,FiM也可以通过Dem_GetComponentFailed轮询Component的状态并由此计算FID的permission。
3.2.3 FiM的初始化
除了在运行时Dem会和FiM有交互,FiM在初始化期间也会获取Dem存储在NvM中的Event Status,故在EcuM中调用初始化函数的时序很重要:
3.3 FID Permission的计算
下图是通过Event status计算FID的图示:
这里面有几个重要的参数:
参数 | 解释 |
---|---|
Event Monitor Status | Dem计算的Event Status与DTC status一致 |
Inhibition Mask | 抑制FID的判断条件 Event Status和对应Inhibition Mask按位与的结果不为0,即Inhibit Counter +1 |
Inhibition Counter | 导致FID抑制的Event和Component的个数 该Counter会随着导致FID置位的Event数目增加而增加,减少而减少 |
Function Inhibition | 即FID的permission,在Inhibition Counter > 0时FID = FALSE则功能降级 在Inhibit Counter == 0时FID = TRUE则功能不降级 |
以下图为例,当三个Event和一个Component(一般Event都依赖于该component)映射到FID_0时,以上参数之间运算关系:
如上图6所示,假设Event A,EventB、EventC均Map了FID_0,也就意味着当这三个Event status中任意一个或多个发生变化时且与响应MASK按位与结果为TRUE(此时Component状态也为FAILED),FID_0就会置位,即FID_0 = FALSE。
系统降级算法规则:当 Inh Counter >0, FID就会置位,即为FALSE,相应的系统降级行为就会发生。
当下列情况时,FID_0 的permission如何变化呢?
- 当Event A Status & Ihibition Mask_a = TRUE, Inh Counter + 1, 即Inh Counter= 1,FID_0 = FALSE;
- component Status变为FAILED,Inh Counter + 1,即Inh Counter = 2,FID_0 = FALSE;
- 当Event B Status & Ihibition Mask_b = TRUE, Inh Counter + 1, 即Inh Counter = 3, FID_0 = FALSE;
- 当Event C Status & Ihibition Mask_c = TRUE, Inh Counter + 1, 即Inh Counter = 4, FID_0 = FALSE;
- 过一段时间Event A Status & Ihibition Mask_a = FALSE, Inh Counter – 1, 即FID_A Counter = 3, FID_A = FALSE;
- 同上,EventB Status & Ihibition Mask_b = FALSE,Inh Counter – 1, 即FID_A Counter = 2, FID_A = FALSE;
- 同上,EventB Status & Ihibition Mask_c = FALSE,Inh Counter – 1, 即FID_A Counter = 1, FID_A = FALSE;
- component Status变为PASSED,Inh Counter - 1,即Inh Counter = 0,FID_0 = TRUE;
通过上述场景分析得知,只要Inh Counter不等于0,FID_0 就会等于FALSE,系统就会降级。不过在此需要特别提醒的是虽然此时你知道系统降级了,但是从FID你无法知道到底是哪个Event导致的降级,此时就需要通过相关的诊断服务0x19读取内部的Event并且该Event也确实Map了该FID,那么你就可以锁定该Event就是原因所在。
注:特殊地,当FID被FiM_SetFunctionAvailable设置为不可用,那么 FiM_GetFunctionPermission即返回FALSE,即功能被降级不可用。
3.4 FiM与SW-C之间的交互
一般地,SW-C组件会调用 FiM_GetFunctionPermission轮询FID状态,由此判断对功能进行降级与否。前提是SW-C知道FID和功能的映射关系。
4 配置参数
Dem :
- 存在需求中Events;
- 是否使能Event monitor status改变时告知FiM;
- 是否使能Component status改变时告知FiM;
FiM:
- FID与Event以及Component之间的映射关系,还有Event statsus对应的Inh mask;
- 配置可以将一类Event合成一个summary event,其处理过程并无差异;
注:一般Event和Component不会都配置在FID的引用中,状态的计算上有重复之处。
5 参考资料
1. AutoSAR基础篇之FiM
2. Specification of Function Inhibition Manager(AUTOSAR CP R20-11)
3. Specification of Diagnostic Event Manager(AUTOSAR CP R20-11)