功能抑制管理器(Function Inhibition Manager)负责为软件组件(software component)及其功能(functionality)提供控制机制,通过FIM可以抑制(取消应用程序功能的激活)这些功能,甚至可以在运行时(构建后配置)期间进行配置和修改。
functionality:一个功能可以由具有相同权限/抑制条件集的一个、几个或部分可运行实体(runnable entity)的内容构建。
FID:功能被分配到一个标识符(FID-功能标识符),以及该特定标识符的抑制条件。这些功能在执行之前轮询各自FID的权限状态。如果特定标识符的抑制条件成立,则相应的功能将不再执行。
FIM Core Variables
● Diagnostic Event:“诊断事件”是DEM向特定诊断监视器功能提供的标识符,用于报告错误
● Monitor
Status:“监测状态”是DEM根据监测功能的报告值计算出的状态。可能的值由Dem_MonitorStatusType定义
● Monitored
Component:“被监控组件”是由DEM提供给特定被监控组件(硬件组件或信号)的标识符。“被监控组件”的FAILED状态表示所有分配的监控功能的结果和从其他DEMComponent继承的故障信息
● Summarized
Event:FIM配置应该支持汇总事件。汇总事件由多个单个诊断事件组成;因此,特定的总结事件只是多个诊断事件的代表。Summarized Event可以用作SWC的抑制条件
● Function Identifier:
a. 应保证FIM中的每个functionid是唯一的
b. FIM模块应使用FunctionId直接指向相关的功能信息(权限状态等)
FIM实现了功能权限的计算。这些被计算的对象是SWC或Logic
Unit,每个FID的权限状态是根据分配给特定FID的EventIds计算的。计算出每个EventIds的权限状态,并进行“与”以确定最终的权限状态
● Function Identifier permission
state:FID权限状态包含由其FID表示的功能是否可以执行的信息(True执行/False禁止)。SWC组件通过FIM_GetFunctionPermission访问状态
4.2
FIM Core Functionalities
FIM Data Structure
FIM的配置过程应该在FIM模块中创建数据结构来存储抑制关系(EventID - FID -applicable mask)。
可配置的EventIds数量和抑制掩码被分配给一个FID。每个FID的EventIds和抑制掩码数量必须匹配,以便对于每个配置的事件,都存在相应的抑制掩码。抑制掩码包含FID的抑制条件,前提是相关的EventIds具有特定的状态(Dem_EventStatusExtendedType)。这些掩码定义了FID对事件的哪些状态敏感。
每个FID都有一个抑制掩码,两者都分配给一个特定的FID EventId。如果该事件具有一定的状态,并且如果事件状态与配置的掩码匹配,则对FID的抑制将激活。
Interaction with DEM
FIM模块的功能是基于DEM事件为控制SWC(允许/抑制)提供服务功能当所报告事件的监控状态发生变化时,如果DemTriggerFiMReports是启用的,DEM通过API函数FIM_DemTriggerOnMonitorStatus通知FIM监控状态的变化。在收到监视器状态变化的通知时,FIM使用Dem_GetMonitorStatus来重新计算函数抑制。
每个FID都有一个Inhibition Counter抑制计数器。抑制计数器包含当前抑制的EventIds的数量。如果状态与掩码匹配,则抑制计数器增加;否则,抑制计数器不会更新。这适用 FIM_GetFunctionPermission(如果权限状态必须在查询时计算)和FIM_MainFunction。
若FIM_DemTriggerOnMonitorStatus报告了监视器状态变化,则执行以下操作:
● 如果EventId的状态改变导致释放状态(掩码与监视器状态不匹配),则抑制计数器必须减小
● 如果EventId的状态变化导致抑制状态(掩码与监视器状态匹配),则抑制计数器必须增加
● 如果抑制计数器为》 0,则FID权限状态设置为FALSE,否则FID权限状态设置为TRUE
Interaction with SWC:
对于每个FID,SWC应提供导致FID抑制的events列表和mask掩码FIM模块应同步响应传入的查询来确保对功能的即时控制。FIM模块通过将权限状态存储为状态变量或在权限查询时计算事件状态来实现这一行为如果使用接口FIM_SetFunctionAvailable将一个函数(FID)设置为不可用,它的权限状态FIM_GetFunctionPermission总是返回FALSE。