数据类型的定义是AUTOSAR设计中非常重要的一部分,在Signal-Based的架构中,数据往往是一些简单的类型,如布尔、枚举、有/无符号整型。随着以太网在车载上的应用,面向服务架构的兴起,在功能定义和网络设计中,我们也面临越来越多的复杂数据类型的定义,如结构体、多维数组、变长数组、变长字符串、Union等等。这些类型的数据库文件(ARXML)开发及建模是一系列复杂繁琐的步骤,受一系列规则的约束限制,对我们而言无疑是一个新的挑战。
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为例):
–存在属性arraySizeSemantics,并将其设置为variableSize–没有定义arraySizeHandling属性
–baseTypeEncoding存在并设置为NONE–baseTypeSize存在并且设置为8(一个字节整型类型)
第二次浪潮,被称为“New-World”,此次浪潮是由应用程序软件本身推动的,应用程序本身负责在运行时维护变长数组实际长度,而该长度无法由任何上下层软件模块或者上层协议来确定/计算得出。
“新世界”的变长数组IDT的定义需满足:
注:变长数组的sizeIndicator包含实际运行中变长数组有效元素的数量,由发送方的上层应用软件主动更新,这是唯一知道数组中有多少个有效元素的软件模块实例。该信息将帮助RTE有效地对变长数组进行处理。
与“旧世界”情况不同,变长数组的数组元素类型不再限制为一个字节的无符号整型,可以是任意类型的数据。而更重要的是,变长数组可以支持多种可能的数组结构形式,体现在DynamicArraySizeProfile属性中。
如开头所述,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代码中预定义的平台或标准类型中的名称保持一致。
以上,变长数组的设计就完成了,对这一块感兴趣的同学,一定记得在文章下方留言哦,我们将会继续补充其他复杂数据类型的设计和建模讲解,请大家持续关注怿星科技~