说说AUTOSAR数据类型的那些事儿

数据类型的定义是AUTOSAR设计中非常重要的一部分,在Signal-Based的架构中,数据往往是一些简单的类型,如布尔、枚举、有/无符号整型。随着以太网在车载上的应用,面向服务架构的兴起,在功能定义和网络设计中,我们也面临越来越多的复杂数据类型的定义,如结构体、多维数组、变长数组、变长字符串、Union等等。这些类型的数据库文件(ARXML)开发及建模是一系列复杂繁琐的步骤,受一系列规则的约束限制,对我们而言无疑是一个新的挑战。

 

AUTOSAR数据类型回顾

 

AUTOSAR按照不同的抽象级别,定义了对数据进行描述的三个不同的层次,分别如下:

应用数据类型(ADT):从应用逻辑的角度描述数据,体现该数据在现实中的物理语义、物理取值范围、物理单位等。在ADT中通常会关联一个计算公式(Computation Method),描述数据从物理(值)范围到内部数字(位)级别的转换关系。一般地,在功能定义的过程中,我们会使用ADT的方式对数据进行描述,此时,各应用之间的通信还处于VFB(Virtual Function Bus)的阶段。

实现数据类型(IDT):从代码实现的角度描述数据,尽管IDT仍是一层抽象概念,但可近似认为IDT为从实际代码实现(如C语言)的角度,对数据类型的定义。

基本类型:从Bit或Byte的角度描述底层平台(Platform)支持的原生类型,这些原生类型最终构建了IDT的实现。

完整的AUTOSAR数据类型定义包含ADT、IDT和Base Type,且ADT和IDT之间需要定义映射关系,IDT和Base Type之间需要定义关联关系。ADT和IDT各有关注点和使用场合,实际应用过程中,当我们对物理语义不是很关心的时候,可以只定义IDT而不定义ADT。

在一个实际AUTOSAR系统设计中,数据类型的定义和建模必须参照上述基本设定,对于复杂数据类型的定义和建模,还是存在很多“坑”需要避开的。由于篇幅受限,今天小编将以复杂的数据类型之一——变长数组为例为大家带来一些参考。(PS:各位看官如果对这一块内容感兴趣的话,请在下方留言,后续我们还会陆续补充其他复杂数据类型的设计和建模讲解。)

 

变长数组

 

AUTOSAR中变长数组数据类型的支持是在两次浪潮中引入的,每一次浪潮都有不同的动机。

第一次浪潮,俗称“Old-World”,变长数组仅仅支持数组元素的类型为一个字节无符号整型的数组,这次的引入主要用来满足诊断的通信要求以及对J1939通信协议的支持。这两种应用场景,无论哪一种情况,都可以根据上一级协议确定变长数组的实际长度,比如通过CANTP或通过J1939 TP(长度字段)来确定。

“旧世界”变长数组定义的特点是(以IDT为例):

  • 数据类型的类别(CATAGORY)定义为ARRAY
  • ImplementationDataType没有定义dynamicArraySizeProfile属性
  • ImplementationDataType包含一个subElement,该subElement:

–存在属性arraySizeSemantics,并将其设置为variableSize–没有定义arraySizeHandling属性

  • ImplementationDataType.swDataDefProps.baseType存在并且满足

–baseTypeEncoding存在并设置为NONE–baseTypeSize存在并且设置为8(一个字节整型类型)

第二次浪潮,被称为“New-World”,此次浪潮是由应用程序软件本身推动的,应用程序本身负责在运行时维护变长数组实际长度,而该长度无法由任何上下层软件模块或者上层协议来确定/计算得出。

“新世界”的变长数组IDT的定义需满足:

  • 数据类型的类别(CATAGORY)定义为STRUCTURE
  • ImplementationDataType需要定义DynamicArraySizeProfile属性,用于表示数组的结构形式(见下文解析)
  • ImplementationDataType中定义两个subElement,一个为sizeIndicator,另一个为变长数组本身,变长数组本身需要定义其ArraySizeHandling属性。

注:变长数组的sizeIndicator包含实际运行中变长数组有效元素的数量,由发送方的上层应用软件主动更新,这是唯一知道数组中有多少个有效元素的软件模块实例。该信息将帮助RTE有效地对变长数组进行处理。

与“旧世界”情况不同,变长数组的数组元素类型不再限制为一个字节的无符号整型,可以是任意类型的数据。而更重要的是,变长数组可以支持多种可能的数组结构形式,体现在DynamicArraySizeProfile属性中。

  • 线形(图a):变长数组元素的数据类型不包含变长数组,其对应的DynamicArraySizeProfile的值设置为VSA_LINEAR。
  • 正方形(图b):变长数组元素的数据类型包含变长数组,且“第二维”数组中的每个变长元素的长度相同,并等于“第一维”数组中的元素最大个数。此时,DynamicArraySizeProfile的值设置为VSA_SQUARE。
  • 矩形(图c):变长数组元素的数据类型包含变长数组,且“第二维”数组中的每个变长元素的长度相同,但不等于 “第一维”数组中的元素最大个数。这种情况对应的DynamicArraySizeProfile的值设置为VSA_RECTANGULAR。
  • 完全灵活形(图d):变长数组元素的数据类型包含变长数组,其中“第二维”数组中每个变长元素的长度不一定彼此相同,显然,也不一定等于“第一维”数组中的元素最大个数。此时,对应的DynamicArraySizeProfile的值设置为VSA_FULLY_FLEXIBLE。

 

变长数组建模

 

如开头所述,AUTOSAR数据类型的建模包含复杂繁琐的步骤,受一系列规则的约束限制。以PREEvision工具中变长数组的设计为例,拆解为3个主要步骤如下。

1、Application数据类型定义

创建一个变长数组(Application Array Type),根据上文中的说明,定义其DynamicArraySizeProfile,本示例设置为VSA_LINEAR。

LengthType:Variable变长;Fixed定长

ArraySizeHandling:数组中每个元素大小一致,配为All indices same array size对应VSA_LINEAR,VSA_SQUARE,VSA_ RECTANGULAR;若数组中每个元素大小不一致,对应完全灵活形VSA_FULLY_FLEXIBLE,则配成All indices different array size。

Length:(第一维)最大数组元素个数

Array Element Type:关联数组元素的数据类型,本例中为uint8_ADT。

2、Implementation数据类型定义

创建变长数组IDT Structure,并定义两个结构体元素,分表代表sizeIndicator和数组本身(uint8ArrayDynamic),Structure的DynamicArraySizeProfile属性同样设置为VSA_LINEAR。

分别创建一个整型(如uint16)和变长数组(本例中uint8ArrayDynamic)并关联到Structure元素中。uint8ArrayDynamic中关联数组元素的数据类型,本例中为uint8_IDT,以及ArraySizeHandling,DynamicArraySizeProfile等属性(同上)。

 

最后,将ADT和IDT映射(Mapping)起来,需要注意的是,数组中元素的ADT和IDT之间也同样需要映射。

3、BaseType

最终,所有复杂的数据类型都拆解到简单数据类型上,并关联平台的原生类型。

Base Type中,Native Declaration用于生成C语言中的数据类型服务,即typedef,如果不定义Native Declaration,则要求相应的IDT的shortName(uint8)和AUTOSAR代码中预定义的平台或标准类型中的名称保持一致。

以上,变长数组的设计就完成了,对这一块感兴趣的同学,一定记得在文章下方留言哦,我们将会继续补充其他复杂数据类型的设计和建模讲解,请大家持续关注怿星科技~