AUTOSAR进阶图解==>AUTOSAR_SWS_IOHardwareAbstraction
AUTOSAR IO硬件抽象层(IOHardwareAbstraction)详解
目录
- 概述
1.1 功能概述
1.2 设计目标 - IO硬件抽象层架构
2.1 架构概述
2.2 模块交互关系
2.3 层次结构 - 数据结构与类定义
3.1 核心数据结构
3.2 ECU信号概念
3.3 配置参数 - 工作流程与交互
4.1 ECU信号处理流程
4.2 初始化流程
4.3 IO信号处理 - 电源管理
5.1 低功耗状态转换
5.2 电源状态管理 - 错误处理
6.1 错误类型
6.2 错误处理策略 - API接口说明
7.1 初始化API
7.2 通知回调
7.3 调度函数
7.4 电源状态函数 - 总结与最佳实践
1. 概述
1.1 功能概述
IO硬件抽象层(IOHardwareAbstraction)是AUTOSAR Classic Platform中ECU抽象层的重要组成部分,旨在为软件组件提供对MCAL驱动的访问能力,同时隐藏底层硬件的实现细节。IOHardwareAbstraction通过将ECU信号(软件表示)映射到物理输入/输出端口,实现了软件与硬件之间的解耦。
IO硬件抽象层不应被视为单一模块,而可能由多个模块组成,其实现高度依赖于特定ECU的硬件配置。与通信层和其它标准化接口不同,IO硬件抽象层主要是以ECU为特定的实现代码。
1.2 设计目标
IO硬件抽象层的主要设计目标包括:
- 提供对MCAL驱动的访问能力
- 映射IO硬件抽象层端口到ECU信号
- 完全抽象物理层值,使软件组件开发人员无需了解MCAL驱动API和物理层值单位
- 提供信号滤波和去抖动等功能
- 实现硬件保护机制,防止硬件因异常情况受损
2. IO硬件抽象层架构
2.1 架构概述
下图展示了IO硬件抽象层在AUTOSAR架构中的位置以及与其他模块的关系:
2.2 模块交互关系
IO硬件抽象层组件:
- ECU信号接口:提供软件组件访问ECU信号的标准接口,是SWC与硬件交互的桥梁
- 硬件保护:负责检测并处理硬件故障,如短路、过载等异常情况
- 信号滤波/去抖动:对输入信号进行处理,提高信号质量
与MCAL驱动的交互:
- IO硬件抽象层调用MCAL驱动的API读写物理信号
- MCAL驱动通过通知回调向IO硬件抽象层报告事件
- 支持的驱动包括:ADC、DIO、ICU、PWM、PORT、GPT、OCU等
与系统服务的交互:
- 诊断通信管理器(DCM):提供功能诊断接口,用于诊断和控制ECU信号
- ECU状态管理器:处理初始化功能和电源状态变化
- 默认错误跟踪器(DET):用于错误报告和跟踪
- BSW调度器:负责调度IO硬件抽象层的定时任务
2.3 层次结构
IO硬件抽象层位于ECU抽象层,介于运行时环境(RTE)和微控制器抽象层(MCAL)之间:
- 上层:应用层软件组件,通过RTE访问IO硬件抽象层
- 本层:IO硬件抽象层,包含ECU信号接口、硬件保护和信号处理功能
- 下层:MCAL驱动,直接操作硬件寄存器和外设
根据AUTOSAR规范[SWS_IoHwAb_00001],IO硬件抽象层基于软件组件模板规范实现,可以是一个或多个EcuAbstractionComponentType
的实例。
/* IO硬件抽象层与MCAL驱动的交互示例 */
/* IO硬件抽象层调用ADC驱动读取输入值 */
Std_ReturnType IoHwAb_ReadAnalogInput(IoHwAb_SignalType signal, IoHwAb_AnalogValueType* value)
{Std_ReturnType result;Adc_ValueGroupType adcValue;/* 参数检查 */if (value == NULL) {return E_NOT_OK;}/* 调用ADC驱动获取模拟量 */result = Adc_ReadGroup(signal.groupId, &adcValue);if (result != E_OK) {return result;}/* 转换为应用层所需的格式 */*value = ConvertAdcToPhysical(adcValue, signal.conversionParams);return E_OK;
}
3. 数据结构与类定义
3.1 核心数据结构
下图展示了IO硬件抽象层的主要数据结构和API接口:
核心配置类型:
IO硬件抽象层主要数据结构包括:
IoHwAb_ConfigType
:IO硬件抽象层的总体配置结构IoHwAb<Init_Id>_ConfigType
:特定初始化配置数据结构- ECU信号:表示电气信号的软件表示,具有符号名称、信号类别、属性等
- ECU信号类别:如模拟量输入、离散输出、PWM输入等
API分类:
- 初始化函数:如
IoHwAb_Init<Init_Id>()
、IoHwAb_GetVersionInfo()
- 通知回调:如
IoHwAb_AdcNotification<#groupID>()
等 - 调度函数:由BSW调度器调度的定时任务
- 功能诊断接口:如
IoHwAb_Dcm_<EcuSignalName>()
等 - 电源状态函数:如
IoHwAb_PreparePowerState<#MODE>()
等
3.2 ECU信号概念
根据规范[SWS_IoHwAb_00063],ECU信号表示至少一个输入或输出ECU引脚的软件表示。ECU信号是IO硬件抽象层的核心概念,所有信号处理和访问都围绕ECU信号进行。
ECU信号的属性:
- 滤波/去抖动属性:[SWS_IoHwAb_00019]规定所有ECU信号都应具有滤波/去抖动属性,用于处理输入信号
- 年龄属性:[SWS_IoHwAb_00021]规定所有ECU信号都应具有年龄属性,用于限制信号的生命周期
/* ECU信号数据结构示例 */
typedef struct {uint16 signalId; /* ECU信号标识符 */IoHwAb_SignalClassType class; /* 信号类别(模拟量输入、离散输出等) */uint16 filterAttribute; /* 滤波/去抖动属性 */uint16 ageAttribute; /* 信号年龄属性(生命周期) */IoHwAb_ErrorStatusType status; /* 硬件错误状态 */
} IoHwAb_SignalType;/* ECU信号类别枚举 */
typedef enum {IOHWAB_ANALOG_INPUT, /* 模拟量输入 */IOHWAB_ANALOG_OUTPUT, /* 模拟量输出 */IOHWAB_DISCRETE_INPUT, /* 离散输入 */IOHWAB_DISCRETE_OUTPUT, /* 离散输出 */IOHWAB_PWM_INPUT, /* PWM输入 */IOHWAB_PWM_OUTPUT, /* PWM输出 */IOHWAB_OTHER /* 其他类型 */
} IoHwAb_SignalClassType;
3.3 配置参数
IO硬件抽象层的配置遵循AUTOSAR的标准配置机制,主要配置参数包括:
- 初始化配置:定义IO硬件抽象层的初始化参数
- ECU信号配置:定义ECU信号的属性和映射关系
- 通知回调配置:定义事件通知的处理方式
以下是配置示例:
/* IO硬件抽象层配置示例 */
const IoHwAb_SignalConfigType IoHwAb_SignalConfig[] = {{.signalId = IOHWAB_SIGNAL_ANALOG_1,.class = IOHWAB_ANALOG_INPUT,.mcalChannelId = ADC_CHANNEL_TEMP_SENSOR,.filterAttribute = 10, /* 滤波时间常数10ms */.ageAttribute = 100, /* 生命周期100ms */.minValue = 0, /* 最小值 */.maxValue = 5000 /* 最大值 (5V) */},{.signalId = IOHWAB_SIGNAL_DISCRETE_1,.class = IOHWAB_DISCRETE_OUTPUT,.mcalChannelId = DIO_CHANNEL_LED1,.filterAttribute = 0, /* 无滤波 */.ageAttribute = 0 /* 立即写入 */}
};const IoHwAb_ConfigType IoHwAb_Config = {.signalCount = 2,.signals = IoHwAb_SignalConfig,/* 其他配置参数... */
};
4. 工作流程与交互
4.1 ECU信号处理流程
以下序列图展示了IO硬件抽象层在处理ECU信号时的交互过程:
4.2 初始化流程
参与者:
- 应用软件组件(SWC):使用ECU信号的应用层组件
- 运行时环境(RTE):在应用层和基础软件之间传递消息
- IO硬件抽象层:提供ECU信号抽象和处理功能
- MCAL驱动:直接与硬件交互的驱动程序
初始化流程:
- 系统启动时,通过RTE调用IO硬件抽象层的初始化函数
IoHwAb_Init<Init_Id>()
- IO硬件抽象层初始化内部数据结构,并调用MCAL驱动的初始化函数
- 初始化完成后,系统准备就绪,可以处理ECU信号
/* IO硬件抽象层初始化函数示例 */
void IoHwAb_Init(const IoHwAb_ConfigType* ConfigPtr)
{/* 参数检查 */if (ConfigPtr == NULL) {Det_ReportError(IOHWAB_MODULE_ID, IOHWAB_INSTANCE_ID,IOHWAB_INIT_API_ID, IOHWAB_E_PARAM_POINTER);return;}/* 保存配置指针 */IoHwAb_ConfigPtr = ConfigPtr;/* 初始化内部状态 */IoHwAb_State = IOHWAB_STATE_INITIALIZED;/* 初始化相关MCAL驱动 */Adc_Init(&Adc_Config);Dio_Init(&Dio_Config);Pwm_Init(&Pwm_Config);/* 其他初始化操作... */
}
4.3 IO信号处理
IO硬件抽象层处理两类主要的ECU信号:输入信号和输出信号。
读取ECU输入信号流程:
- 应用软件组件通过RTE请求读取ECU信号
- IO硬件抽象层根据信号的年龄属性决定是否使用缓存值:
- 如果信号生命周期有效,返回缓存的信号值
- 否则,调用MCAL驱动API读取实时物理值
- 对于实时读取的信号,IO硬件抽象层会应用滤波/去抖动处理,将物理值转换为软件组件期望的格式,并更新缓存和时间戳
设置ECU输出信号流程:
- 应用软件组件通过RTE设置ECU信号值
- IO硬件抽象层根据信号的年龄属性决定是否延迟输出:
- 如果信号可延迟输出,缓存信号值并标记为待更新
- 否则,立即将值转换为物理层格式并调用MCAL驱动API设置物理值
异步通知处理:
- MCAL驱动发生事件(如AD转换完成)时,调用IO硬件抽象层提供的通知回调函数
- IO硬件抽象层处理通知,并通过RTE传递给相关的应用软件组件
/* 读取ECU输入信号示例 */
Std_ReturnType IoHwAb_ReadAnalogSignal(IoHwAb_SignalIdType SignalId, IoHwAb_ValueType* Value)
{IoHwAb_SignalType* signal;uint32 currentTime;Std_ReturnType result = E_OK;/* 参数检查 */if (Value == NULL) {return E_NOT_OK;}/* 获取信号配置 */signal = &IoHwAb_ConfigPtr->signals[SignalId];currentTime = Os_GetSystemTime();/* 检查信号生命周期是否有效 */if ((signal->lastUpdateTime != 0) && (currentTime - signal->lastUpdateTime < signal->ageAttribute)) {/* 使用缓存值 */*Value = signal->cachedValue;} else {/* 调用MCAL驱动实时读取 */switch (signal->class) {case IOHWAB_ANALOG_INPUT:result = Adc_ReadChannel(signal->mcalChannelId, &signal->rawValue);/* 应用滤波算法 */ApplyFilter(signal);/* 转换为应用层所需格式 */signal->cachedValue = ConvertToApplicationFormat(signal->rawValue);break;case IOHWAB_DISCRETE_INPUT:signal->rawValue = Dio_ReadChannel(signal->mcalChannelId);/* 应用去抖动 */ApplyDebounce(signal);signal->cachedValue = signal->rawValue;break;default:result = E_NOT_OK;break;}/* 更新时间戳 */if (result == E_OK) {signal->lastUpdateTime = currentTime;*Value = signal->cachedValue;}}return result;
}
5. 电源管理
5.1 低功耗状态转换
IO硬件抽象层支持电源状态管理,可以协调MCAL驱动进入和退出低功耗模式。下图展示了低功耗状态转换的序列:
5.2 电源状态管理
电源状态管理涉及以下主要组件:
- ECU状态管理器:负责协调整个ECU的电源状态变化
- IO硬件抽象层:负责协调MCAL驱动的电源状态变化
- MCAL驱动:如ADC驱动、PWM驱动等,实际执行电源状态变换
进入低功耗模式流程:
- ECU状态管理器调用
IoHwAb_PreparePowerState<MODE>()
,请求准备进入低功耗模式 - IO硬件抽象层通知相关MCAL驱动准备进入低功耗模式
- MCAL驱动完成准备工作后,通过通知回调(如
IoHwAb_Adc_NotifyReadyForPowerState<MODE>()
)通知IO硬件抽象层 - 所有驱动准备就绪后,ECU状态管理器调用
IoHwAb_EnterPowerState<MODE>()
- IO硬件抽象层命令所有相关MCAL驱动进入低功耗状态
退出低功耗模式流程类似,但方向相反,最终恢复到正常工作模式。
/* 准备进入低功耗模式示例 */
Std_ReturnType IoHwAb_PreparePowerState(IoHwAb_PowerModeType Mode)
{Std_ReturnType result = E_OK;/* 记录请求的模式 */IoHwAb_RequestedPowerMode = Mode;/* 准备ADC驱动 */if (Adc_PreparePowerState(Mode) != E_OK) {result = E_NOT_OK;}/* 准备PWM驱动 */if (Pwm_PreparePowerState(Mode) != E_OK) {result = E_NOT_OK;}/* 准备其他驱动... *//* 重置准备状态标志 */IoHwAb_AdcReadyForPowerState = FALSE;IoHwAb_PwmReadyForPowerState = FALSE;return result;
}/* ADC驱动通知已准备好进入低功耗模式 */
void IoHwAb_Adc_NotifyReadyForPowerState(IoHwAb_PowerModeType Mode)
{if (Mode == IoHwAb_RequestedPowerMode) {IoHwAb_AdcReadyForPowerState = TRUE;/* 检查所有驱动是否都准备好 */CheckAllDriversReady();}
}/* 进入低功耗模式 */
Std_ReturnType IoHwAb_EnterPowerState(IoHwAb_PowerModeType Mode)
{Std_ReturnType result = E_OK;/* 设置ADC驱动电源状态 */if (Adc_SetPowerState(Mode) != E_OK) {result = E_NOT_OK;}/* 设置PWM驱动电源状态 */if (Pwm_SetPowerState(Mode) != E_OK) {result = E_NOT_OK;}/* 设置其他驱动电源状态... *//* 更新当前电源模式 */if (result == E_OK) {IoHwAb_CurrentPowerMode = Mode;}return result;
}
6. 错误处理
6.1 错误类型
IO硬件抽象层定义了多种错误类型,包括:
- 开发错误:代码中的不正确实现,通过代码审查和测试消除
- 运行时错误:运行时发生的可恢复错误
- 瞬态故障:暂时性的硬件故障,可能会自行恢复
- 生产错误:存在持久问题,需要维修的错误
- 扩展生产错误:生产错误的延伸,提供更详细的诊断信息
6.2 错误处理策略
根据规范[SWS_IoHwAb_00039],IO硬件抽象层不包含故障恢复策略。故障恢复操作只能由负责的SWC决定。IO硬件抽象层的主要职责是:
- 错误检测:监控硬件状态,检测故障
- 错误通知:通过回调函数将故障状态通知给上层
- 错误报告:通过DET(默认错误跟踪器)报告开发错误
/* 错误处理示例 */
Std_ReturnType IoHwAb_SetDiscrete(IoHwAb_SignalIdType SignalId, boolean Value)
{IoHwAb_SignalType* signal;Std_ReturnType result;/* 检查模块状态 */if (IoHwAb_State != IOHWAB_STATE_INITIALIZED) {Det_ReportError(IOHWAB_MODULE_ID, IOHWAB_INSTANCE_ID,IOHWAB_SET_DISCRETE_API_ID, IOHWAB_E_UNINIT);return E_NOT_OK;}/* 检查信号ID是否有效 */if (SignalId >= IoHwAb_ConfigPtr->signalCount) {Det_ReportError(IOHWAB_MODULE_ID, IOHWAB_INSTANCE_ID,IOHWAB_SET_DISCRETE_API_ID, IOHWAB_E_PARAM_SIGNAL);return E_NOT_OK;}/* 获取信号配置 */signal = &IoHwAb_ConfigPtr->signals[SignalId];/* 检查信号类型 */if (signal->class != IOHWAB_DISCRETE_OUTPUT) {Det_ReportError(IOHWAB_MODULE_ID, IOHWAB_INSTANCE_ID,IOHWAB_SET_DISCRETE_API_ID, IOHWAB_E_PARAM_SIGNAL);return E_NOT_OK;}/* 设置物理输出 */result = Dio_WriteChannel(signal->mcalChannelId, Value);/* 检查输出结果 */if (result != E_OK) {/* 更新故障状态 */signal->status = IOHWAB_FAILURE;/* 通知故障 */if (signal->errorNotification != NULL) {signal->errorNotification(SignalId, IOHWAB_FAILURE);}} else {signal->status = IOHWAB_OK;}return result;
}
7. API接口说明
7.1 初始化API
IO硬件抽象层提供以下初始化相关API:
-
IoHwAb_Init<Init_Id>
:初始化IO硬件抽象层- 参数:
IoHwAb<Init_Id>_ConfigType* ConfigPtr
- 指向配置数据的指针 - 返回值:无
- 描述:初始化整个IO硬件抽象层,配置所有相关的底层驱动
- 参数:
-
IoHwAb_GetVersionInfo
:获取模块版本信息- 参数:
Std_VersionInfoType* VersionInfo
- 版本信息结构体指针 - 返回值:无
- 描述:提供模块的版本信息
- 参数:
7.2 通知回调
IO硬件抽象层定义了以下通知回调函数:
IoHwAb_AdcNotification<#groupID>
:ADC转换完成通知IoHwAb_Pwm_Notification<#channel>
:PWM通知IoHwAb_IcuNotification<#channel>
:ICU事件通知IoHwAb_GptNotification<#channel>
:GPT超时通知IoHwAb_OcuNotification<#channel>
:OCU通知IoHwAb_Pwm_NotifyReadyForPowerState<#MODE>
:PWM电源状态就绪通知IoHwAb_Adc_NotifyReadyForPowerState<#MODE>
:ADC电源状态就绪通知
7.3 调度函数
IO硬件抽象层可能包含由BSW调度器调度的定时任务,用于执行周期性操作,如:
- 更新延迟输出的ECU信号
- 检查硬件故障状态
- 执行自诊断功能
7.4 电源状态函数
IO硬件抽象层提供以下电源状态管理API:
-
IoHwAb_PreparePowerState<#MODE>
:准备进入指定电源模式- 参数:无(模式在函数名中指定)
- 返回值:
Std_ReturnType
- E_OK成功,E_NOT_OK失败 - 描述:准备所有相关MCAL驱动进入指定电源模式
-
IoHwAb_EnterPowerState<#MODE>
:进入指定电源模式- 参数:无(模式在函数名中指定)
- 返回值:
Std_ReturnType
- E_OK成功,E_NOT_OK失败 - 描述:命令所有相关MCAL驱动进入指定电源模式
8. 总结与最佳实践
IO硬件抽象层是AUTOSAR架构中连接软件组件和硬件驱动的重要桥梁,它提供了以下关键价值:
- 抽象硬件细节:应用软件组件无需关心底层硬件的具体实现
- 标准化信号处理:提供统一的ECU信号概念和处理机制
- 提升信号质量:通过滤波和去抖动等功能提高信号质量
- 硬件保护:防止硬件因异常情况受损
- 电源管理:支持低功耗模式,延长系统运行时间
实施IO硬件抽象层的最佳实践:
- 严格遵循ECU信号概念,确保信号属性配置合理
- 为每个ECU信号指定适当的年龄属性和滤波属性
- 实现完善的错误检测和报告机制
- 确保IO硬件抽象层能够正确协调MCAL驱动的电源状态变化
- 详细记录每个ECU信号的映射关系,便于维护和故障诊断
IO硬件抽象层的正确实现是构建可靠、高效的AUTOSAR系统的重要基础,能够显著提高软件的可移植性、可维护性和硬件独立性。