当前位置: 首页 > news >正文

AUTOSAR进阶图解==>AUTOSAR_SWS_FunctionInhibitionManager

AUTOSAR Function Inhibition Manager 详解

基于AUTOSAR 4.4.0规范的功能抑制管理器架构与实现分析

目录

  1. 概述
  2. 模块架构分析
  3. 配置模型详解
  4. 操作序列分析
  5. 状态机机制
  6. 总结

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 数据流向

  1. 向下数据流:SW-C/BSW → FiM → Dem

    • 权限查询请求传递到FiM
    • FiM向Dem查询诊断事件状态
  2. 向上数据流:Dem → FiM → SW-C/BSW

    • Dem通知FiM状态变化
    • FiM计算并返回权限状态给调用者
  3. 横向数据流: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周期性轮询状态
FiMConfigSet配置集

FiMConfigSet容器

  • 功能:包含具体的FiM配置数据
  • 特点:支持多配置集,允许不同的配置变体
  • 包含元素:FiMFID、FiMInhibitionConfiguration、FiMSummaryEvent

3.2 核心配置类解释

FiMFID功能标识符

FiMFID类

  • 功能:定义系统中的功能标识符
  • 关键属性:
    • FiMFunctionId
      • 描述:功能的唯一数字标识符
      • 类型:Integer
      • 取值范围:1-65535 (0表示无功能)
      • 约束:在同一FiM实例中必须唯一
    • 功能标识符名称
      • 描述:功能的可读名称
      • 类型:String
      • 用途:配置工具中的显示和文档
    • 功能描述
      • 描述:功能的详细说明
      • 类型:String
      • 用途:帮助理解功能用途
FiMInhibitionConfiguration抑制配置

FiMInhibitionConfiguration类

  • 功能:定义FID与诊断事件的关联关系
  • 关键属性:
    • FiMInhibitionMask
      • 描述:抑制掩码,定义触发抑制的事件状态
      • 类型:FiMInhibitionMaskType
      • 可能值:TestFailed、Tested、NotTested的组合
    • 配置标识符
      • 描述:抑制配置的唯一标识
      • 类型:Integer
      • 用途:内部管理和引用
  • 引用关系:
    • 引用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 配置关系

包含关系
  1. FiM → FiMGeneral:FiM模块包含一个通用配置
  2. FiM → FiMConfigSet:FiM模块包含一个或多个配置集
  3. FiMConfigSet → FiMFID:配置集包含多个功能标识符
  4. FiMConfigSet → FiMInhibitionConfiguration:配置集包含多个抑制配置
  5. FiMSummaryEvent → DemEvent:汇总事件包含多个输入事件
引用关系
  1. FiMInhibitionConfiguration → FiMFID:抑制配置引用目标功能
  2. FiMInhibitionConfiguration → DemEvent:抑制配置引用监控事件
  3. FiMInhibitionConfiguration → DemComponent:抑制配置引用监控组件
  4. FiMInhibitionConfiguration → FiMSummaryEvent:抑制配置引用汇总事件
类型使用关系
  1. FiMFID → FiMFunctionIdType:功能标识符使用功能ID类型
  2. 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 能够为汽车电子系统提供可靠的功能安全保障,确保车辆在各种工况下的安全稳定运行。


http://www.dtcms.com/a/339075.html

相关文章:

  • Spring Ai Chat Memory
  • Python 与 VS Code 结合操作指南
  • 【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案
  • 【什么是非晶合金?非晶电机有什么优点?】
  • Redis面试题及详细答案100道(71-85) --- 综合篇
  • Vim笔记:缩进
  • KMM跨平台叛逃实录:SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架(代码复用率85%)
  • Qt5 GUI 编程详解
  • 【AI大模型的发展历史】从Transformer到2025年的多模态、推理与开源革命
  • mlir 类型
  • docker 数据卷、自定义镜像操作演示分享(第二期)
  • 【数据结构】堆和二叉树详解(下)
  • SpringAI——向量存储(vector store)
  • SpringClound——网关、服务保护和分布式事务
  • Redis-缓存-击穿-分布式锁
  • 使用ros2跑mid360的fastlio2算法详细教程
  • 【数据结构】用堆解决TOPK问题
  • 算法训练营day56 图论⑥ 108. 109.冗余连接系列
  • C++---为什么迭代器常用auto类型?
  • 强、软、弱、虚引用
  • 在 Qt C++ 中利用 OpenCV 实现视频处理技术详解
  • 尝试Claude Code的安装
  • 学习笔记分享——基于STM32的平衡车项目
  • Mac调试ios的safari浏览器打开的页面
  • 电子电气架构 --- 软件项目成本估算
  • 技术攻坚全链铸盾 锁定12月济南第26届食品农产品安全高峰论坛
  • 任务十二 我的页面及添加歌曲功能开发
  • Typescript入门-对象讲解
  • Python量化交易:结合爬虫与TA-Lib技术指标分析
  • Matplotlib数据可视化实战:Matplotlib子图布局与管理入门