书接上回,上期专题内容中小怿介绍了Classic AUTOSAR之存储模块,相信大家对存储以及NvM已经有了初步的认识了解。接下来我们将继续介绍Classic AUTOSAR专题之I/O模块,同时感兴趣的小伙伴还请持续关注后续内容~
01 AUTOSAR I/O功能概述
I/O(Input/OutPut)就是所说的输入输出功能,在Classic AUTOSAR平台架构中,与输入输出功能紧密配合的基础软件模块主要有:输入输出硬件抽象模块(I/O HW Abstraction)、输入输出驱动模块(I/O Drivers)、通信驱动模块(Communication Drivers),分别位于ECU抽象层(ECU Abstraction Layer)和硬件抽象层(MCAL,MicroController Abstraction Layer)。
实际上不管是传统燃油车或是现在智能化程度更高的新能源车,都不可避免地要读取车辆传感器采集的电压、电流信号。又因为应用软件无法直接读取并处理这些电信号,所以电信号需要经过提取转换后抽象成应用软件能理解的数字信号,再由应用层SWC(Software Component)调用使用。那么如何精准地分工协作完成电信号的转换和抽象,这就是I/O这些模块需要解决的事情。
I/O功能涉及的Model
为了方便理解输入输出功能对信号转换和传递过程,举例简单说明传感器采集的信号是如何提供给上层SWC使用。
如下图,压力传感器通过压敏电阻将压力转换成电压信号(电信号)传递给ADC(数模转换器),I/O Drivers模块中的ADC Driver驱动ADC Hardware将电压信号再一步转换成数字信号传递给IoHwAb(I/O Hardware Abstraction)模块,IoHwAb将接收到的数字信号(数值)进行过滤、去抖后抽象成ECU Signal(电压值),应用层SWC再经RTE(RunTime Environment)调取ECU Signal,SWC根据电压和压力的转换关系,将电压信号再计算出传感器采集到的压力值。
输入输出功能示意图
所以ADC在将压力信号转换成数字信号前,实际上都是硬件电路中的电信号,经过转换后的数值才能作为软件的变量进行调用计算。
读到这里,大家也能想到,其实输入输出相比其他功能,例如通信来说,涉及的模块相对较少。IoHwAb作为ECU抽象层的模块之一,可以直接通过RTE由SWC调用,也可调用下层MCAL层各类Drivers的标准API驱动硬件电路,从而实现软硬件的解耦。因此IoHwAb作为输入输出功能的核心模块之一,接下来我们一起进入IoHwAb内部再进行探究。
02 IoHwAb功能简介
IoHwAb作为BSW(Basic Software)的ECU抽象层模块之一,又是一组更小的模块的组合,其内部又包含了多个模块。IoHwAb在BSW中的任务或目的就是:向下层MCAL提供访问接口,并将抽象出的信号提供给上层软件调用。
AUTOSAR 软件分层架构图
2.1 IoHwAb模块组成
IoHwAb内部包含的软件模块一般是针对ECU特定设计的,不同ECU其IoHwAb包含的软件模块也并非相同,但一般情况下都会包含以下几个模块。
- I/O Signal Interface
输入输出信号接口模块,可以对数据进行处理,如进行信号抽象、过滤、去抖动等,可以直接通过RTE由应用层SWC调用,也能直接调用MCAL drivers,如果是外部设备,也可以调用外部芯片驱动模块(Driver for ext. ASIC)。
- Driver for ext. ADC ASIC
外置ADC驱动,用于驱动外部芯片,可以调用MCAL模块,RTE不能直接调用该模块,需要通过I/O Signal Interface。
- Driver for ext. I/O ASIC
外置I/O驱动,类似Driver for ext. ADC ASIC。
IoHwAb构成
2.2 IoHwAb与MCAL、应用层接口
IoHwAb位于MCAL drivers上层,IoHwAb可以直接调用Drivers的标准API接口来管理驱动硬件设备,这也意味着IoHwAb也要为上层软件组件提供所有访问MCAL drivers的接口。
IoHwAb与其他模块接口
IoHwAb可调用接收MCAL drivers的接口汇总表如下所示,可以看到IoHwAb能调用所有I/O Driver的接口。(不能接收DIO driver和PORT driver的通知信息。)
——“X”表示存在调用关系
从上图中,可以注意到,IoHwAb与上层SWC交互的接口均是AUTOSAR接口而并非标准AUTOSAR接口,这是因为各种各样的信号类型难以甚至无法做到标准化,所以IoHwAb模块实际上与复杂驱动类似,需要定制化开发。实际中AUTOSAR的目的也不是为了IoHwAb模块能够实现标准化,而是为整个系统能实现输入输出功能提供了指导性参考。
2.3 ECU Signals及其属性介绍
上节说到IoHwAb向上层暴露的是AUTOSAR接口,这就需要IoHwAb将下层收到的各种各样的电信号再次统一封装成ECU Signals,因此一个ECU signal也就代表着一个电信号。
ECU Signals
为了描述电信号的更多特征,ECU Signal就需要定义一些除电信号数值以外的其他属性信息,例如过滤消抖(Filtering/Debouncing)、时效(Age)。
- Filtering/Debouncing
所有ECU Signal都应该有Filtering/Debouncing属性,以便上层SWC获取真实的数值。该属性实际只对输入的信号有影响。
- Age
Age属性用来描述ECU Signal的时效性,不管是IoHwAb向下层输出的信号还是从下层获取的信号,都应该有单独对应的Age属性。Age定义了一个最大有效时间,在时效时间内IoHwAb向上或向下层传递的信号都是有效的。特别的,如果Age设置为0,IoHwAb就要立即进行传输。
2.4 IoHwAb调度介绍
上文说到,IoHwAb可以将电信号封装成应用层SWC期望的ECU Signal供上层调用,那IoHwAb作为一个Basic Software,接下来我们从软件的角度看看IoHwAb如何具体实现输入输出的。
下图是应用层Sensor / Actuator Component请求获取新的“af_pressure”信号时序图。可以看到为了完成读取功能,各模块经历了以下步骤:
① EcuM调用Adc_Init()和IoHwAb_Init()分别完成ADC模块和IoHwAb模块的初始化。
② 应用层调用IoHwAb模块IoHwAb_GetVoltage()方法获取af_pressure信号。
③ IoHwAb接着调用ADC模块Adc_StartGroupConversion()开始进行信号转换。
④ ADC转换完成后会通知IoHwAb和应用层,接着应用层可同步调用IoHwAb_ReadVoltage()读取af_pressure值。
获取ADC转换信号时序图
接下来再从IoHwAb软件内部行为理解这个过程。
首先ECU state manager触发BswModuleEntry完成IoHwAb模块的初始化,这里IoHwAb可以有多个初始化函数,可以根据不同的初始化参数将不同的配置传递给MCAL drivers。虽然IoHwAb可以同时使用Runnable Scheduling和BSW Scheduling,但初始化过程只能由ECU State Manager决定,不是由应用层SWC初始化。
RTE通过IoHwAb的P-Port(Server port)口触发调用Runnable Entry R1(R1),R1会去调用ADC driver接口启动转换,等待转换完成后,ADC driver触发BswModuleEntry R2(R2)读取转换结果并由另一P-Port(Sender/Receiver port)通过RTEevent发送给SWC。
IoHwAb runnables
2.5 IoHwAb的API介绍
前文提到ADC在转换完成后会调用IoHwAb模块的IoHwAb_AdcNotification<#groupID>告知IoHwAb模块转换结果。这就需要IoHwAb预先实现该接口,待ADC driver调用。那其实对于IoHwAb本身来说,并没有要求必须实现的接口,IoHwAb模块要实现的接口完全取决于IoHwAb所需要实现的功能以及上层SWC的需要。
03 总结
以上主要介绍了Classic AUTOSAR中输入输出功能和IoHwAb模块构成、接口、调用等,解释了电信号与ECU Signal之间的相互转化,举例说明了信号的传输过程,相信读者也了解了IoHwAb的主要功能和信号抽象过程。后续还会推出AUTOSAR其他模块的介绍,期待您的关注。