AUTOSAR进阶图解==>AUTOSAR_SWS_FunctionInhibitionManager
AUTOSAR Function Inhibition Manager 详解
基于AUTOSAR 4.4.0规范的功能抑制管理器架构与实现分析
目录
- 概述
- 模块架构分析
- 配置模型详解
- 操作序列分析
- 状态机机制
- 总结
1. 概述
Function Inhibition Manager (FiM) 是AUTOSAR Classic Platform中的重要服务模块,负责提供软件组件和基础软件模块的功能控制机制。FiM通过与诊断事件管理器(Dem)的协作,基于诊断事件状态来控制功能的执行权限,实现故障情况下的功能抑制和系统保护。
1.1 FiM的作用
- 功能权限管理:为软件组件提供功能执行权限查询服务
- 诊断事件响应:基于诊断事件状态动态调整功能权限
- 故障安全机制:在检测到故障时及时抑制相关功能,防止系统进一步损坏
- 配置化控制:通过配置定义功能与诊断事件的关联关系
1.2 核心概念
- FID (Function Identifier):功能标识符,用于唯一标识一个可控制的功能
- 抑制条件:定义何时需要抑制功能执行的条件,通常基于诊断事件状态
- 权限状态:功能当前是否被允许执行的状态(TRUE/FALSE)
- 抑制掩码:定义诊断事件的哪些状态会触发功能抑制
2. 模块架构分析
2.1 架构组件解释
应用层组件
SW-Components (软件组件):
- 功能:应用层软件组件,包含业务逻辑功能
- 职责:
- 在执行关键功能前查询FiM获取执行权限
- 根据权限状态决定是否执行功能
- 可选择性地设置功能的可用性状态
- 与FiM的交互:
- 调用
FiM_GetFunctionPermission()
查询功能权限 - 调用
FiM_SetFunctionAvailable()
设置功能可用性
- 调用
BSW Modules (基础软件模块):
- 功能:系统级基础软件模块
- 职责:
- 与SW-C类似,需要查询功能执行权限
- 实现系统级功能的抑制控制
- 接口:使用与SW-C相同的FiM接口
服务层核心组件
Function Inhibition Manager (FiM):
- 功能:功能抑制管理器核心模块
- 主要子组件:
- 权限状态计算:基于诊断事件状态和抑制配置计算功能权限
- 抑制配置管理:管理FID与诊断事件的映射关系
- FID权限查询:处理来自SW-C和BSW的权限查询请求
诊断层组件
Diagnostic Event Manager (Dem):
- 功能:诊断事件管理器
- 职责:
- 监控系统中的诊断事件状态
- 向FiM通知监控状态变化
- 提供诊断事件和组件的状态查询接口
- 与FiM的交互:
- 调用
FiM_DemTriggerOnMonitorStatus()
通知状态变化 - 提供
Dem_GetMonitorStatus()
接口供FiM查询状态
- 调用
系统管理层组件
ECU State Manager (EcuM):
- 功能:ECU状态管理器
- 职责:负责FiM模块的初始化和生命周期管理
- 初始化序列:调用
FiM_Init()
和FiM_DemInit()
Runtime Environment (RTE):
- 功能:运行时环境
- 职责:
- 为FiM提供调度服务
- 管理FiM与其他模块间的接口通信
- 处理端口定义的参数值映射
2.2 接口关系
FiM API接口:
FiM_GetFunctionPermission(FID, Permission*)
: 查询功能权限FiM_SetFunctionAvailable(FID, Availability)
: 设置功能可用性
Dem API接口:
FiM_DemTriggerOnMonitorStatus(EventId)
: 监控状态变化通知FiM_DemTriggerOnComponentStatus(ComponentId, Status)
: 组件状态变化通知
初始化接口:
FiM_Init(ConfigPtr)
: FiM模块初始化FiM_DemInit()
: FiM与Dem协作初始化
2.3 数据流向
-
向下数据流:SW-C/BSW → FiM → Dem
- 权限查询请求传递到FiM
- FiM向Dem查询诊断事件状态
-
向上数据流:Dem → FiM → SW-C/BSW
- Dem通知FiM状态变化
- FiM计算并返回权限状态给调用者
-
横向数据流:EcuM ↔ RTE ↔ FiM
- 系统管理和调度协调
2.4 架构特点
- 分层设计:清晰的分层架构,职责分离
- 接口标准化:使用AUTOSAR标准接口,确保互操作性
- 配置驱动:通过配置定义行为,提高灵活性
- 实时响应:支持同步权限查询,满足实时性要求
2.5 代码示例
/* AUTOSAR FiM架构相关的接口定义 *//* SW-C查询功能权限示例 */
Std_ReturnType Application_CheckPermissionAndExecute(void)
{boolean permission;Std_ReturnType result;/* 查询功能权限 */result = FiM_GetFunctionPermission(FID_CRITICAL_FUNCTION, &permission);if (result == E_OK) {if (permission == TRUE) {/* 权限允许,执行功能 */return ExecuteCriticalFunction();} else {/* 权限被拒绝,跳过功能执行 */return E_NOT_OK;}} else {/* FiM未初始化或其他错误 */return E_NOT_OK;}
}/* FiM内部权限计算示例 */
static boolean FiM_Internal_CalculatePermission(uint16 FID)
{uint16 inhibitionCounter = 0;uint16 eventIndex;Dem_MonitorStatusType monitorStatus;Std_ReturnType demResult;/* 遍历与此FID关联的所有事件 */for (eventIndex = 0; eventIndex < FiM_Config[FID].NumEvents; eventIndex++) {/* 获取事件的监控状态 */demResult = Dem_GetMonitorStatus(FiM_Config[FID].EventList[eventIndex].EventId,&monitorStatus);if (demResult == E_OK) {/* 应用抑制掩码检查 */if ((monitorStatus & FiM_Config[FID].EventList[eventIndex].InhibitionMask) != 0) {inhibitionCounter++;}}}/* 如果有任何抑制条件激活,则拒绝权限 */return (inhibitionCounter == 0) ? TRUE : FALSE;
}/* Dem通知FiM状态变化示例 */
void FiM_DemTriggerOnMonitorStatus(Dem_EventIdType EventId)
{uint16 fidIndex;/* 开发错误检测 */if (FiM_InitStatus != FIM_INITIALIZED) {Det_ReportError(FIM_MODULE_ID, 0, FIM_DEMTRIGGERONMONITORSTATUS_ID, FIM_E_UNINIT);return;}/* 查找受此事件影响的所有FID */for (fidIndex = 0; fidIndex < FIM_MAX_FIDS; fidIndex++) {if (FiM_Internal_IsEventAssociatedWithFID(EventId, fidIndex)) {/* 重新计算此FID的权限状态 */FiM_PermissionStatus[fidIndex] = FiM_Internal_CalculatePermission(fidIndex);}}
}
3. 配置模型详解
3.1 配置容器层次结构
FiM主容器
FiM模块容器:
- 功能:FiM模块的根配置容器
- 关键属性:
- 模块名称:固定为"FiM"
- 支持变体:VARIANT-POST-BUILD(后构建变体)和VARIANT-PRE-COMPILE(预编译变体)
- 后构建变体支持:允许在ECU集成时修改配置
- 包含子容器:FiMGeneral和FiMConfigSet
FiMGeneral通用配置
FiMGeneral容器:
- 功能:定义FiM模块的通用行为参数
- 关键配置参数:
- FiMAvailabilitySupport:
- 描述:是否支持功能可用性控制
- 类型:Boolean
- 影响:启用时支持
FiM_SetFunctionAvailable()
API
- FiMVersionInfoApi:
- 描述:是否提供版本信息API
- 类型:Boolean
- 影响:启用时提供
FiM_GetVersionInfo()
API
- FiMDevErrorDetect:
- 描述:是否启用开发错误检测
- 类型:Boolean
- 影响:启用时进行参数检查和错误报告
- FiMMainFunctionPeriod:
- 描述:主函数调用周期(秒)
- 类型:Float [0.0…∞]
- 用途:定义
FiM_MainFunction()
的调用间隔
- FiMEventUpdateTriggeredByDem:
- 描述:事件更新是否由Dem触发
- 类型:Boolean
- TRUE:Dem主动通知状态变化
- FALSE:FiM周期性轮询状态
- FiMAvailabilitySupport:
FiMConfigSet配置集
FiMConfigSet容器:
- 功能:包含具体的FiM配置数据
- 特点:支持多配置集,允许不同的配置变体
- 包含元素:FiMFID、FiMInhibitionConfiguration、FiMSummaryEvent
3.2 核心配置类解释
FiMFID功能标识符
FiMFID类:
- 功能:定义系统中的功能标识符
- 关键属性:
- FiMFunctionId:
- 描述:功能的唯一数字标识符
- 类型:Integer
- 取值范围:1-65535 (0表示无功能)
- 约束:在同一FiM实例中必须唯一
- 功能标识符名称:
- 描述:功能的可读名称
- 类型:String
- 用途:配置工具中的显示和文档
- 功能描述:
- 描述:功能的详细说明
- 类型:String
- 用途:帮助理解功能用途
- FiMFunctionId:
FiMInhibitionConfiguration抑制配置
FiMInhibitionConfiguration类:
- 功能:定义FID与诊断事件的关联关系
- 关键属性:
- FiMInhibitionMask:
- 描述:抑制掩码,定义触发抑制的事件状态
- 类型:FiMInhibitionMaskType
- 可能值:TestFailed、Tested、NotTested的组合
- 配置标识符:
- 描述:抑制配置的唯一标识
- 类型:Integer
- 用途:内部管理和引用
- FiMInhibitionMask:
- 引用关系:
- 引用FiMFID:指定被控制的功能
- 引用DemEvent:指定监控的诊断事件
- 引用DemComponent:指定监控的诊断组件
- 引用FiMSummaryEvent:指定监控的汇总事件
FiMSummaryEvent汇总事件
FiMSummaryEvent类:
- 功能:将多个诊断事件组合成一个逻辑单元
- 关键属性:
- 汇总事件名称:
- 描述:汇总事件的名称
- 类型:String
- 用途:配置中的标识
- 事件组描述:
- 描述:说明包含的事件类型
- 类型:String
- 用途:文档和理解
- 最大输入事件数:
- 描述:此汇总事件可包含的最大事件数
- 类型:Integer
- 约束:配置验证时使用
- 汇总事件名称:
- 包含关系:包含多个DemEvent作为输入事件
3.3 数据类型定义
FiM_ConfigType配置类型
FiM_ConfigType结构:
- 功能:FiM模块的配置数据结构
- 关键属性:
- 配置数据指针:指向实际配置数据的指针
- 初始化标志:标识配置是否有效
- 配置版本:配置数据的版本信息
- 用途:在
FiM_Init()
时传递配置信息
FiM_FunctionIdType功能ID类型
FiM_FunctionIdType类型:
- 功能:定义功能标识符的数据类型
- 类型选择:
- uint8:支持1-255个功能
- uint16:支持1-65535个功能
- 取值范围:根据系统复杂度选择
- 约束:0值保留,表示无效功能
FiMInhibitionMaskType抑制掩码类型
FiMInhibitionMaskType结构:
- 功能:定义抑制掩码的位字段
- 关键位字段:
- 测试失败位:事件测试失败时触发抑制
- 测试完成位:事件测试完成时触发抑制
- 测试未完成位:事件未测试时触发抑制
- 掩码值:位字段的组合值
- 逻辑:当事件状态与掩码匹配时,触发功能抑制
3.4 配置关系
包含关系
- FiM → FiMGeneral:FiM模块包含一个通用配置
- FiM → FiMConfigSet:FiM模块包含一个或多个配置集
- FiMConfigSet → FiMFID:配置集包含多个功能标识符
- FiMConfigSet → FiMInhibitionConfiguration:配置集包含多个抑制配置
- FiMSummaryEvent → DemEvent:汇总事件包含多个输入事件
引用关系
- FiMInhibitionConfiguration → FiMFID:抑制配置引用目标功能
- FiMInhibitionConfiguration → DemEvent:抑制配置引用监控事件
- FiMInhibitionConfiguration → DemComponent:抑制配置引用监控组件
- FiMInhibitionConfiguration → FiMSummaryEvent:抑制配置引用汇总事件
类型使用关系
- FiMFID → FiMFunctionIdType:功能标识符使用功能ID类型
- FiMInhibitionConfiguration → FiMInhibitionMaskType:抑制配置使用掩码类型
3.5 配置约束
必选配置约束
- 每个FiMInhibitionConfiguration必须至少引用以下之一:
- FiMInhEventRef(事件引用)
- FiMInhComponentRef(组件引用)
- FiMInhSumRef(汇总事件引用)
唯一性约束
- FiMFunctionId在同一FiM实例中必须唯一
- 配置标识符在同一配置集中必须唯一
数量约束
- 最大抑制配置数:FiMMaxFiMInhibitionConfigurations
- 每个FID最大事件数:FiMMaxEventsPerFidInhibitionConfiguration
- 每个FID最大汇总事件数:FiMMaxSumEventsPerFidInhibitionConfiguration
3.6 代码示例
/* AUTOSAR FiM配置相关的数据结构定义 *//* 功能标识符类型定义 */
typedef uint16 FiM_FunctionIdType; /* 支持65535个功能 *//* 抑制掩码类型定义 */
typedef struct {uint8 TestFailedBit : 1; /* 测试失败位 */uint8 TestedBit : 1; /* 已测试位 */uint8 NotTestedBit : 1; /* 未测试位 */uint8 Reserved : 5; /* 保留位 */
} FiMInhibitionMaskType;/* 抑制配置结构 */
typedef struct {FiM_FunctionIdType FunctionId; /* 目标功能ID */Dem_EventIdType EventId; /* 关联的诊断事件ID */FiMInhibitionMaskType InhibitionMask; /* 抑制掩码 */
} FiMInhibitionConfigType;/* FID配置结构 */
typedef struct {FiM_FunctionIdType FunctionId; /* 功能ID */uint8 NumInhibitionConfigs; /* 抑制配置数量 */const FiMInhibitionConfigType* InhibitionConfigs; /* 抑制配置数组 */
} FiMFIDConfigType;/* FiM总配置结构 */
typedef struct {uint16 NumFIDs; /* FID总数 */const FiMFIDConfigType* FIDConfigs; /* FID配置数组 */boolean AvailabilitySupport; /* 可用性支持 */boolean DevErrorDetect; /* 开发错误检测 */boolean EventUpdateTriggeredByDem; /* Dem触发更新 */
} FiM_ConfigType;/* 配置实例示例 */
static const FiMInhibitionConfigType FID_CriticalFunction_InhibitionConfigs[] = {{.FunctionId = FID_CRITICAL_FUNCTION,.EventId = DEM_EVENT_SENSOR_FAILURE,.InhibitionMask = {.TestFailedBit = 1, /* 测试失败时抑制 */.TestedBit = 0, /* 测试完成时不抑制 */.NotTestedBit = 0 /* 未测试时不抑制 */}},{.FunctionId = FID_CRITICAL_FUNCTION,.EventId = DEM_EVENT_ACTUATOR_FAILURE,.InhibitionMask = {.TestFailedBit = 1, /* 测试失败时抑制 */.TestedBit = 0,.NotTestedBit = 1 /* 未测试时也抑制 */}}
};static const FiMFIDConfigType FiM_FIDConfigs[] = {{.FunctionId = FID_CRITICAL_FUNCTION,.NumInhibitionConfigs = 2,.InhibitionConfigs = FID_CriticalFunction_InhibitionConfigs}
};const FiM_ConfigType FiM_Config = {.NumFIDs = 1,.FIDConfigs = FiM_FIDConfigs,.AvailabilitySupport = TRUE,.DevErrorDetect = TRUE,.EventUpdateTriggeredByDem = TRUE
};/* 配置访问函数示例 */
static const FiMFIDConfigType* FiM_GetFIDConfig(FiM_FunctionIdType FID)
{uint16 index;for (index = 0; index < FiM_Config.NumFIDs; index++) {if (FiM_Config.FIDConfigs[index].FunctionId == FID) {return &FiM_Config.FIDConfigs[index];}}return NULL; /* FID未找到 */
}/* 抑制掩码检查函数示例 */
static boolean FiM_CheckInhibitionMask(const FiMInhibitionMaskType* mask,Dem_MonitorStatusType monitorStatus
)
{boolean inhibit = FALSE;/* 检查测试失败位 */if ((mask->TestFailedBit == 1) && ((monitorStatus & DEM_MONITOR_STATUS_TF) != 0)) {inhibit = TRUE;}/* 检查已测试位 */if ((mask->TestedBit == 1) && ((monitorStatus & DEM_MONITOR_STATUS_TNCTOC) == 0)) {inhibit = TRUE;}/* 检查未测试位 */if ((mask->NotTestedBit == 1) && ((monitorStatus & DEM_MONITOR_STATUS_TNCTOC) != 0)) {inhibit = TRUE;}return inhibit;
}
4. 操作序列分析
4.1 关键函数详解
FiM_GetFunctionPermission函数
函数签名:
Std_ReturnType FiM_GetFunctionPermission(FiM_FunctionIdType FID,boolean* Permission
)
描述:查询指定功能的执行权限状态
参数:
- FID(输入):功能标识符,取值范围1-65535
- Permission(输出):权限状态指针,TRUE表示允许执行,FALSE表示禁止执行
返回值: - E_OK:请求成功处理
- E_NOT_OK:请求失败(如FiM未初始化)
相关函数: - 上层:被SW-C和BSW模块调用
- 下层:可能调用Dem_GetMonitorStatus查询状态
- 并列:与FiM_SetFunctionAvailable功能相关
5. 状态机机制
5.1 FiM模块状态机
未初始化状态
状态特征:
- 含义:FiM模块尚未进行任何初始化
- 特征:
- 静态状态变量为0
- 所有内部数据结构未初始化
- 内存分配未完成
- 进入条件:系统启动或模块复位后的初始状态
- 退出条件:调用
FiM_Init()
函数
完全初始化状态
状态特征:
- 含义:FiM完全初始化,所有功能可用
- 特征:
- 与Dem的协作关系已建立
- 初始权限状态已计算
- 所有配置验证完成
- 准备处理运行时请求
- 进入条件:
FiM_DemInit()
调用成功且权限状态计算完成 - 退出条件:ECU关闭
5.2 FID权限状态机
权限允许状态
状态特征:
- 含义:功能被允许执行
- 特征:
- Permission = TRUE
- 无激活的抑制条件
- 功能可以正常执行
- 进入条件:所有关联的诊断事件状态都不匹配抑制掩码
- 退出条件:至少一个关联事件状态匹配抑制掩码,或被强制设置为不可用
权限拒绝状态
状态特征:
- 含义:功能被禁止执行
- 特征:
- Permission = FALSE
- 存在激活的抑制条件
- 功能不能执行
- 进入条件:至少一个关联的诊断事件状态匹配抑制掩码
- 退出条件:所有抑制条件解除(事件状态不再匹配掩码)
6. 总结
6.1 AUTOSAR Function Inhibition Manager 的优势
系统安全性:
- 提供基于诊断事件的功能抑制机制,在检测到故障时及时阻止危险功能的执行
- 支持多层次的抑制条件配置,可以根据不同的故障严重程度采取相应的抑制策略
- 实现故障安全(Fail-Safe)设计理念,确保系统在异常情况下的安全运行
架构灵活性:
- 配置驱动的设计允许在不修改代码的情况下调整抑制策略
- 支持后构建配置变体,可以在ECU集成阶段根据具体需求调整配置
- 模块化设计便于与其他AUTOSAR模块集成和协作
实时性能:
- 支持同步权限查询,满足实时系统的响应时间要求
- 提供两种更新模式(Dem触发和周期性轮询),可根据系统需求选择合适的方式
- 优化的数据结构设计确保高效的权限状态计算和查询
6.2 典型应用场景
汽车动力系统:
- 在检测到发动机传感器故障时,抑制相关的动力输出功能
- 基于冷却系统状态控制发动机保护功能
- 根据燃油系统诊断结果管理燃油喷射策略
底盘控制系统:
- 制动系统故障时抑制自动驾驶功能
- 转向系统异常时限制车辆稳定性控制功能
- 轮胎压力监测异常时调整牵引力控制策略
安全关键系统:
- 气囊系统自检异常时抑制相关安全功能
- 防盗系统故障时限制车辆启动功能
- 紧急制动系统异常时激活替代安全措施
6.3 实施建议
配置设计:
- 合理规划FID的分配,确保功能标识符的唯一性和可扩展性
- 仔细设计抑制掩码,平衡安全性和可用性需求
- 充分利用汇总事件机制简化复杂的事件关联关系
性能优化:
- 根据系统实时性要求选择合适的更新模式
- 优化抑制配置的数量和复杂度,避免过度的计算开销
- 考虑使用缓存机制提高频繁查询的FID的响应速度
测试验证:
- 建立完整的测试用例覆盖所有抑制条件和状态转换
- 进行故障注入测试验证抑制机制的有效性
- 测试不同负载条件下的系统性能表现
通过合理的设计和实施,AUTOSAR Function Inhibition Manager 能够为汽车电子系统提供可靠的功能安全保障,确保车辆在各种工况下的安全稳定运行。