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

AUTOSAR进阶图解==>AUTOSAR_SWS_IOHardwareAbstraction

AUTOSAR IO硬件抽象层(IOHardwareAbstraction)详解

AUTOSAR Classic Platform IO硬件抽象层规范与实现指南

目录

  1. 概述
    1.1 功能概述
    1.2 设计目标
  2. IO硬件抽象层架构
    2.1 架构概述
    2.2 模块交互关系
    2.3 层次结构
  3. 数据结构与类定义
    3.1 核心数据结构
    3.2 ECU信号概念
    3.3 配置参数
  4. 工作流程与交互
    4.1 ECU信号处理流程
    4.2 初始化流程
    4.3 IO信号处理
  5. 电源管理
    5.1 低功耗状态转换
    5.2 电源状态管理
  6. 错误处理
    6.1 错误类型
    6.2 错误处理策略
  7. API接口说明
    7.1 初始化API
    7.2 通知回调
    7.3 调度函数
    7.4 电源状态函数
  8. 总结与最佳实践

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驱动:直接与硬件交互的驱动程序

初始化流程:

  1. 系统启动时,通过RTE调用IO硬件抽象层的初始化函数IoHwAb_Init<Init_Id>()
  2. IO硬件抽象层初始化内部数据结构,并调用MCAL驱动的初始化函数
  3. 初始化完成后,系统准备就绪,可以处理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输入信号流程:

  1. 应用软件组件通过RTE请求读取ECU信号
  2. IO硬件抽象层根据信号的年龄属性决定是否使用缓存值:
    • 如果信号生命周期有效,返回缓存的信号值
    • 否则,调用MCAL驱动API读取实时物理值
  3. 对于实时读取的信号,IO硬件抽象层会应用滤波/去抖动处理,将物理值转换为软件组件期望的格式,并更新缓存和时间戳

设置ECU输出信号流程:

  1. 应用软件组件通过RTE设置ECU信号值
  2. IO硬件抽象层根据信号的年龄属性决定是否延迟输出:
    • 如果信号可延迟输出,缓存信号值并标记为待更新
    • 否则,立即将值转换为物理层格式并调用MCAL驱动API设置物理值

异步通知处理:

  1. MCAL驱动发生事件(如AD转换完成)时,调用IO硬件抽象层提供的通知回调函数
  2. 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驱动等,实际执行电源状态变换

进入低功耗模式流程:

  1. ECU状态管理器调用IoHwAb_PreparePowerState<MODE>(),请求准备进入低功耗模式
  2. IO硬件抽象层通知相关MCAL驱动准备进入低功耗模式
  3. MCAL驱动完成准备工作后,通过通知回调(如IoHwAb_Adc_NotifyReadyForPowerState<MODE>())通知IO硬件抽象层
  4. 所有驱动准备就绪后,ECU状态管理器调用IoHwAb_EnterPowerState<MODE>()
  5. 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硬件抽象层定义了多种错误类型,包括:

  1. 开发错误:代码中的不正确实现,通过代码审查和测试消除
  2. 运行时错误:运行时发生的可恢复错误
  3. 瞬态故障:暂时性的硬件故障,可能会自行恢复
  4. 生产错误:存在持久问题,需要维修的错误
  5. 扩展生产错误:生产错误的延伸,提供更详细的诊断信息

6.2 错误处理策略

根据规范[SWS_IoHwAb_00039],IO硬件抽象层不包含故障恢复策略。故障恢复操作只能由负责的SWC决定。IO硬件抽象层的主要职责是:

  1. 错误检测:监控硬件状态,检测故障
  2. 错误通知:通过回调函数将故障状态通知给上层
  3. 错误报告:通过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架构中连接软件组件和硬件驱动的重要桥梁,它提供了以下关键价值:

  1. 抽象硬件细节:应用软件组件无需关心底层硬件的具体实现
  2. 标准化信号处理:提供统一的ECU信号概念和处理机制
  3. 提升信号质量:通过滤波和去抖动等功能提高信号质量
  4. 硬件保护:防止硬件因异常情况受损
  5. 电源管理:支持低功耗模式,延长系统运行时间

实施IO硬件抽象层的最佳实践:

  • 严格遵循ECU信号概念,确保信号属性配置合理
  • 为每个ECU信号指定适当的年龄属性和滤波属性
  • 实现完善的错误检测和报告机制
  • 确保IO硬件抽象层能够正确协调MCAL驱动的电源状态变化
  • 详细记录每个ECU信号的映射关系,便于维护和故障诊断

IO硬件抽象层的正确实现是构建可靠、高效的AUTOSAR系统的重要基础,能够显著提高软件的可移植性、可维护性和硬件独立性。

http://www.lryc.cn/news/585720.html

相关文章:

  • [精选]如何解决pip安装报错ModuleNotFoundError: No module named ‘subprocess’问题
  • Matlab裁剪降水数据:1km掩膜制作实战
  • C++STL-list
  • 这个方法的目的是检查一个给定的项目ID(projectId)是否在当前数据库中被使用(搜索全库)
  • 四、神经网络——正则化方法
  • VLM-R1 + GRPO 算法完整复现全过程日志
  • Linux修炼:权限
  • SpringCloud【OpenFeign】
  • 学习日记-spring-day46-7.11
  • 伺服驱动控制CANopen协议
  • 网络编程(基本概念)
  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • TCP详解——流量控制、滑动窗口
  • mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
  • 【JMeter】调试方法
  • 论容器化 | 分析Go和Rust做医疗的后端服务
  • Express实现定时任务
  • 飞算科技正在撬动各行业数字化转型的深层变革
  • ch06 部分题目思路
  • OpenCV实现感知哈希(Perceptual Hash)算法的类cv::img_hash::PHash
  • 深入探究编程拷贝
  • 基于Java Spring Boot开发的旅游景区智能管理系统 计算机毕业设计源码32487
  • 4万亿英伟达,凭什么?
  • 【Linux应用】Ubuntu20.04 aarch64开发板一键安装ROS2(清华源)
  • PandaCoder重大产品更新-引入Jenkinsfile文件支持
  • mysql的LIMIT 用法
  • 【AI大模型】超越RAG的搜索革命!分层框架让AI像专家团队一样深度思考
  • Java教程:JavaWeb ---MySQL高级
  • 隆重介绍 Xget for Chrome:您的终极下载加速器
  • linux kernel struct regmap_config结构详解