嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > [Classic AUTOSAR学习] SWC设计与应用(四)-- Data数据篇 (Data Type)

[Classic AUTOSAR学习] SWC设计与应用(四)-- Data数据篇 (Data Type)

如不做特别说明,本文介绍的内容都是基于规范的4.3版本。




什么是DataType

在AUTOSAR的概念当中,对于data type和prototype的定义,根据参考的角度不同,区分了三个不同级别的抽象。

Application Data Level是ApplicationSwComponentType普遍指定的一个data type或原型,在这一层定义从应用角度所有需要用到的数据,用来不同应用之间,或者应用和标定工具之间做数据交换。仅仅借助这一层的数据定义,就能指定整个VFB的数据通信。

Implementation Data Level则更接近于C语言的代码实现,当然,这一层的Data Type仍然是代码的抽象。

Base Type Level用来描述在bit或byte级别的原始元素,由此可以构建出implementation data。

Application Data Level

在这一层级中,包括了数值范围,数据结构,以及物理语义。

一般地,数据语义并不在RTE的考虑范围之内,不过在应用程序和标定系统当中,数据应当有唯一的解释。

Implementation Data Level

在AUTOSAR中,Implementation Data有几种典型用法:

  • 在BSW中用来描述接口和数据

  • ImplementationDataType也可以用来描述仅和数值操作有关库的接口

  • Implementation Data可以用来描述SWC和BSW之间的接口

  • 如果无需考虑实际的物理含义,也可以被用来定义VFB系统的通信

  • 数据描述,作为RTE生成器的输入。当SWC仅定义了Application Level Data时,在RTE生成前,作为ECU extract的一部分,可以创建出对应的Implementation Data Type

Base Type Level

Base Type并不完全决定某一type在编程语言中的具体实现,但它定义了例如bit位数或字节数等限制。

根据使用场景,base type可以定位成平台无关的类型,或者也可以包含平台特定属性(大小端,对齐方式等等)。

Data Mapping

Application Level的数据映射到Implementation还是Base Level,取决于数据通过何种媒介而传输。

例如,一个16位整型范围足以定义某一物理值,当使用CAN总线发送时,大端32位机器上的一个SWC读取,再或者是小端16位处理器上的SWC读取,从它们的角度看起来,是不太一样的。

当不同ECU上的SWC进行通信时,也有可能需要在同一application data type和不同的data implementation之间做转换。这个工作一般由COM模块完成。

COM模块可能需要将一个16位整型做大小端的转换,而16个byte长度的数组,即使大小端不一样,也不需要做转换。当然,如果SWC工作在同一ECU上,它们之间的通信是不需要做字节顺序的转换的。

换一个角度

你也可以从建模的角度来看这几个data type:

ApplicationDataType最终应当被映射到ImplementationDataType上。

ImplementationDataType最终被归结于typedef。

BaseType提供ImplementationDataType的平台相关部分,一般包含C语言定义,以及字节顺序、对齐方式等需要被标定工具使用到的信息。

PlatformDataType定义了所有基于AUTOSAR平台软件会用到的类型,由AUTOSAR提供。

StandardType通过指向到Platform Type的方式被定义出来,由AUTOSAR提供。

数据类型 Data Type

在AUTOSAR中,AutosarDataType是用户定义的数据类型的抽象基类,由AutosarDataType派生出了ApplicationDataType和ImplementationDataType。ApplicationDataType从应用角度定义了一个数据类型,它并不考虑位大小,大小端等具体实现细节。仅用ApplicationDataType就可以在VFB系统当中对应用层进行建模。

Implementation则会描述实现细节,能被重复使用的数据类型,一般会对应到C语言中的typedef关键字。

ApplicationDataType和ImplementationDataType可以通过映射关系对应起来,例如,对于SenderReceiverInterface的一个dataElement,它可以指定为一个ApplicationDataType,而对应的,ApplicationDataType需要关联到一个ImplementationDataType用来生成RTE代码。这个映射关系既可以是1:n或是n:1。不过呢,对于具体的一个Internal Behavior的dataTypeMapping,只能对应一个ImplementationDataType。

category用来为一个特定的AutosarDataType设定一些属性的约束,例如VALUE,STRUCTURE,ARRAY等。

Application Data Type

进一步地,ApplicationDataType被分为ApplicationPrimitiveDataType和ApplicationCompositeDataType,Composite意味着是由多个DataType组成的类型,例如Record(Structure)或者Array。

对于不同类型的数据(BOOLEN, STRUCTURE, VALUE.....),有不同的属性设置,参考表格详情可以参考规范文档,或者在ABuilder工具中选择不同类型进行查看,例如:

整形数组

如果ApplicationPrimitiveDataType没有定义对应的约束条件(取值范围等等),那么会将ApplicationDataType的物理意义作为隐形约束。例如,代表温度的数据类型,最小值不应该小于0K。对于其他的物理值,有可能可以是无穷小到无穷大。为了避免模糊定义,强烈建议为ApplicationPrimitiveDataType定义有意义的取值范围。

ApplicationDataType范围应当在CompuMethod之内,同时也不能超过其映射的ImplementationDataType的范围,ImplementationDataType也不能超过BaseType的范围。

Enumeration枚举值不是由ApplicationCompositeDataType来实现,而是通过CompuMethod来完成:

对于字符串类型,你需要选择STRING,并为它设置字符串长度:

很多时候,我们也需要用到数组或者结构体这样的组合数据,也即ApplicationCompositeDataType。当然, 数组也可以是结构体中的一个成员,或者数组即包含一系列的结构体,或者结构体嵌套结构体,都是可行的。

数组的每个元素都拥有同样的数据类型,同时你还需要设置数组大小(或者设置为可变长度)等等:

如果是结构体,你需要选择Record类型,并加上所有元素:

在一个结构体内,每个元素都有唯一的名字。

Implementation Data Type

ImplementationDataType用来在Implementation Level为数据类型处理作优化支持,它对SWC和RTE的contract phase有直接影响,会对应到C代码实现。

根据不同的类型,这些Implementation Data Type也有不同的设置,具体可参考规范说明。

ImplementationDataType的CompuMethod只能是BITFIELD_TEXTTABLE或者TEXTTABLE。(注:这里没太明白什么意思,软件中创建时并未提示限制)

与ApplicationDataType不同的是,ImplementationDataType可以定义指针,或者定义“别名”——typedef。

如果Type Emitter未设置或设置为"RTE",并且提供了nativeDeclaration,那么RTE会生成对应的类型定义。

如果设置了“RTE”但是没有提供nativeDeclaration,RTE生成时会报错。

如果设置的是"RTE"以外的任何值,无论提供nativeDeclaration与否,RTE生成时都会忽略。

定义指针

定义指针时,既可以是指向某一数值类型的指针,也可以指向函数,或者指向另一个指针。

Base Type

BaseType用来定义基础类型,例如它可以作为RTE生成器的输入,一般作为数据的“叶节点”出现,可以用来生成对应的C代码。

Native Declaration代表的是C代码中拥有的类型定义:

如果在创建BaseType时没有设置Native Declaration, 那么shortName应当和AUTOSAR中已定义的Platform Type或者Stardard Type其中的某一个拥有相同的名字。