AUTOSAR进阶图解==>AUTOSAR_SRS_FunctionInhibitionManager

AUTOSAR 功能抑制管理器(FIM)详解

基于AUTOSAR标准的功能抑制与控制机制

目录

  1. 概述
  2. FIM架构
  3. FIM配置与数据结构
  4. FIM权限状态
  5. FIM交互流程
  6. 总结

1. 概述

AUTOSAR功能抑制管理器(Function Inhibition Manager, FIM)是AUTOSAR标准中定义的一个系统服务模块,用于控制ECU中功能的启用和禁用。FIM提供了一种标准化的机制,使应用软件可以在特定条件下禁止某些功能的执行,尤其是在诊断事件发生或某些服务不可用的情况下。

FIM的主要目标是:

  • 定义FIM功能的需求
  • 明确FIM与其他控制机制(如RTE)的区别
  • 指定FIM的配置要素和预设条件

FIM主要应用于非安全关键系统,对于安全关键系统可能需要额外的需求。


2. FIM架构

功能抑制管理器在AUTOSAR架构中作为系统服务模块,与其他模块如诊断事件管理器(DEM)和诊断通信管理器(DCM)协同工作。

在这里插入图片描述

2.1 架构组件说明

  1. 功能抑制管理器(FIM)

    • 功能:FIM是一个系统服务模块,负责管理功能的禁用/启用状态,并提供权限状态查询接口。
    • 职责
      • 管理ECU中功能的启用和禁用状态
      • 提供统一的查询接口给应用层
      • 支持不同的抑制选项配置
      • 支持OBD功能抑制
  2. 应用软件组件(SWC)

    • 功能:应用层软件组件在执行特定功能前,需要查询FIM获取权限状态。
    • 交互方式:通过RTE提供的接口调用FIM API查询权限状态。
  3. OBD功能

    • 功能:车载诊断相关功能,需要特殊的权限管理。
    • 特殊性:OBD功能可能需要特殊的权限计算方法。
  4. 诊断事件管理器(DEM)

    • 功能:管理ECU中的诊断事件和故障码。
    • 与FIM关系:FIM根据DEM提供的诊断事件状态决定是否抑制功能。
  5. 诊断通信管理器(DCM)

    • 功能:处理诊断请求和响应。
    • 与FIM关系:通过DCM可以获取和设置FIM的状态。

2.2 接口说明

  1. FIM查询API

    • 功能:提供权限状态查询接口
    • 调用方:应用软件组件
    • 实现:根据配置的抑制条件和当前状态返回权限状态
  2. 诊断事件状态

    • 功能:获取诊断事件状态
    • 提供方:诊断事件管理器(DEM)
    • 使用场景:当抑制条件包含诊断事件时,FIM通过此接口获取事件状态
  3. 诊断请求处理

    • 功能:处理外部诊断工具请求
    • 提供方:诊断通信管理器(DCM)
    • 使用场景:外部诊断工具通过DCM访问FIM状态
  4. 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 配置类说明

  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
  2. Fim_FunctionIdType

    • 功能:定义功能ID及其状态
    • 关键属性
      • FunctionId
        • 描述:功能的唯一标识符
        • 类型:uint16
        • 取值范围:0-65535
        • 约束:必须唯一
      • FunctionStatus
        • 描述:功能的当前状态
        • 类型:uint8
        • 取值范围:见Fim_FunctionStatusType
        • 默认值:取决于初始化配置
  3. Fim_InhibitOptionsType

    • 功能:定义功能抑制的条件
      • FIM_INHIBIT_NONE (0x00):无抑制条件
      • FIM_INHIBIT_DIAGNOSTIC (0x01):基于诊断事件抑制
      • FIM_INHIBIT_EVENTUNAVAILABLE (0x02):基于事件可用性抑制
      • FIM_INHIBIT_ALL (0x03):所有条件都会导致抑制
  4. Fim_FunctionStatusType

    • 功能:定义功能状态
      • FIM_FUNCTION_DISABLED (0x00):功能禁用
      • FIM_FUNCTION_ENABLED (0x01):功能启用
      • FIM_FUNCTION_INHIBITED (0x02):功能被抑制
  5. 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 权限状态说明

  1. 未初始化状态

    • 描述:模块尚未初始化,功能权限状态不可用
    • 转换条件
      • 系统启动时,FIM处于未初始化状态
      • 调用Fim_Init()初始化模块后,根据InitPermission配置转换到允许或拒绝状态
  2. 允许状态(FIM_PERMISSION_ALLOWED)

    • 描述:功能被允许执行
    • 特性
      • API返回FIM_PERMISSION_ALLOWED
      • 应用可以正常运行相关功能
      • 状态可能因抑制条件变化而改变
    • 转换条件
      • 初始化时,如果InitPermission为TRUE
      • 抑制条件清除且功能已启用
      • 权限状态被外部工具更新
  3. 拒绝状态(FIM_PERMISSION_DENIED)

    • 描述:功能被禁止执行
    • 特性
      • API返回FIM_PERMISSION_DENIED
      • 应用必须禁用相关功能
      • 状态持续直到抑制条件清除
    • 转换条件
      • 初始化时,如果InitPermission为FALSE
      • 诊断事件激活且配置了诊断抑制
      • 事件不可用且配置了事件可用性抑制
      • 权限状态被外部工具更新

