AUTOSAR 功能抑制管理器(FIM)详解
目录
1. 概述
AUTOSAR功能抑制管理器(Function Inhibition Manager, FIM)是AUTOSAR标准中定义的一个系统服务模块,用于控制ECU中功能的启用和禁用。FIM提供了一种标准化的机制,使应用软件可以在特定条件下禁止某些功能的执行,尤其是在诊断事件发生或某些服务不可用的情况下。
FIM的主要目标是:
- 定义FIM功能的需求
- 明确FIM与其他控制机制(如RTE)的区别
- 指定FIM的配置要素和预设条件
FIM主要应用于非安全关键系统,对于安全关键系统可能需要额外的需求。
2. FIM架构
功能抑制管理器在AUTOSAR架构中作为系统服务模块,与其他模块如诊断事件管理器(DEM)和诊断通信管理器(DCM)协同工作。
2.1 架构组件说明
-
功能抑制管理器(FIM)
- 功能:FIM是一个系统服务模块,负责管理功能的禁用/启用状态,并提供权限状态查询接口。
- 职责:
- 管理ECU中功能的启用和禁用状态
- 提供统一的查询接口给应用层
- 支持不同的抑制选项配置
- 支持OBD功能抑制
-
应用软件组件(SWC)
- 功能:应用层软件组件在执行特定功能前,需要查询FIM获取权限状态。
- 交互方式:通过RTE提供的接口调用FIM API查询权限状态。
-
OBD功能
- 功能:车载诊断相关功能,需要特殊的权限管理。
- 特殊性:OBD功能可能需要特殊的权限计算方法。
-
诊断事件管理器(DEM)
- 功能:管理ECU中的诊断事件和故障码。
- 与FIM关系:FIM根据DEM提供的诊断事件状态决定是否抑制功能。
-
诊断通信管理器(DCM)
- 功能:处理诊断请求和响应。
- 与FIM关系:通过DCM可以获取和设置FIM的状态。
2.2 接口说明
-
FIM查询API
- 功能:提供权限状态查询接口
- 调用方:应用软件组件
- 实现:根据配置的抑制条件和当前状态返回权限状态
-
诊断事件状态
- 功能:获取诊断事件状态
- 提供方:诊断事件管理器(DEM)
- 使用场景:当抑制条件包含诊断事件时,FIM通过此接口获取事件状态
-
诊断请求处理
- 功能:处理外部诊断工具请求
- 提供方:诊断通信管理器(DCM)
- 使用场景:外部诊断工具通过DCM访问FIM状态
-
ECU状态通知
- 功能:提供ECU状态信息
- 提供方:ECU状态管理器
- 使用场景:FIM可能根据ECU状态调整权限计算
2.3 代码示例
/* FIM模块初始化 */
void Fim_Init(const Fim_ConfigType* ConfigPtr)
{
uint16 i;
/* 参数检查 */
if (ConfigPtr == NULL)
{
/* 报告错误 */
return;
}
/* 保存配置指针 */
Fim_ConfigPtr = ConfigPtr;
/* 初始化各功能的权限状态 */
for (i = 0; i < Fim_MAX_FUNCTIONS; i++)
{
if (ConfigPtr->FunctionRef[i].FunctionId != FIM_INVALID_FUNCTION_ID)
{
/* 根据配置的初始权限设置功能状态 */
if (ConfigPtr->InitPermission[i] == TRUE)
{
Fim_PermissionStatus[i] = FIM_PERMISSION_ALLOWED;
}
else
{
Fim_PermissionStatus[i] = FIM_PERMISSION_DENIED;
}
}
}
/* 标记模块已初始化 */
Fim_InitStatus = FIM_INITIALIZED;
}
3. FIM配置与数据结构
功能抑制管理器通过静态配置定义监控的功能及其抑制条件。以下是FIM的核心配置结构:
3.1 配置类说明
-
Fim_ConfigType
- 功能:FIM模块的主配置结构,包含所有与FIM相关的配置参数
- 关键属性:
- FunctionRef:
- 描述:功能ID引用数组
- 类型:Fim_FunctionIdType数组
- 取值范围:0到Fim_MAX_FUNCTIONS-1
- 约束:每个功能ID必须唯一
- InitPermission:
- 描述:初始化时的权限状态
- 类型:boolean数组
- 取值范围:TRUE/FALSE
- 默认值:由配置工具设置
- DefaultPermission:
- 描述:默认权限状态
- 类型:boolean数组
- 取值范围:TRUE/FALSE
- 默认值:由配置工具设置
- InhibitOptions:
- 描述:功能抑制选项
- 类型:uint8数组
- 取值范围:见Fim_InhibitOptionsType
- 约束:根据抑制需求配置
- SummarizedEventState:
- 描述:汇总诊断事件状态
- 类型:boolean数组
- 取值范围:TRUE/FALSE
- 默认值:由配置工具设置
- OBDSupport:
- 描述:是否支持OBD功能
- 类型:boolean数组
- 取值范围:TRUE/FALSE
- 默认值:FALSE
- BooleanConfigOption:
- 描述:每个功能的布尔配置选项
- 类型:boolean数组
- 取值范围:TRUE/FALSE
- 默认值:FALSE
- FunctionRef:
-
Fim_FunctionIdType
- 功能:定义功能ID及其状态
- 关键属性:
- FunctionId:
- 描述:功能的唯一标识符
- 类型:uint16
- 取值范围:0-65535
- 约束:必须唯一
- FunctionStatus:
- 描述:功能的当前状态
- 类型:uint8
- 取值范围:见Fim_FunctionStatusType
- 默认值:取决于初始化配置
- FunctionId:
-
Fim_InhibitOptionsType
- 功能:定义功能抑制的条件
- 值:
- FIM_INHIBIT_NONE (0x00):无抑制条件
- FIM_INHIBIT_DIAGNOSTIC (0x01):基于诊断事件抑制
- FIM_INHIBIT_EVENTUNAVAILABLE (0x02):基于事件可用性抑制
- FIM_INHIBIT_ALL (0x03):所有条件都会导致抑制
-
Fim_FunctionStatusType
- 功能:定义功能状态
- 值:
- FIM_FUNCTION_DISABLED (0x00):功能禁用
- FIM_FUNCTION_ENABLED (0x01):功能启用
- FIM_FUNCTION_INHIBITED (0x02):功能被抑制
-
Fim_PermissionStatusType
- 功能:定义权限状态
- 值:
- FIM_PERMISSION_DENIED (0x00):拒绝执行
- FIM_PERMISSION_ALLOWED (0x01):允许执行
3.2 代码示例
/* FIM配置数据类型定义 */
typedef uint16 Fim_FunctionIdType;
typedef uint8 Fim_FunctionStatusType;
typedef uint8 Fim_InhibitOptionsType;
typedef uint8 Fim_PermissionStatusType;
/* 功能ID结构定义 */
typedef struct {
Fim_FunctionIdType FunctionId;
Fim_FunctionStatusType FunctionStatus;
} Fim_FunctionIdRefType;
/* FIM模块配置结构 */
typedef struct {
Fim_FunctionIdRefType FunctionRef[FIM_MAX_FUNCTIONS];
boolean InitPermission[FIM_MAX_FUNCTIONS];
boolean DefaultPermission[FIM_MAX_FUNCTIONS];
Fim_InhibitOptionsType InhibitOptions[FIM_MAX_FUNCTIONS];
boolean SummarizedEventState[FIM_MAX_FUNCTIONS];
boolean OBDSupport[FIM_MAX_FUNCTIONS];
boolean BooleanConfigOption[FIM_MAX_FUNCTIONS];
} Fim_ConfigType;
/* FIM配置实例示例 */
const Fim_ConfigType Fim_Config = {
/* FunctionRef */
{
{0x0001, FIM_FUNCTION_ENABLED},
{0x0002, FIM_FUNCTION_ENABLED},
{0x0003, FIM_FUNCTION_ENABLED},
/* 更多功能ID... */
},
/* InitPermission */
{
TRUE, /* 功能ID 0x0001 */
TRUE, /* 功能ID 0x0002 */
FALSE, /* 功能ID 0x0003 */
/* 更多初始权限... */
},
/* DefaultPermission */
{
TRUE, /* 功能ID 0x0001 */
TRUE, /* 功能ID 0x0002 */
FALSE, /* 功能ID 0x0003 */
/* 更多默认权限... */
},
/* InhibitOptions */
{
FIM_INHIBIT_DIAGNOSTIC, /* 功能ID 0x0001 */
FIM_INHIBIT_EVENTUNAVAILABLE, /* 功能ID 0x0002 */
FIM_INHIBIT_ALL, /* 功能ID 0x0003 */
/* 更多抑制选项... */
},
/* SummarizedEventState */
{
FALSE, /* 功能ID 0x0001 */
TRUE, /* 功能ID 0x0002 */
TRUE, /* 功能ID 0x0003 */
/* 更多汇总事件状态... */
},
/* OBDSupport */
{
FALSE, /* 功能ID 0x0001 */
FALSE, /* 功能ID 0x0002 */
TRUE, /* 功能ID 0x0003 - OBD功能 */
/* 更多OBD支持配置... */
},
/* BooleanConfigOption */
{
FALSE, /* 功能ID 0x0001 */
TRUE, /* 功能ID 0x0002 */
FALSE, /* 功能ID 0x0003 */
/* 更多布尔配置选项... */
}
};
4. FIM权限状态
功能抑制管理器维护每个功能的权限状态,并根据配置的抑制条件动态更新这些状态。
4.1 权限状态说明
-
未初始化状态
- 描述:模块尚未初始化,功能权限状态不可用
- 转换条件:
- 系统启动时,FIM处于未初始化状态
- 调用Fim_Init()初始化模块后,根据InitPermission配置转换到允许或拒绝状态
-
允许状态(FIM_PERMISSION_ALLOWED)
- 描述:功能被允许执行
- 特性:
- API返回FIM_PERMISSION_ALLOWED
- 应用可以正常运行相关功能
- 状态可能因抑制条件变化而改变
- 转换条件:
- 初始化时,如果InitPermission为TRUE
- 抑制条件清除且功能已启用
- 权限状态被外部工具更新
-
拒绝状态(FIM_PERMISSION_DENIED)
- 描述:功能被禁止执行
- 特性:
- API返回FIM_PERMISSION_DENIED
- 应用必须禁用相关功能
- 状态持续直到抑制条件清除
- 转换条件:
- 初始化时,如果InitPermission为FALSE
- 诊断事件激活且配置了诊断抑制
- 事件不可用且配置了事件可用性抑制
- 权限状态被外部工具更新
4.2 抑制条件处理
-
诊断事件抑制
- 触发条件:诊断事件激活且InhibitOptions包含FIM_INHIBIT_DIAGNOSTIC
- 处理逻辑:
- FIM通过DEM获取诊断事件状态
- 如果事件状态为激活,则将权限状态设为DENIED
- 如果事件状态变为非激活,且没有其他抑制条件,则恢复为ALLOWED
-
事件可用性抑制
- 触发条件:事件不可用且InhibitOptions包含FIM_INHIBIT_EVENTUNAVAILABLE
- 处理逻辑:
- FIM检查事件可用性状态
- 如果事件不可用,则将权限状态设为DENIED
- 如果事件变为可用,且没有其他抑制条件,则恢复为ALLOWED
4.3 代码示例
/* 获取功能权限状态 */
Std_ReturnType Fim_GetFunctionPermission(Fim_FunctionIdType FunctionId,
Fim_PermissionStatusType* PermissionStatus)
{
uint16 functionIndex = FIM_INVALID_INDEX;
boolean inhibitFunction = FALSE;
/* 检查模块初始化状态 */
if (Fim_InitStatus != FIM_INITIALIZED)
{
return FIM_E_UNINIT;
}
/* 检查参数有效性 */
if (PermissionStatus == NULL)
{
return E_NOT_OK;
}
/* 查找功能ID对应的索引 */
for (uint16 i = 0; i < FIM_MAX_FUNCTIONS; i++)
{
if (Fim_ConfigPtr->FunctionRef[i].FunctionId == FunctionId)
{
functionIndex = i;
break;
}
}
/* 检查功能ID是否有效 */
if (functionIndex == FIM_INVALID_INDEX)
{
return FIM_E_INVALID_FUNCID;
}
/* 检查功能是否启用 */
if (Fim_ConfigPtr->FunctionRef[functionIndex].FunctionStatus != FIM_FUNCTION_ENABLED)
{
*PermissionStatus = FIM_PERMISSION_DENIED;
return E_OK;
}
/* 检查诊断事件抑制 */
if ((Fim_ConfigPtr->InhibitOptions[functionIndex] & FIM_INHIBIT_DIAGNOSTIC) != 0)
{
Dem_EventStatusExtendedType eventStatus;
Dem_EventIdType eventId = Fim_GetAssociatedDemEventId(FunctionId);
if (Dem_GetEventStatus(eventId, &eventStatus) == E_OK)
{
/* 如果诊断事件为激活状态,抑制功能 */
if (eventStatus == DEM_EVENT_STATUS_FAILED)
{
inhibitFunction = TRUE;
}
}
}
/* 检查事件可用性抑制 */
if (!inhibitFunction &&
(Fim_ConfigPtr->InhibitOptions[functionIndex] & FIM_INHIBIT_EVENTUNAVAILABLE) != 0)
{
/* 检查事件可用性状态 */
if (Fim_IsEventAvailable(FunctionId) == FALSE)
{
inhibitFunction = TRUE;
}
}
/* 特殊处理OBD功能 */
if (!inhibitFunction && Fim_ConfigPtr->OBDSupport[functionIndex])
{
/* OBD功能特殊处理 */
inhibitFunction = Fim_ProcessOBDFunction(functionIndex);
}
/* 设置返回的权限状态 */
if (inhibitFunction)
{
*PermissionStatus = FIM_PERMISSION_DENIED;
}
else
{
*PermissionStatus = FIM_PERMISSION_ALLOWED;
}
return E_OK;
}
5. FIM交互流程
应用软件组件在执行功能前,需要通过FIM查询功能的权限状态。以下序列图展示了FIM的查询交互流程:
5.1 序列流程说明
-
模块初始化
- 参与者:应用、FIM
- 描述:系统启动时,应用调用Fim_Init()初始化FIM模块,设置初始权限状态
- 函数:
- Fim_Init(ConfigPtr)
- 描述:初始化FIM模块
- 参数:
- ConfigPtr [输入]: FIM配置数据结构指针,类型为Fim_ConfigType*
- 返回值:无
- Fim_Init(ConfigPtr)
-
功能权限查询
- 参与者:应用、RTE、FIM、DEM
- 描述:应用通过RTE接口查询功能权限状态,FIM根据抑制条件返回权限结果
- 函数:
- RTE__IsEnabled()
- 描述:RTE提供的应用接口,用于查询功能是否允许执行
- 参数:无
- 返回值:boolean,TRUE表示允许执行,FALSE表示禁止执行
- Fim_GetFunctionPermission(FID, &status)
- 描述:查询功能的权限状态
- 参数:
- FID [输入]: 功能ID,类型为Fim_FunctionIdType
- status [输出]: 权限状态,类型为Fim_PermissionStatusType*
- 返回值:
- E_OK: 操作成功
- FIM_E_UNINIT: 模块未初始化
- FIM_E_INVALID_FUNCID: 功能ID无效
- RTE__IsEnabled()
-
诊断事件处理
- 参与者:FIM、DEM
- 描述:当配置了诊断事件抑制时,FIM通过DEM获取事件状态并计算权限
- 函数:
- Dem_GetEventStatus(EventId, &eventStatus)
- 描述:获取诊断事件状态
- 参数:
- EventId [输入]: 诊断事件ID
- eventStatus [输出]: 事件状态
- 返回值:
- E_OK: 操作成功
- E_NOT_OK: 操作失败
- Dem_GetEventStatus(EventId, &eventStatus)
-
事件可用性检查
- 参与者:FIM
- 描述:当配置了事件可用性抑制时,FIM检查事件可用性状态
- 函数:
- Fim_IsEventAvailable(FID)
- 描述:检查功能关联的事件是否可用
- 参数:
- FID [输入]: 功能ID
- 返回值:
- TRUE: 事件可用
- FALSE: 事件不可用
- Fim_IsEventAvailable(FID)
-
OBD功能处理
- 参与者:FIM
- 描述:对于OBD功能,FIM可能需要特殊的权限计算方法
- 函数:
- Fim_ProcessOBDFunction(functionIndex)
- 描述:处理OBD功能的特殊权限计算
- 参数:
- functionIndex [输入]: 功能索引
- 返回值:
- TRUE: 需要抑制功能
- FALSE: 不需要抑制功能
- Fim_ProcessOBDFunction(functionIndex)
5.2 代码示例
/* RTE提供的应用接口示例 */
boolean RTE_AirConditioner_IsEnabled(void)
{
Fim_PermissionStatusType permissionStatus;
Std_ReturnType result;
/* 调用FIM查询权限状态 */
result = Fim_GetFunctionPermission(FIM_FUNC_AIR_CONDITIONER, &permissionStatus);
/* 检查查询结果 */
if (result != E_OK)
{
/* 查询失败,默认禁用功能 */
return FALSE;
}
/* 返回权限状态 */
return (permissionStatus == FIM_PERMISSION_ALLOWED) ? TRUE : FALSE;
}
/* 应用使用示例 */
void Application_ControlAirConditioner(void)
{
/* 查询功能是否允许执行 */
if (RTE_AirConditioner_IsEnabled())
{
/* 功能允许执行,正常控制空调 */
AirConditioner_SetTemperature(DESIRED_TEMPERATURE);
AirConditioner_SetFanSpeed(DESIRED_FAN_SPEED);
}
else
{
/* 功能不允许执行,禁用空调控制 */
AirConditioner_Disable();
/* 可能需要通知用户 */
HMI_DisplayMessage(MSG_AIR_CONDITIONER_DISABLED);
}
}
/* 诊断事件回调函数示例 */
void Dem_EventStatusChanged_Callback(Dem_EventIdType EventId,
Dem_EventStatusExtendedType EventStatus)
{
/* 当诊断事件状态变化时,更新相关功能的权限状态 */
Fim_UpdatePermissionStateForEvent(EventId, EventStatus);
}
6. 总结
AUTOSAR功能抑制管理器(FIM)提供了一种标准化的机制,用于控制ECU中功能的启用和禁用。通过FIM,可以在特定条件下(如诊断事件激活或事件不可用)自动抑制相关功能,提高系统的健壮性和安全性。
6.1 FIM的主要特点
- 标准化接口:提供统一的API接口,便于应用软件查询功能权限状态
- 灵活配置:支持不同的抑制选项,可根据需求配置抑制条件
- 诊断集成:与诊断系统紧密集成,可基于诊断事件状态抑制功能
- 事件可用性:支持基于事件可用性的功能抑制
- OBD支持:为OBD功能提供特殊的权限计算方法
- 汇总诊断事件:支持汇总诊断事件状态,简化诊断逻辑
6.2 应用场景
FIM可广泛应用于以下场景:
- 故障安全策略:当检测到故障时,自动禁用受影响的功能
- 诊断服务控制:在诊断会话期间,控制特定功能的可用性
- OBD监控:管理OBD相关功能的执行权限
- 功能降级:在系统降级模式下,有选择地禁用非关键功能
- 资源管理:在资源受限的情况下,控制高资源消耗功能的执行
6.3 最佳实践
在使用FIM时,应遵循以下最佳实践:
- 合理配置抑制条件:根据系统需求和安全策略,合理配置每个功能的抑制条件
- 执行前查询:应用软件在执行功能前,必须查询FIM获取权限状态
- 遵循权限结果:严格遵循FIM返回的权限结果,不允许执行被禁止的功能
- 优化性能:避免频繁查询,可以缓存权限状态,仅在必要时更新
- 处理异常:妥善处理FIM查询失败的情况,实施合适的失败安全策略