一、架构与术语解释
这里主要是说I/O的功能,而其中会用到一些模块,下面途中我将用到的模块都高亮显示了,并且放大到了右边的途中展示其中的子模块(该子模块就是BSW中最小的单位了,如其中的ADC子模块)。这里要强调的一点是:I/O并非是我们经常说的GPIO,这里的I/O包括了DIO(数字输入输出,就等同于单片机上的GPIO)、ADC和PWM
下面我将详细解释上图子模块的功能:
- I/O Signal Interface: 对输入数据的初步处理,比如输入消抖
- Driver for ext. ADC ASIC:外置ADC的驱动,比如当有外部ADC采样芯片的时候,通过SPI通信,将数据传入主芯片。这里就需要有对外部ADC处理的驱动模块
- Driver for ext. I/O ASIC: 同上,只不过这里是I/O
- SPI Handler:SPI处理驱动,将硬件中的SPI封装成API供上层调用(有的使用的是I2C,这里就不单独列出来了,大家把图中的SPI改成I2C就行了)
- ADC PWM DIO:MCAL中的驱动,将硬件中的ADC、PWM、DIO分别封装成API供上层调用
- SPI ADC PWM DIO(Hardware): 就是指芯片中的这些功能模块
值得一提的是,I/OHwAb是需要手写代码的(当然也可以Matlab生成,这里的手写是指非AutoSAR的代码,需要我们自己添加),在DaVinci中可以申请一个SWC声明为IOHwAb,来作为一个c文件,在其中添加代码(说白了就是当成SWC使用)。
二、举个例子
比如:汽车车内温度传感器传入温度数据并被ECU处理的流程
上图中:
- Adc_ReadGroup是MCAL对上层开放的API函数,Read到的是ADC采样值(比如12位精度最大就是4095)
- Get_SensorValue是一个服务函数,是写在了IoHwAb中的,Sensor
SWC和IoHwAb是通过C/S相连的,Sensor
SWC就可以通过 Rte_Call_Get_<port>_SensorValue 来调用整个函数。这个函数的主要作用就是通过ADC采样值计算出实际的传感器阻值(多少欧姆)
- Send_Temperature就是将Sensor SWC中的树传递给App SWC,在Sensor
SWC中可以将欧姆值计算成实际的温度值。这样一来,最终App
SWC拿到的就是实际的温度值