4.2 抑制条件处理

  1. 诊断事件抑制

    • 触发条件:诊断事件激活且InhibitOptions包含FIM_INHIBIT_DIAGNOSTIC
    • 处理逻辑
      • FIM通过DEM获取诊断事件状态
      • 如果事件状态为激活,则将权限状态设为DENIED
      • 如果事件状态变为非激活,且没有其他抑制条件,则恢复为ALLOWED
  2. 事件可用性抑制

    • 触发条件:事件不可用且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 序列流程说明

  1. 模块初始化

    • 参与者:应用、FIM
    • 描述:系统启动时,应用调用Fim_Init()初始化FIM模块,设置初始权限状态
    • 函数
      • Fim_Init(ConfigPtr)
        • 描述:初始化FIM模块
        • 参数:
          • ConfigPtr [输入]: FIM配置数据结构指针,类型为Fim_ConfigType*
        • 返回值:无
  2. 功能权限查询

    • 参与者:应用、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无效
  3. 诊断事件处理

    • 参与者:FIM、DEM
    • 描述:当配置了诊断事件抑制时,FIM通过DEM获取事件状态并计算权限
    • 函数
      • Dem_GetEventStatus(EventId, &eventStatus)
        • 描述:获取诊断事件状态
        • 参数:
          • EventId [输入]: 诊断事件ID
          • eventStatus [输出]: 事件状态
        • 返回值:
          • E_OK: 操作成功
          • E_NOT_OK: 操作失败
  4. 事件可用性检查

    • 参与者:FIM
    • 描述:当配置了事件可用性抑制时,FIM检查事件可用性状态
    • 函数
      • Fim_IsEventAvailable(FID)
        • 描述:检查功能关联的事件是否可用
        • 参数:
          • FID [输入]: 功能ID
        • 返回值:
          • TRUE: 事件可用
          • FALSE: 事件不可用
  5. OBD功能处理

    • 参与者:FIM
    • 描述:对于OBD功能,FIM可能需要特殊的权限计算方法
    • 函数
      • Fim_ProcessOBDFunction(functionIndex)
        • 描述:处理OBD功能的特殊权限计算
        • 参数:
          • functionIndex [输入]: 功能索引
        • 返回值:
          • TRUE: 需要抑制功能
          • FALSE: 不需要抑制功能

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可广泛应用于以下场景:

  1. 故障安全策略:当检测到故障时,自动禁用受影响的功能
  2. 诊断服务控制:在诊断会话期间,控制特定功能的可用性
  3. OBD监控:管理OBD相关功能的执行权限
  4. 功能降级:在系统降级模式下,有选择地禁用非关键功能
  5. 资源管理:在资源受限的情况下,控制高资源消耗功能的执行

6.3 最佳实践

在使用FIM时,应遵循以下最佳实践:

  1. 合理配置抑制条件:根据系统需求和安全策略,合理配置每个功能的抑制条件
  2. 执行前查询:应用软件在执行功能前,必须查询FIM获取权限状态
  3. 遵循权限结果:严格遵循FIM返回的权限结果,不允许执行被禁止的功能
  4. 优化性能:避免频繁查询,可以缓存权限状态,仅在必要时更新
  5. 处理异常:妥善处理FIM查询失败的情况,实施合适的失败安全策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值