接口/总线/驱动
AUTOSAR的三类接口
AUTOSAR中有三种类型的接口,分别是:AUTOSAR接口,标准化AUTOSAR接口和标准化接口。
上面的描述可能有些晦涩难懂,下面这张图可以帮助大家更好地理解这三种接口的用法。
由上面的图可以看出,AUTOSAR接口主要用于应用软件组件(SWC)之间以及应用软件组件与基础软件之间(BSW)的通信。标准化AUTOSAR接口主要用于应用软件组件与基础软件的标准化服务之间的通信。而标准化接口则主要用于不同基础软件模块之间的通信(OS、通信模块可以通过标准化接口与SWC通信)。
AUTOSAR接口的通用规则
从之前的文章我们了解到AUTOSAR定义了不同的软件层级,不同的层级又包含很多软件模块。那么在不同的软件层级以及软件模块之间,如何使用AUTOSAR的三种接口呢,接口使用上有哪些限制呢?让我们通过一张图来了解一下。
这张图乍一看可能会有点一头雾水,我们来看一下这些箭头代表什么意思。
AUTOSAR各层软件之间的交互
下面我们通过一个例子来详细看一下AUTOSAR各个软件层之间是如何交互的,看完这个例子你将会了解:
这个例子将说明NVM manager和WatchDog manager如何在假定的硬件配置下与SPI驱动程序交互。
ECU硬件包含一个外部的EEPROM和一个外部的看门狗,它们通过SPI与MCU连接。
SPIHandlerDriver控制EEPROM及WatchDog对SPI硬件的并发访问,并且使WatchDog对SPI硬件访问的优先级高于EEPROM。
MCU内部包含一个Flash,它和外部EEPROM并行使用。EEPROM抽象层和Flash EEPROM Emulation拥有语义上相同的API。
Memory Abstraction Interface可以通过以下几种方式实现:
NVM manager通过抽象层来访问Hardware Driver,根据设备索引来区分不同的存储设备。
Memory Abstraction Interface的接口可能像下面这样:
包含设备索引、Block序号和数据缓存指针。
Std_ReturnType MemIf_Write
(
uint8 DeviceIndex,
uint16 BlockNumber,
uint8 *DataBufferPtr
)
而EEPROM抽象层和Flash EEPROM Emulation的接口可能像下面这样:
包含Block序号和数据缓存指针,由于到这一层已经索引到具体的设备了,因此不再需要设备索引了。
Std_ReturnType Ea_Write
(
uint16 BlockNumber,
uint8 *DataBufferPtr
)
NVM设备使用场景
场景一:只使用一种NVM设备类型
这是通常的用法,使用EEPROM或者Flash中的一种NVM设备。这种情况下,Memory Abstraction可以用简单的宏定义实现,该定义忽略设备索引参数。下面的例子展示了写NVM的函数定义:
File MemIf.h:
#include "Ea.h" /* for providing access to the EEPROM Abstraction */
...
#define MemIf_Write(DeviceIndex, BlockNumber, DataBufferPtr) \\
Ea_Write(BlockNumber, DataBufferPtr)
File MemIf.c: 不存在
此种情况没有运行时的额外代码,NVM manager直接访问EEPROM Abstraction 或 Flash emulation。
场景二: 使用两种或以上NVM设备类型
此时必须使用设备索引参数来选择正确的NVM设备。通过使用函数指针数组,同样可以高效地实现。下面的例子展示了写NVM的函数定义:
File MemIf.h:
extern const WriteFctPtrType WriteFctPtr[2];
#define MemIf_Write(DeviceIndex, BlockNumber, DataBufferPtr) \\
WriteFctPtr[DeviceIndex](BlockNumber, DataBufferPtr)
File MemIf.c:
#include “Ea.h“ /* for getting the API function addresses */
#include “Fee.h“ /* for getting the API function addresses */
#include “MemIf.h“ /* for getting the WriteFctPtrType */
const WriteFctPtrType WriteFctPtr[2] = {Ea_Write, Fee_Write};
由上面的例子可以看出:
全部0条评论
快来发表一下你的评论吧 !