目录
一、PREEvision建模中会在哪里遇到Type Emitter?
一、PREEvision建模中会在哪里遇到Type Emitter?
在使用PREEvision进行基于AP平台SOA系统软件架构层建模时需要对Service Interface进行设计描述,其中非常重要的一步就是在定义好Service Interface及其中的参数后,还需要定义Service Interface中参数的数据类型,即需要定义IDT(Implement Data Type)并将其分配给Service Interface中对应的参数,而在定义IDT时,有一个经常被忽略的点。这里我杜撰一个超级简单的服务来引出要讨论的这个问题,如下图所示:
- 服务:VehicleState,服务提供方会广播车辆状态信息或在收到服务消费方的请求后向其告知车辆状态
- 服务参数:VehSpd,简单起见,我们假设该服务指提供车速信息VehSpd,类型为长度为一个2字节的无符号整形
- 服务提供方:VehicleState_SP
- 服务消费方:VehicleState_SC
在为这个服务进行建模时,常规的建模过程是在完成Service Interface(VehicleState)及其内部参数(VehSpd)定义后,定义内部参数的IDT,IDT的全称为Implement Data Type,下图中VehSpd_ref即为VehSpd对应的IDT,IDT可以简单理解为其关联的参数的数据类型。
此处VehSpd_ref的类型是IDT Reference,即其本身又指向一个IDT-uint16_t用以说明VehSpd的数据类型是uint16_t。
在定义VehSpd_ref以及uint16_t时,我们遇到了本文的主角Type Emitter。
二、Type Emitter是什么?
实际开发中可以使用Davinci Developer Adaptive基于PREEvision中创建的ARXML生成应用程序代码,AUTOSAR AP绑定使用的C++语言,即Davinci Developer Adaptive会基于ARXML生成C++代码。PREEvision中定义的服务参数、参数IDT以及IDT的Type Emitter都会存储在ARXML中,服务参数会转化为代码的中的变量接口,而参数的的IDT则决定了其转换成代码变量后的数据类型。
上文中我们谈的服务VehicleState的参数VehSpd转换为C++代码后,其类型即为VehSpd_ref,即转化为的代码为
VehSpd_ref VehSpd;
很明显VehSpd_ref并不是C++中定义的标准数据类型,在使用VehSpd_ref定义 VehSpd类型之前,Davinci Developer Adaptive会使用AUTOSAR中定义的“ARA generator”程序对VehSpd_ref进行定义。
此处VehSpd_ref的IDT是uint16_t,则其转换后的类型定义代码为:
typedef uint16_t VehSpd_ref;
即定义VehSpd_ref为uint16_t的别名。
P.s. 文中代码仅为说明转换原理示意,并不是实际代码。
似乎又说了一段废话。说到了这里似乎还是没有看出我们想要讨论的Type Emitter具体是个什么东东?但请相信这些确实是一些需要铺垫的必要信息。那现在我们来回答本节我们最开始提的问题,Type Emitter是什么?
AUTOSAR中对Type Emitter的定义如下:
我们借此来解释一下Type Emitter是什么?
- Type Emitter是CppImplementationDataType的一个属性,IDT可以理解为CppImplementationDataType的一个实例,故而Type Emitter是IDT的一个属性
- Type Emitter是用来控制IDT如何与对应语言进行绑定的,即Type Emitter决定了如何将其对应IDT转化为C++代码的。
三、总结
- Type Emitter是在PREEvision AP SOA建模中,为Service Interface的参数分配的IDT的属性
- PREEvision中配置的Type Emitter会被导入并存储在ARXML中
- Davinci Developer Adaptive中的“ARA generator”会基于IDT的Type Emitter决定如何对该IDT进行C++代码转化。
下一篇文章我们将介绍一下Type Emitter该如何进行配置,如发现文章有任何错误,欢迎指正,感谢指教!