SOMEIP Transformer(R21-11)
1. 前言
Getter – 允许读取字段Request/Response调用; Setter – 允许书写字段Request/Response调用; Service Interface – 服务规范包括方法、事件和字段; SWC – 软件组件; RTE – 运行环境;
2. 简介
2.1 目标
Transformer,用于以太网平行结构化数据和线性数据转换的转换器指定了另一种转换器Client/Server和Sender/Receiver机制,其目的是:
- 满足资源消耗的硬性要求;
- 与合作伙伴建立更好的兼容性;
- 从小平台到大平台提供更好的平台可扩展性;
- 平台无关性,可以在不同操作系统上实现,甚至是无操作系统的嵌入式设备;
2.2 限制
AUTOSAR有通用的Transformer标准,与SOME/IP Transformer是基本规范; SOME/IP除了Transformer还包括由[2,SWS Service Discovery ]、由[2,SWS Service Discovery ]目前还没有部分和其他部分AUTOSAR中实现的; 由于AUTOSAR CP导致分层结构AUTOSAR CP 中头字段的处理顺序和[ PRS _ someip _ 00195]中定义的处理顺序 序不同; 2(8* sizeof (data type of length field))大于指示器给出的元素数乘以每个元素的字节大小(即 utf-8 为 1,utf-16 为 2) ,并增加 BOM.c(SRS_-Xfrm_00101)所需字节大小; 根据[ TPS_syst_目前,基于网络表示的反序列化不支持结构化数据类型与标识符和可选成员、字符串、动态长度数组/可变大小数组和联合/变体参数的组合,因此不应用于这些组合;
2.3 适用领域
适用于汽车领域; 当使用 SOME/IP Sender/Receiver 或 Client/Server 通信时,SOME/IP所有域应用程序都可以使用转换器。
2.4 模块间依赖
AUTOSAR RTE [5,SWS RTE ]变压器必须存在才能执行。
2.5 实现要求
- 所有AUTOSAR基础软件模块应支持基于工具的配置;
- 开发错误分类;
- 所有AUTOSAR基本软件模块需要基本的模块文件;
- BSW模块需要支持后期组装的可配性;
- 每个BSW所有模块都必须提供版本信息获取接口;
- 所有AUTOSAR应遵循基本软件模块的命名enabling/disabling API的存在;
- 对类型数据、宏、函数的命名设置规则;
- Transformer应该对RTE处理所给数据;
- Transformer固定接口应提供;
- Transformer应支持错误处理;
- Transformer数据定数据的输出格式;
- Transformer将原子数据和结构化数据转化为线性数组;
- Transformer应定义ECU内Client/Server通信;
- Transformer支持向应用程序报告异常;
- Transformer应支持对Client/Server间通信的错误处理;
- Transformer应支持扩展数据结构和方法的序列化;
3. 文件结构
3.1 代码文件结构
[3,源代码文件结构,ASWS Transformer General ]中定义。
3.2 头文件结构
SomeIpXf[ < Ie >].h:是SOME/IP变压器主要包括文件和文件transformerTypes. h(文件包括一般转换器数据类型)及其模块 Interlink 头文件 SchM_ [ < vi > _ < ai >].H, < ie >是根据[ SWS_-BSW_可选实现特定文件扩展名; < bsnp > 是 BSW 调度程序名称前缀; < vi > 是 BSW 模块; < ai > 是 BSW 模块供应商APIINFIX;
4. 功能规范
- 当一个SWC启动一个ECU通信时,SWC移交数据RTE;
- RTE执行配置的Transformer链;
- Transformer将SWC的数据进行序列化,并将他们转换成线性形式;
- 通过总线通信堆栈将序列化数据传输到接收端;
- 接收端的RTE反序列化数据,恢复原始数据结构;
- 然后将数据移交给上层SWC;
SOME/IP 转换器是 Serializer 类转换器只能用作发送端的第一个变压器和接收端的最后一个变压器(按执行顺序)。 该变压器还提供了指定的变压器错误,只支持异地缓冲区的处理。 SOME/IP特殊配置: SOMEIPTransformationDescription SOMEIPTransformationISignalProps ByteOrderEnum SOMEIPMessageTypeEnum 定义了SOME/IP Transformer应用于以下情况: Transformer协议属性为SOME/IP; Transformer技术属性版1; Transformer在技术属性中Transformer序列化转换器应设置类型;
4.1 ID定义
Service-IDs为16bit无符号整形数据; Service-IDs = 0xFFFE表示非SOME/IP服务; 同一车辆的不同服务Service-IDs是不同的;
应使用服务实例Service-Instance-IDs; Service-Instance-IDs为16bit无符号整形数据; Service-Instance-IDs不能为0x0000和0xFFFF,0x0000为保留,0xFFFF代表所有服务实例; 同一车辆中的不同服务实例Service-Instance-IDs是不同的。例如,两种不同的相机服务应该有两种不同的服务Service-Instance-IDs(SI-ID-1 and SI-ID-2); 为更好的测试和集成,不同AUTOSAR相同的系统ID;
Method-ID识别不同的方法和事件; Method-ID最高位置为0,但如果消息类型为事件和通知,最高位置为1;
4.2 SOME/IP在线格式规范
序列化描述了通过车载网络传输的协议数据单元(PDUs)中数据的表示。
4.2.1 长度限制
TCP可采用最大长度传输SOME/IP数据,但现在CAN、FlexRay协议将消息长度限制在4095Byte,为更好的兼容性,应设置报告不超过4095Byte;
4.2.2 端序
网络字节序应使用大端序模式; 有效负载内的参数字节顺序应该由someiptransformation description.c(SRS _-Xfrm _ 0008)字节顺序定义;
4.2.3 包头
出于互操作性的原因,对于 SOME/IP 头部布局应相同,如下所示; 上图 字段按传输顺序表示,顶部字段先传输,格式示意图如下: SOME/IPTransformer只定义下半部分。 Transformer未将MessageID和Length包含字段,只是为了更好地兼容AUTOSARSocket Adaptor模式; (1)MessageID
- 32bit;
- 在整个车辆系统中是唯一的;
- 构造MessageID -> 服务中包含一组方法、事件、字段和服务ID; -> 一个事件可以属于多个事件组,一个事件组可以包含多个事件; -> 一个字段可以属于多个事件组,一个事件组可以包含多个字段; -> 当inter-ECU Client/Server之间进行通信调用的时候,为Method ID时,2的16次方个服务中分别可以包含2的15次方种方法; -> 当Client/Server之间进行事件和通知时,为Event ID时,2的16次方个服务中分别可以包含32768个事件或通知;
(2)Length
- 32bit;
- 从 Request ID/Client ID 开始,直到 SOME/ip 消息结束;
(3)RequestID
- 32bit;
- 是ECU内调用客户端的唯一标识符,它的值由 RTE 选择并交给SOME/IP Transformer;
- 由Client ID 和Session ID 组成,均由 RTE 选择并交给SOME/IP Transformer;
- [ SWS _ someipxf _ 00025]从 RTE 移交的 RTE _ cs _ transactionhandletype 中的客户端应用于Client id;
- [ SWS _ someipxf _ 00026]从 RTE 移交的 RTE _ cs _ transactionhandletype中的顺序计数器应用于Session id;
- Request ID 允许客户端区分对同一个方法的多个调用,对于单个客户端和服务器组合来说必须是唯一的,当生成响应消息时,服务器必须将请求 ID 复制到响应消息;
- Request IDs可以在响应到达或预计不再到达时重用(超时);
(4)Protocol Version
- 8bit;
- 应该包含SOME/IP协议版本信息;
- 协议版本应设置为 0x01;
(5)Interface Version
- 8bit;
- 段应该包含 Service Interface;
- 相应服务Service Discovery的版本必须匹配服务接口的版本,即 SdServerServiceMajorVersion 和 / 或 SdClientServiceMajorVersion 必须匹配所使用的 SOMEIPTransformationDescription和/或 SOMEIPTransformationISignalProps;
(6)Message Type
- 8bit;
- 用于区分不同类型的消息;
- 规客户端请求(消息类型 0x00)由服务器响应(消息类型 0x80)回应,当没有错误发生时。如果出现错误,将发送一条错误消息(消息类型 0x81);
- 为了通过通知更新值,存在回调接口(消息类型 0x02);
- 发送没有响应消息(消息类型 0x01)的请求,以便使用 SOME/IP 进行 AUTOSAR 发件人/接收人通信;
(7)Return Code
- 8bit;
- Return Code 字段来表示请求是否已成功处理;
- REQUEST 、 REQUEST _ no _ Return 和Notification 的消息必须将 Return 代码设置为 0x00;
- 返回码消息类型REQUEST N/A – set to 0x00 (E_OK),REQUEST_NO_RETURN N/A – set to 0x00 (E_OK),NOTIFICATION N/A – set to 0x00 (E_OK),Response – 如下图所示: (8)Payload
- 可变大小;
4.2.4 参数和数据结构序列化
- [SWS_SomeIpXf_00169] 为了允许迁移,反序列化应该忽略附加到先前已知参数list (SRS _ xfrm _ 00101)末尾的参数。这意味着用于在序列化数据结束时生成或参数化序列化代码的ClientServerInterface 或 SenderReceiverInterface 中未定义的参数将被反序列化忽略;
- [SWS_SomeIpXf_000263 ]在可变数据长度dat-aPrototype的序列化数据之后,如果可变数据长度 DataPrototype 不是序列化数据流中的最后一个元素,则应为配置的对齐添加填充,但不适用于可扩展结构和方法的序列化;
- [SWS_SomeIpXf_00263] 序列化固定长度的数据时,Transformer将不会对数据进行对齐填充;
- [SWS_SomeIpXf_00037] 对齐应该从SOME/IP报文开始,此属性定义了内存对齐,SOME/IP Transformer 并不试图自动对齐参数,而是按照指定的方式对齐。为了简化代码生成器,对齐目前被限制为 1 字节的倍数; SOME/IP 有效负载应该放置在内存中,以便 SOME/IP 有效负载能够适合对齐。对于信息娱乐 ECU,应该实现 8 字节(即 64 位)的对齐,对于所有 ECU,至少应该实现 4字节的对齐。有效的对齐是高度依赖硬件的;
- [SWS_SomeIpXf_00016] 若在反序列化过程中,向SOME/IP Transformer传递的数据超出预期,应丢弃不符合预期的数据;
- [SWS_SomeIpXf_00017] 若在反序列化过程中,向SOME/IP Transformer传递的数据小于预期,若有指定的初始值应将用该值填充到末尾缺少的元素;若没有设置初始值,反序列化将被终止;
4.2.4.1 基础数据
4.2.4.2 结构体
- 结构应按照深度优先遍历的顺序序列化;
- 一个结构包含一个 uint8 和一个 uint32,它们只是顺序写入缓冲区。这意味着 uint8 和 uint32 的第一个字节之间没有填充, 因此,uint32 可能没有对齐。所以系统设计者必须考虑向数据类型中添加填充元素以实现所需的对齐或者全局设置;
- 传统总线如 CAN 和 FlexRay 的消息通常是不对齐的。在这种情况下,警告可以被关闭或忽略;
- 不会自动插入虚拟/填充元素</>; SOME/IP 允许在 structs 前面添加 8、16 或 32 位的长度字段。结构的长度域描述了结构的字节数。这使得可扩展的结构允许更好的接口迁移;
- transformation isignalprops 的值设置为 大于 0 ,则应在每个序列化 struct (SRS _ xfrm _ 00101)前面 插入一个长度字段 ;
- sizeOfStructLengthField 属性设置为 大于 0,则在定义 someiptransformation props 的序列化结构的前面 插入一个长度字段;
- 结构的 长度字段的数据类型<、u> 与结构中所有嵌套 结构数据类型 应 相同 ,如为uint8,sizeOfStructLengthField=1;uint16,sizeOfStructLengthField=2;uint32,sizeOfStructLengthField=4;
- SOME/IP 转换器应将序列化结构的大小(以字节为单位)(不包括长度字段的大小)写入 struct的长度字段中;
4.2.4.3 带有标识符合可选成员的结构体数据类型和参数
-
[SWS_SomeIpXf_00267]标记的长度应为两个字节;
-
这个标签应该包含reserved (Bit 7 of the first byte)、wire type (Bit 6-4 of the first byte)、Data ID(Bit 3-0,第二个字节的Bit 7-0)位7是最高有效位,位0是最低有效位; Data ID 的较低有效部分应以标记的第二个字节的 7-0 位进行编码。成员的 Data ID 的较高有效部分应该编码为第一个字节位 3-0;例如Data ID = 1266,则第一个字节的 3-0 位= 0x4。第二个字节 = 0xf2; ,如下图所示: Wire type 4 确保了与当前静态配置长度字段大小的方法的兼容性,缺点是在接口演化过程中改变长度域的大小总是不兼容的;(不是很理解)
-
[SWS_SomeIpXf_00271] clengthfieldsize 设置为 false 或未定义,变压器应使用 4 型导线对复杂类型进行序列化,并应使用固 定长度字段。长度字段的大小在 someiptransformation isignalprops.sizeofar-raylengthfields , sizeOfStructLengthFields 和 sizeofunionlength-fields中定义;
-
[SWS_SomeIpXf_00272] clengthfield size 设置为 true,变压器应使用 5、6、7 型导线进行复杂类型的序列化,并应根据该导线型号(SRS _ xfrm _ 00106)选择长度场的大小;
-
[SWS_SomeIpXf_00273] 反序列化器应始终能够独立于 someiptransformation isignalprops 的设置处理 4、5、6 和 7 类导线;
-
[SWS_SomeIpXf_00274] 如果通过 SOMEIPTransformation-ISignalProps 为 参 数 dataprototype 或implementation datatypeelement 定义了一个 Data ID。tlvDataId.id,一个标签应该插入到序列化的字节 stream。
-
[SWS_SomeIpXf_00275] ]如果序列化成员/参数的数据类型是基本数据类型(连接类型 0-3) ,并且配置了 Data ID,则标记应该直接插入到成员/参数的前面。不要在序列化的 stream中插入任何字段;
-
[SWS_SomeIpXf_00276] 如果序列化成员/参数的数据类型不是基本的数据类型(连接类型 4-7) ,并且配置了 Data ID,则标记应该插入到 length 字段;
-
[SWS_SomeIpXf_00277] 如果序列化的成员/参数的数据类型不是基本的数据类型,并且配置了 Data ID,则应始终在成员/参数;
-
[SWS_SomeIpXf_00278] length 字段应始终包含结构的下一个标记之前的长度,但不包括标记大小和 length 字段大小本身;
-
[SWS_SomeIpXf_00279] 如果成员本身是 struct ,则应该有一个正好的长度字段;
-
[SWS_SomeIpXf_00280] 如果成员本身是动态长度字符串,则应该只有一个length 字段;
-
[SWS_SomeIpXf_00281] 如果成员本身是固定长度字符串,那么应该恰好有一个长度字段对应于动态长度字符串; 在没有标记的情况下序列化时,固定长度的字符串没有长度字段。对于带有标签的序列化,固定长度字符串也需要一个长度字段,就像动态长度字符串一样;
-
[SWS_SomeIpXf_00282] 如果成员本身是类型为动态长度阵列,那么应该恰好有一个长度字段;
-
[SWS_SomeIpXf_00283] 如果成员本身是固定长度数组,那么应该恰好有一个长度字段;
-
[SWS_SomeIpXf_00284] 如果成员本身是类型联合体,则应该有一个正好的长度字段;
-
[SWS_SomeIpXf_00285] 对于可扩展结构和方法的序列化,如果成员本身的类型为 union,则长度字段应包括类型字段、数据和填充字节的大小; 对于没有标记的序列化,union 的 length 字段不包括 type 字段,对于带标签的序列化,需要使用 length 字段来覆盖序列化联合的完整内容;
-
[SWS_SomeIpXf_00286] 属于可扩展结构类型的非可扩展(标准)结构的 dA 成员应根据可扩展结构的要求进行序列化;
-
[SWS_SomeIpXf_00287] 不可扩展(标准)结构类型的可扩展结构的 dA 成员应根据标准结构的要求进行序列化;
-
[SWS_SomeIpXf_00288] 对于可扩展结构和方法的序列化,不应该使用对齐(当使用较大的 8 位对齐时,序列化程序可以在可变长度数据之后添加填充字节。填充字节不包含在长度字段中。如果接收方不知道成员的 Data ID,那么它也不知道它是可变长度的数据,并且可能存在填充字节);
-
[SWS_SomeIpXf_00289] 如果代表可扩展结构的 implementation data type 的 isStructWithOptionalElement 属性被设置为 true,则变压器应该忽略第一个 implementation 数据类型元素,不应该对它进行 se-rialize 或者反序列化( 第一个 ImplementationDataTypeElement 表示在线路上没有传输的可用位字段);
-
[SWS_SomeIpXf_00290] 如果可用位域中的对应位设置如下,则变压器只能序列化结构的一个可选成员: (availabilityBitfield[(pos/8)] & (1<<(pos mod 8))) != 0 (available bitfield [(pos/8)] & (1 < < (pos mod 8)) ! = 0
-
[SWS_SomeIpXf_00291] 如果序列化字节流中有一个可选成员,转换器应该在可用位字段中设置相应的位: availabilityBitfield[(pos/8)] = availabilityBitfield[(pos/8)] | (1<<(pos mod 8)) 可用位域[(pos/8)] = 可用位域[(pos/8)] | (1 < < (pos mod 8))
-
[SWS_SomeIpXf_00292] 如果序列化字节流中没有可选的成员,转换器应清除可用位字段中的相应位,如下所示: availabilityBitfield[(pos/8)] = availabilityBitfield[(pos/8)] & ~(1<<(pos mod 8)) 可用位域[(pos/8)] = 可用位域[(pos/8)] & ~ (1 < < (pos mod 8))
-
非可选的 ImplementationDataTypeElements 不 计 算 在 内 , 因 为 它 们 在availabilityBitfield 中不需要位。因此可用位 域中的位位置是由可选的ImplementationDataTypeElements 的顺序决定,如下案例: 1st optional ImplementationDataTypeElement (pos=0): (availabilityBitfield[0] & 0x01) != 0 • 8th optional ImplementationDataTypeElement (pos=7): (availabilityBitfield[0] & 0x80) != 0 • 9th optional ImplementationDataTypeElement (pos=8): (availabilityBitfield[1] & 0x01) != 0
-
[SWS_SomeIpXf_00295] 如果接收到的已序列化字节流中没有可选成员,转换器将保持这个可选元素占用的内存部分,而无需修改;
-
[SWS_SomeIpXf_00293] 如果变压器读取一个未知的数据 ID (即不包含在其数据定义中) ,它应该通过使用导线类型和长度字段的信息跳过未知的成员/参数;
-
[SWS_SomeIpXf_00294] 如果转换器无法在序列化的字节流中找到在其数据定义中定义的必需成员(即非可选成员) ,则应使用 e _ ser _ malformed _ message中止反序列化;
-
[SWS_SomeIpXf_00294] 如果转换器无法在序列化的字节流中找到在其数据定义中定义的必需成员(即非可选成员) ,则应使用 e _ ser _ malformed _ message 中止反序列化;
4.2.4.4 字符串
- Strings 应使用 Unicode 编码;
- 对于固定长度和动态长度的字符串。未使用的空间应该用“0”来填充;
- 不同的 Unicode 编码应该被支持,包括 UTF-8,UTF-16BE 和 UTF-16LE。由于这些编码每个字符都有一个动态字节长度,因此最大字节长度最多是 utf-8 中字符长度的三倍,加上 1 个字节用于终止,其中“0”是 utf-16中字符长度的两倍,加上 2 个字节用于“0”。Utf-8 字符可以初度 6 个字节,utf-16 字符可以长达 4 个字节;
- [SWS_SomeIpXf_00055] UTF-16LE 和 UTF-16BE 字符串应该以两个0X00作为结束;
- [SWS_SomeIpXf_00056] UTF-16LE 和 UTF-16BE 字符串应具有偶数长度;
- [SWS_SomeIpXf_00057] 对于长度为奇数的 UTF-16LE 和 UTF-16BE 字符串,接收的 SOME/IP transformer (SRS _-Xfrm _ 00101)将默认删除最后一个字节;
- [SWS_SomeIpXf_00248] 如果 UTF-16LE 和 UTF-16BE 字符串的长度为奇数,在删除最后一个字节后,前面的两个字节应为 0x00 字节(termi-nation) ,则该字符串为valid;
- [SWS_SomeIpXf_00058] dAll 字符串总是以 Byte Order Mark (BOM 用于序列化字符串,以实现与Unicode 的兼容性)开头。BOM 应该包含在固定长度字符串和动态长度字符串中;
- [SWS_SomeIpXf_00239] 只有在检测到Unicode字符串并且implementsLegacyStringSerialization为false(SRS _ xfrm _ 00101)时,才会触发 String 特定的序列化;
- [SWS_SomeIpXf_00059] 接收 SOME/IP 变压器的实现应检查 BOM,并将丢失的 BOM 或格式不正确的BOM 作为错误处理;
- [SWS_SomeIpXf_00060] BOM 应该由 SOME/IP 发送的变压器 implementation添加;
4.2.4.4.1 固定长度字符串
-
字符串的长度(包括字节中的“0”)在数据类型定义中指定;
-
[SWS_SomeIpXf_00240] utf-8 固 定 长 度 字 符 串 的 识 别 如 果 使 用 了ApplicationPrimitiveDataType 和 ImplementationDataType,则应检测到 utf-8 固定长度字符串: • ApplicationPrimitiveDataType – category = STRING – ApplicationPrimitiveDataType.swDataDefProps.swTextProps.baseType refers to a BaseType with baseTypeDefinition.baseType-Encoding = UTF-8 • ImplementationDataType – category = ARRAY – that contains exactly one ImplementationDataTypeElement that boils down to a uint8 ImplementationDataType: ∗ ImplementationDataTypeElement.arraySize is set to a value ∗ ImplementationDataTypeElement.arraySizeSemantics is set to fixedSize
-
[SWS_SomeIpXf_00241] utf-16 固定长度字符串的识别如果使用了ApplicationPrimitiveDataType 和 ImplementationDataType,则应检测到 utf-16固定长度字符串; • ApplicationPrimitiveDataType(应用原始数据类型) – category = STRING – ApplicationPrimitiveDataType.swDataDefProps.swTextProps.baseType是指baseTypeDefinition.baseTypeEncoding的基础类型为UTF-16 • ImplementationDataType(实施数据类型) – category = ARRAY –包含一个 ImplementationDataTypeElement,为一个uint16的ImplementationDataType: ImplementationDataTypeElement.arraySize设置为一个值 ImplementationDataTypeElement.arraySizeSemantics设置为一个固定值
-
[SWS_SomeIpXf_00244] 固定长度字符串的序列化包括以下步骤:
- 检查字符串是否以 0x00(UTF-8)或 0x0000(UTF-16)结束。如果不是,将发出 e _ ser _ generic _ error 错误;
- 如果 BOM 还不可用,则在包含字符串的待序列化数组的前三个(UTF-8)或两个(UTF-16)字节中追加 BOM。如果 BOM 已经存在,只需将BOM 复制到输出缓冲区;
- 将字符串数据(根据字符串的固定长度确定的字节数)从数组复制到输出缓冲区,如果 BaseTypeDirectDefinition,则可以选择在 ECU 和网络字节顺序之间执行UTF-16LE 和 UTF-16BE 之间的转换。字节顺序和 someiptransformation 描述。字节顺序有不同的值;
- [SWS_SomeIpXf_00246] 定长字符串的反序列化定长字符串的反序列化应包括以下步骤:
- 检查字符串是否以 BOM 开头。如果不是,就会发出 MALFORMED _ message 错误;
- 检查 BOM 是否具有与 SOMEIPTransformationDe-scription.byteOrder 相同的值。如果没有,将发出 malform_message 错误;
- 删除 BOM;
- 默认放弃字符串的最后一个字节,以防 utf-16 字符串长度为奇数;
- 检查字符串是否以 0x00(UTF-8)或 0x0000(UTF-16)结束。如果不是,将发出malformed_message 错误;
- 将字符串数据(根据字符串的固定长度计算的字节数)从输入缓冲区复制到数组中,如果 BaseTypeDi-rectDefinition,则可以选择在网络和 ECU 字节顺序之间执行UTF-16LE 和 UTF-16BE 之间的转换。字节顺序和 someiptransformation 描述。字节顺序有不同的值;
4.2.4.4.2 动态长度字符串
- 在 AUTOSAR 系统中,具有动态长度的字符串可以实现为具有动态长度的数组,用于传输单个字符;
- [SWS_SomeIpXf_00242] utf-8可变长度字符串的识别如果使用了ApplicationPrimitiveDataType 和 ImplementationDataType,则应检测到 utf-8 固定长度字符串: • ApplicationPrimitiveDataType(应用程序原始数据类型) – category = STRING – ApplicationPrimitiveDataType.swDataDefProps.swTextProps.baseType是指baseTypeDefinition.baseTypeEncoding的基础类型为UTF-8 • ImplementationDataType(实施数据类型) 实施数据类型应根据[ TPS _ swct _-01650]定义为一个恰好包含两个实施数据类型元素的结构,并应遵循[ constr _ 1318]定义的规则: – 一个 implementationdatatypeelement表示尺寸指示器,类别等于TYPE _ reference,指向uint8,uint16 或 uint32 implementation datatype; – 一个 ImplementationDataTypeElement 为ARRAY类型,并且恰好包含一个ImplementationDataTypeElement,该元素归结为一个 uint8 ImplementationDataType;
- [SWS_SomeIpXf_00243] 对utf-16可变长度字符串的识别如果使用了ApplicationPrimitive-DataType 和 ImplementationDataType,则应检测到 utf-16固定长度字符串: • ApplicationPrimitiveDataType(应用程序原始数据类型) – category = STRING – ApplicationPrimitiveDataType.swDataDefProps.swTextProps.baseType 是指baseTypeDefinition.baseTypeEncoding的基础类型为UTF-16; • ImplementationDataType(实施数据类型) 实施数据类型应根据[ TPS _ swct _-01650]定义为一个恰好包含两个实施数据类型元素的结构,并应遵循[ constr _ 1318]定义的规则: –一个ImplementationDataTypeElement表示尺寸大小,类别等于TYPE _ reference,指向 uint8,uint16 或 uint32 implementation datatype; – 一个 ImplementationDataTypeElement的类型为ARRAY,并且恰好包含一个ImplementationDataTypeElement,该元素归结为一个 uint16 ImplementationDataType;
- [SWS_SomeIpXf_00245] 动态长度字符串的序列化应包括以下步骤:
- 检查字符串是否以 0x00(UTF-8)或 0x0000(UTF-16)结束。如果不是,将发出 e _ ser _ generic _ error 错误;
- 添加长度字段——长度字段的值应通过将大小指示器给出的元素数乘以每个元素的字节大小(即 utf-8 为 1,utf-16 为 2) ,再乘以 BOM 要求的字节大小来计算。长度 字 段 的 数 据 类 型 应 该 由 sizeOfStringLengthFields 决 定 。 如 果 属 性sizeOfStringLength-Fields 没有配置,那么默认值 32 位将按[ PRS_someip_00094]的定义使用。Length 字段的值应该符合[ SWS_someipxf_constr_ 0001];
- 如果包含字符串的待序列化数组的前 3(UTF-8)或 2(UTF-16)字节中的 BOM 尚未可用,则在开始处追加 BOM。如果 BOM 已经存在,只需将 BOM 复制到输出缓冲区;
- 将字符串数据(根据字符串的大小指示器和每个元素的字节大小复制字节数)从数组复制到输出缓冲区,可以选择在 ECU 和网络字节顺序 basetypedirectdefinition 之间执行 UTF-16LE 和 UTF-16BE 之间的转换;
- [SWS_SomeIpXf_00247] 动态长度字符串的反序列化应包括以下步骤:
- 检查字符串是否以 BOM 开头。如果不是,就会发出 MALFORMED _ message 错误;
- 检查 BOM 是否具有与 SOMEIPTransformationDe-scription.byteOrder 相同的值。如果没有,将发出 malform_message 错误;
- 删除 BOM 并相应地减少长度字段的值;
- 默默地丢弃字符串的最后一个字节,以防 utf-16 字符串长度奇数(根据长度字段的减少值);
- 检查字符串是否以 0x00(UTF-8)或 0x0000(UTF-16)结束。如果不是,将发出malformed_message 错误;
- 检查接收到的动态长度字符串的长度是否小于或等于指定的最大字符串长度(ApplicationPrimitive-DataType)。wTextProps.swMaxTextSize 或 arraySize of ImplementationDataType-Element of category ARRAY) 。如果没有,一个MALFORMED _ message 错误将被发出;
- 将字符串数据(根据字符串长度字段的减少值复制字节数)从输入缓冲区复制到数组中,如果 BaseTypeDirectDefinition.byteOrder 和SOMEIPTransformationDescription,则可以选择执行 ECU 和总线之间的(UTF-16LE)和(UTF-16BE)转换。字节顺序有不同的值。 不是将应用程序字符串传输为带有 BOM 和“0”终止符的 SOME/IP 字符串,而是将字符串传输为没有 BOM 和“0”终止符的普通动态长度数组; 这需要在应用程序中完成完整的字符串处理(例如 endianness 转换)。这也可以通过设置 im-plementsLegacyStringSerialization 属性为 true 来实现。在 CP 中,这个属性在 SOMEIPTransformationISignalProps 中配置,在 AP 中,它在 ApSomeipTransformationProps 中配置;
4.2.4.5 数组
4.2.4.5.1 固定长度数组
- [SWS_SomeIpXf_00069] 固定长度数组的长度由数据类型 defintion.c (SRS _ xfrm _ 00101)定义;
- 固定长度数组在小型设备中更容易使用;动态长度数组会占用ECU更多的资源;
- SOME/IP 允许在数组前面添加 8、16 或 32 位的长度字段。数组的长度域描述了数组的字节数。这使得可扩展的数组可以更好的迁移接口;
- [SWS_SomeIpXf_00220] 如果属性 sizeOfArrayLengthFields of someip transformation isignalprops 的值设置为大于 0,则应在每个序列化数组.c (SRS _ xfrm _ 00101)的前面插入一个长度字段,该规则同样适用于嵌套数组;
- [SWS_SomeIpXf_00256] 如 果 someip-transformation props 的sizeOfArrayLengthField 属性设置为大于 0 的值,则在定义 someiptransformation props 的序列化数组前面插入一个长度字段(如果通过 someiptransformation props 将数组的长度字段和包含的所有嵌套数组的长度字段配置为长度字段的不同值,则使用该规则);
- [SWS_SomeIpXf_00257] someiptransformation props.sizeofarraylengthfield对于静态大小数组, 数组长度域的数据类型应由SOMEIPTransformation-Props 的值决定。sizeOfArrayLengthField: • uint8 if sizeOfArrayLengthField equals 1 • uint16 if sizeOfArrayLengthField equals 2 • uint32 if sizeOfArrayLengthField equals 4 • Otherwise [SWS_SomeIpXf_00221] applies.
- [SWS_SomeIpXf_00221] 数组长度字段的数据类型应由序列化 issignal 的someiptransformation isignalprops.sizeofar-raylengthfields 的值确定: • uint8 if sizeOfArrayLengthFields equals 1 • uint16 if sizeOfArrayLengthFields equals 2 • uint32 if sizeOfArrayLengthFields equals 4
- [SWS_SomeIpXf_00222] 序列化 SOME/IP 转换器应将序列化数组的大小(以字节为单位)(不包括长度字段的大小)写入 array. c (SRS _ xfrm _ 00101)的长度字段中;
- [SWS_SomeIpXf_00223] 如果长度大于数组的预期长度(在数据类型定义中指定) ,则反序列化的 SOME/IP 转换器将只解释预期的数据并跳过多余数据;为了更好的确定跳过的意外部分之后找到下一个预期数据的开始,SOME/IP 转换器可以提供的长度信息;
4.2.4.5.2 一维数组
- 具有固定长度 n 的一维数组携带同一类型的 n 个元素;
- [SWS_SomeIpXf_00070] 一个固定长度的一维数组应通过将数组元素串联在order.c (SRS _ xfrm _ 00101)中进行序列;
4.2.4.5.3 多维数组
- 多维数组的序列化应该按照主序(c 编程语言中多维数组的内存布局);
4.2.4.5.4 可选参数
可选的 Elements 可以编码为具有 0 到 1 个元素的数组
4.2.4.5.5 动态长度数组
- 可变尺寸数组在 AUTOSAR 中实现为具有两个成员的结构:一个大小指示器,它是一个整数,包含数组中有效元素的数量(以字节为单位);大小可变的数组;
- 对动态长度数组进行序列化时,依次对数据进行串联处理;
- [SWS_SomeIpXf_00234] 可 变 大 小 数 组 在 AUTOSAR 中由一个implementation 数据类型表示,该类型包含 STRUCTURE 和两个子元素(即有效载荷和大小指示器); 可变大小数组的 SOME/IP 消息应从 sizeOfArrayLengthFields 中确定。如果属性sizeOfArrayLengthFields 没有配置,那么默认值 32 位将按照[ PRS _ someip _ 00945]的定义使用;
- SOME/IP 消息中的长度字段的数据类型应以不同的方式确定: • SOME/IP 长度字段的数据类型应由单个 sizeofarraylenthfields 确定。如果属性 sizeOfArrayLengthFields 没有配置,那么默认值 32 位将按照[ PRS _-SOMEIP _ 00945]的定义使用。 • SOME/IP 长度字段的所有数据类型应由单个 sizeofarraylenthfields 确定。如果属性 sizeOfArrayLengthFields 没有配置,那么默认值 32 位将按照[ PRS _-SOMEIP _ 00945]的定义使用; • 所有尺寸(嵌套级别)的所有 SOME/IP 长度字段的数据类型应由单个 sizeofarraylenthfields 确定。如果属性 sizeOfArrayLengthFields 没有配置,那么默认值 32 位将按照[ PRS _ someip _ 00945]的定义使用; • 所有可变尺寸数组的所有SOME/IP长度字段的数据类型应该从单个 sizeofarraylenthfields 中确定。如果属性 sizeO-fArrayLengthFields 没有配置,那么默认值 32 位将按照[ PRS_someip _ 00945]的定义使用;
- 在一维数组中使用了一个长度字段,它承载了数组中有效元素的字节大小;
- [SWS_SomeIpXf_00235] 如果 dynamicArraySizeProfile 的值等于 VSA _ linear,则应根据 AUTOSAR 数据类型 c (SRS _ xfrm _ 00101,SRS _ xfrm _ 00008)的大小指示器的值计算序列化的可变大小数组的长度场的值(静态长度元素的数量可以很容易地通过数组长度 n 除以元素的字节大小来计算);
- 在动态长度单元的情况下,不能计算单元的数目,但必须按顺序解析单元;
- 在多维可变大小数组的情况下,每个可变大小数组需要有自己的长度字段,独立于AUTOSAR 数据类型(即独立于 dynamicAr-raySizeProfile 的值)中如[ SWS _ someipxf _ 00234]所指定的可变大小数组的设计方式。因此,支持在同一维度中有不同长度的 列和不同长度的行。
- [SWS_SomeIpXf_00236] 如果多维可变尺寸数组的 dynamicArraySizeProfile 值等于 VSA_square,则属于该多维可变尺寸数组的嵌套序列化可变尺寸数组的所有长度域的值应根据 AUTOSAR 数据类型 c (SRS_xfrm_00101,SRS_xfrm_00008)的单一尺寸指示器的值计算; 在 VSA _ square 的情况下,AUTOSAR 数据类型只有一个大小指示器。该尺寸指示器的值将用作计算这种多维可变尺寸数组的所有长度场的值的基础;
- [SWS_SomeIpXf_00237] 如果多维可变尺寸数组的 dynamicArraySizeProfile 值等于 VSA _ rectangle,则属于该多维可变尺寸数组的同一嵌套层次(即同一维度)的嵌套序列化可变尺寸数组的所有长度域的值应根据该嵌套层次的 AUTOSAR 数据类型的尺寸指示符的值计算; 在 VSA _ rectangle 的情况下,AUTOSAR 数据类型对于多维可变尺寸数组的每个维度都有一个尺寸指示器。对于一维中的所有可变尺寸数组,将使用该尺寸的相应尺寸指示器的值作为计算该尺寸的所有长度域值的基础。
- [SWS_SomeIpXf_00238] 如果多维可变尺寸数组的 dynamicArraySizeProfile 值等于 VSA _ fully _ flexible,则属于该多维可变尺寸数组的嵌套序列化可变尺寸数组的所有长度域的值应根据 AUTOSAR 数据类型 c (SRS _-Xfrm _ 00101,SRS _ Xfrm _ 00008)中包含的相应可变尺寸数组的尺寸指示器的值计算; 在 VSA _ fully _ flexible 的情况下,在 AUTOSAR 数据中键入外部可变大小数组,每个嵌套的可变大小数组都有自己的大小指示器。对于计算外部和所有嵌套的可变大小数组的长度域的值,AUTOSAR 数据类型的大小指示器的相应值将作为基础; RTE 提供了一个缓冲区,其中序列化结果将由 SOME/IP 转换器写入,该转换器足够大以保持长度字段和一个完全填充的动态数组。
4.2.4.6 位域
- Bitfields 应该作为基本数据类型 uint8/uint16/uint32进行传输;
4.2.4.7 联合体
- Union (也称 variant)是一个可以包含不同类型元素的参数。例如,如果定义了 uint8 和uint16 类型的联合,那么这个联合应该包含 uint8 或 uint16 类型的元素; 联合体将仅用于触发,如果如果定义的模式适用;
- [SWS_SomeIpXf_00249] 如果使用了具有以下模式的 implementation-data type ( 命名为 wrapped union data type) , 则应检测到union: ImplementationDataType , 其类别STRUCTURE恰好包含两个ImplementationDataTypeElements: • memberSelector: ImplementationDataTypeElement,它表示类型字段,归结为uint8,uint16 或 uint32 Implementation-DataType • payload: 代表实际 UNION 的类别 UNION 的 ImplementationDataTypeElement 当使用不同类型的元素时,可能会影响参数的对齐,所以可能需要做对齐处理;
- [SWS_SomeIpXf_00088] SOME/IP 中联合体的默认序列化布局如下所示:
- SOME/IP 允许在联合前添加 8、16 或 32 位的长度字段。联合的长度域描述了联合中的字节数。
- 这允许反序列化器快速计算出联合后数据在序列化数据流中开始的位置。如果联合包含的数据比预期的要大,那么就需要这样做,例如,r如果一个结构用附加的新成员进行扩展,并且只有第一个“老”成员会被 SOME/IP 转换器反序列化;
- [SWS_SomeIpXf_00224] 如果属性 sizeOfUnionLengthFields of someip transformation isignalprops 的值设置为大于 0,则应在每个序列化的 union前面插入一个长度字段; 也适用于嵌套联合,这意味着另外每个嵌套联合都有自己的长度字段;
- [SWS_SomeIpXf_00254] 如 果 someip-transformation props 的sizeOfUnionLengthField 属性设置为大于 0 的值,则在定义 someiptransformation props 的序列化并集前面插入一个长度字段; 适用于联合和所有嵌套联合的长度字段 根联合中包含的内容通过 someiptransformation props 配置为不同长度字段的值;
- [SWS_SomeIpXf_00225] 并集的长度字段和并集内的所有嵌套并集的数据类型应由someiptransformtionisignalprops 的值确定。sizeOfUnionLengthFields 的序列化 issignal: • uint8 if sizeOfUnionLengthFields equals 1 • uint16 if sizeOfUnionLengthFields equals 2 • uint32 if sizeOfUnionLengthFields equals 4
- someiptransformation props.sizeofunion lengthfield对于并集,其长度字段的数据类型应由someiptransformation props.sizeofunionlengthfield: • uint8 if sizeOfUnionLengthFields equals 1 • uint16 if sizeOfUnionLengthFields equals 2 • uint32 if sizeOfUnionLengthFields equals 4 • Otherwise [SWS_SomeIpXf_00225] applies.
- [SWS_SomeIpXf_00226] 序列化 SOME/IP 转换器应将序列化联合的大小(以字节为单位)(包括填充字节,但没有长度字段和类型字段的大小)写入联合的长度字段。这个要求不适用于可扩展结构和方法的序列化;
- [SWS_SomeIpXf_00227] 如果长度大于联合体的预期长度(在数据类型定义中指定) ,那么反序列化的 SOME/IP 转换器将只解释预期的数据并跳过意外的;
- [SWS_SomeIpXf_00250] 联合类型字段的数据类型应该由[ SWS _ someipxf _ 00249]中定义的包装联合数据类型中的第一个Implementation-DataTypeElement (memberSelector) 的implementation 数据类型确定;
- [SWS_SomeIpXf_00098] 类型字段的可能值由联合的数据类型规范定义。这些类型被编码为数据类型,从1开始以升序排列。0 是为 NULL 类型保留的——即一个空的union;
- [SWS_SomeIpXf_00251] 类型字段的值应该设置为[ SWS _ someipxf _ 00249]中定义的包装联合数据类型中的第一个Implementation datatypeelement (memberSelector)中定义的值;
- [SWS_SomeIpXf_00099] 元素根据类型字段中的类型进行序列化。这也定义了数据的长度。长度所覆盖的数据后面的所有字节都是填充。反序列化器将跳过填充字节,根据[ SWS _ someipxf _ 00088]中给出的公式计算所需的数字; 通过在数据类型定义中使用结构,可以实现不同的填充布局;
4.2.4.7.1 示例:uint8/uint16 的 Union 都被填充为 32 位
描述:Length 字段的长度被指定为 32 位。并集应该支持一个 uint8 和一个uint16 作为元素。两者都被填充到 32 位边界(长度 = 4 字节)。
4.3 协议标准
本章描述了客户端/服务器和发送端/接收端通信的 SOME/IP 协议。
4.3.1 Client/Server通信
对于 SOME/IP 请求消息,客户端 ecu 上的 SOME/IP 转换器必须为有效负载和头部,执行以下操作:
- 构建Payload;
- 设置Request ID;
- 设置Interface Version;
- 设置 Return Code = 0x00;
- 设置Message Type = 0x00;
- [SWS_SomeIpXf_00120] 为了构造请求消息的有效负载,ClientServerOperation 中所有指向 IN 或 INOUT的参数都应该按照ClientServerOperation.c (SRS _ xfrm _ 00102)中参数数据原型的顺序序列化;
- [SWS_SomeIpXf_00200] 如果TransformationISignal-Props的csErrorReaction被设置为自动,并且从 RTE 传递的 return value 参数大于或等于0x80,客户机/服务器通信响应的SOME/IP 变换器将根据[ SWS _ someipxf _ 00201]生成错误消息,否则将根据[ SWS _ someipxf _ 00107]生成正常响应;
- [SWS_SomeIpXf_00107] 服务器上的 SOME/IP 转换器-ecu 基于客户端请求的头部为服务器响应构建头部,应执行如下操作:
- 构建Payload;
- 设置Message Type = 0x80;
- 如果ClientServerOperation至少定义了一个 possible error,则将执行的ClientServerOperation 的返回值放入 Return Code 字段,并添加0x1f 以调整数值范围,以防原始返回值与 0x00 不同;
- [SWS_SomeIpXf_00121] 为了构造响应消息的有效载荷 ,ClientServerOperation 中所有指向 INOUT 或 OUT 的参数都应按以下顺序序列化:
- [SWS_SomeIpXf_00201] 服务器上的 SOME/IP 转换器—— ecu 根据客户端请求的头部构建自治错误响应头部,应执行如下操作:
- 不用构建Payload;
- 设置Message Type = 0x80;
- 设置返回值,从参数 return value 中减去 0x80 来调整返回值;
- 错误消息只能作为客户端/服务器请求的响应发送,而不能作为发送方/接收方通信或错误消息的响应发送;
- [SWS_SomeIpXf_00202] 在服务器 ecu 上建立自主错误响应的SOME/IP 转换器应返回等于 e _ ok 的返回值; 如果 SOME/IP 转换器返回的返回代码与 e_ok 不同,则会发出一个硬错误,阻止 RTE 发送自主错误响应。
4.3.2 Sender/Receiver通信
会话处理ID计数器用于在会话处理被激活的发送方/接收方通信的情况下,在SOME/IP 报头中设置正确的请求 ID。
- [SWS_SomeIpXf_00212] 已完成的会话处理 ID 计数器(16 位)必须按照发送方/接收方通信的转换器函数进行维护,如果sessionHandlingSR 设置为 sessionHandlingActive;
- [SWS_SomeIpXf_00213] All Session 处理 ID 计数器将初始化为 0x0001;
- [SWS_SomeIpXf_00108] 转换后的发送方/接收方通信中的 SOME/IP 转换器应以下列方式构造头和有效负载:
- 构建有效负载;
- 设置Request ID; – 如果 someiptransformationissignal 的 sessionHandlingSR-props 未设置为 sessionHandlingActive,则设置为 0x00 – 会话处理 ID 计数器的当前值
- 根据[ SWS _ someipxf _ 00029]设置协议版本;
- 设置接口版本;
- 设置 Message Type: – NOTIFICATION (0x02) – REQUEST_NO_RETURN (0x01)
- 设置 Return Code = 0x00;
- SOME/IP 转换器从不检查接收端的Session ID,因为 SOME/IP 的默认行为是发送方/接收方通信忽略接收端的会话 ID;
- 当需要时,应用程序必须实现错误处理和返回代码;
4.3.3 外部触发事件
外部触发事件用于在没有IN、INOUT或OUT参数的情况下触发 rpc,或者用于表示一种没有任何参数的特殊类型的事件,该事件从服务器传输到一个或多个客户端,在此情况下,Service Consumer 应以特定的方式做出反应。外部触发事件是由SOME/IP 作为无参数的 fire-and-forget 方法实现的。
- [SWS_SomeIpXf_00204] 转换外部触发事件的触发源端的 SOME/IP 转换器应该以下面的方式构造头部:
- 设置Request ID; – 如果 someiptransformationissignal 的 sessionHandlingSR-props 未设置为 sessionHandlingActive,则设置为 0x00 – 会话处理 ID 计数器的当前值
- 设置Protocol Version;
- 设置Interface Version;
- 设置Message Type = REQUEST_NO_RETURN(0x01);
- 设置 Return Code = 0x00;
- [SWS_SomeIpXf_00205] 用于外部触发事件通信的消息的有效载荷应该是空的;
- 当需要时,应用程序必须实现错误处理和返回代码;
4.3.4 错误处理
- 错误处理将完全在应用程序中完成,SOME/IP仅传输错误信息;
- 支持两种不同的错误传输机制: Return Code 和 Error Message;
- [SWS_SomeIpXf_00111] SOME/IP Transformer应使用 Return Code 错误处理;
- 所有消息都有一个返回代码字段来携带返回代码。但是,只有响应(messagetype0x80和 0x81)使用此字段将返回代码传递给它们应答的情趣(messagetype0x00)。所有其他消息都将该字段设置为 0x00; 对于更详细的信息,Error Message(Message Type 0x81)的布局可以包含用于错误处理的特定字段,例如 Exception String。Error Messages 被发送而不是 Response Messages;
4.3.4.1 Return Code
- [SWS_SomeIpXf_00112] 通过 Return Code进行的错误处理应基于Return type;
- [SWS_SomeIpXf_00113] Return Code仅可以用于Client/Server通信;
- [SWS_SomeIpXf_00170] 在客户端/服务器通信的情况下,如果没有发生 SOME/IP 错误,则返回代码应传输已执行的客户端服务器操作的应用程序错误; 如果发生 SOME/IP 错误,该错误包含在 Return Code 中。如果没有发生SOME/IP 错误,则 Return Code 包含执行服务器可运行的错误(或成功)代码; 如果在客户机/服务器通信的情况下发生错误,则可以将服务器配置为创建一个自主的错误响应,该响应将发送回客户机。响应时,SOME/IP 头字段 requestd 和 Interface Version 应等于请求消息头中的值;
- RequestId 是从RTE移交的,Interface Version 与请求是一致的,因为 SOME/IP 转换器的配置只允许相同的 InterfaceVersion 用于请求和响应;
- [SWS_SomeIpXf_00115] Return Code定义如下所示:
4.3.4.2 通信错误和通信错误处理
- 当考虑客户端/服务器消息的传输时,存在不同的可靠性语义: Maybe – 信息可能会到达通讯伙伴; At least once – 消息到达通信伙伴至少一次; Exactly once – 消息到达通信伙伴正好一次;
- 基于UDP的实现满足“Maybe”级别的可靠性,基于TCP的实现满足“Exactly once”级别的可靠性;
- 基于UDP的实现,应该设置超时间l SOMEIPXF_E_TIMEOUT,如下图所示:
4.3.4.3 基于应用的错误处理
- 应用程序可以通过使用幂等操作(即可以执行多次而没有副作用的操作)和使用简单的超时机制轻松实现“至少一次”可靠性;
- 下图显示了使用隐式确认的“至少一次”可靠性的状态机:
4.4 SOME/IP 和 SOME/IP-SD 的保留和特殊标识符
保留和特殊Service ID,如下图所示:
保留和特殊的Instance-IDs,如下图所示: 保留的和特殊的 Method-IDs/Event-IDs,如下图所示: Service为0xFFFF的Method-IDs和Event-IDs,如下图所示: 除了“ otherserv”,配置选项还支持其他名称,如下: – Used to name a host or ECU; – Used to name an instance of a service; – Used to name a service; – Used for non-SOME/IP Services;
4.5 错误分类
该分类方案由可能由[14,SWS BSW General]模块中的五种错误类型组成。
4.5.1 开发错误
4.5.2 运行错误
无。
4.5.3 暂时性故障
无。
4.5.4 制作错误
无。
4.5.5 扩展生产错误
所有对 SOME/IP Transformer有效的扩展生产错误都在[3,ASWS Transformer General]中指定;
5. API定义
5.1 导入类型
- 除了[3,ASWS Transformer General ]中指定的模块之外,没有从其他模块导入的类型;
- 在由 SOME/IP Transformer 导入的 Module Interlink header 文件中,包含了 RTE 已知的所有 implementation 数据类型。使用这种机制,SOME/IP Transformer 知道所有需要转换的数据类型;
5.2 类型定义
5.3 函数定义
- SOME/IP Transformer提供了[3,ASWS Transformer General ]通常需要的特定接口;
- [SWS_SomeIpXf_00150] 只有变压器链中的第一个变压器可以是 SOME/IP 变压器,因为串行变压器通常只允许成为链中的第一个变压器;
5.3.1 SomeIpXf_ExtractProtocolHeaderFields
- [SWS_SomeIpXf_00296] SWS _ SomeIpXf _ extractprotocolheader-fields中指定的函数 SomeIpXf _ extractprotocolheader-fields 应从 SOME/IP 协议头中提取消息的类型和消息结果的类型,并通过其输出参数以规范表示形式提供此信息;
- [SWS_SomeIpXf_00297] 函数 SomeIpXf _ extractprotocolheader-[ SWS _ SomeIpXf _ 91001]中指定的字段应检查所提供的缓冲区长度是否大于或等于由SOME/IP 转换器处理的协议头的大小(即 8 字节)。如果不是这样的话,应该返回 e _ not _ ok。在这种情况下,messageType 和 messageResult 都不能被修改;
- [SWS_SomeIpXf_00298] 函数 SomeIpXf _ extractprotocolheader-[ SWS _SomeIpXf _ 91001]中指定的字段应检查 Protocol Version 字段(参见[ PRS _ someip _ 00052])的值是否等于[ PRS _ someip _ 00051]中定义的值。如果不是这样,应该返回 e _ not _ ok。在这种情况下,messageType 和 messageResult 都不能修改;
- [SWS_SomeIpXf_00299] 函数 SomeIpXf _ extractprotocolheader-[ SWS _ SomeIpXf _ 91001]中指定的字段应检查 Message Type 字段(参见[ PRS _ someip _ 00055])的值是否等于 REQUEST、 RESPONSE 或 ERROR。如果不是这样,应该返回 e _ not _ ok (SRS _ xfrm _ 00002)[ SWS _ SomeIpXf _ 00301] d 在[ SWS _ SomeIpXf _ extractprotocolheader-fields 中指定的函数在所有其他情况下都应返回e _ ok;
- [SWS_SomeIpXf_00302] 函数 SomeIpXf _ extractprotocolheaderfields 应将 messageType 设置为 STD _ messageType _ request,以防Message Type 字段的值等于 REQUEST;
- [SWS_SomeIpXf_00303] 函数 SomeIpXf _ extractprotocolheaderfields 应将 messageType 设置为 STD_messageType_RESULT,以防Message Type 字段的值(参见[ PRS _ someip _ 00055])等于 RESULT 或 error;
- [SWS_SomeIpXf_00304] 如果 Message Type 字段(参见[ PRS _ someip _ 00055])的值等于 ERROR,或者Return Code 字段的值不为0,函 数 SomeIpXf _ extractprotocolheader-fields 应将 messageResult 设置为 STD _ messageResult _ ERROR;
- [SWS_SomeIpXf_00305] 函数SomeIpXf _ extractprotocolheader-fields 必须将 messageResult 设置为 STD _ messageResult _ ok ,否则(例如,如果 Message Type 字段的值与 ERROR 不同,并且如果 Return Code 字段的值是 0;
8.3.2 SomeIpXf_< transformerId >
- [SWS_SomeIpXf_00228] ] [ SWS _ SomeIpXf _ 00138]中定义的dIn函数SomeIpXf _ < transformerid >; 是根据[15,SRS BSW General ]和[14,SWS BSW General ]定义的参数传递规则从类型派生的; 类型应该是 RTE 的所有数据转换活动之后的数据元素的数据类型; 应该是在[ SWS _ xfrm _ 00062]([3,ASWS Transformer General ])中指定的变压器的名称模式;
- [SWS_SomeIpXf_00139] 函数 SomeIpXf _ < transformerid > ,如果数据转换是由角色数据中的 issignal 引用的,则该函数应存在于从数据转换到 transformationtech 技术的有序引用转换器列表中的第一个引用 transformation,其中 issignal 引用了由发送接收信号映射引用的系统信号;
- [SWS_SomeIpXf_00140] 函数 SomeIpXf _ < transformerid > 应使用SOME/IP serialization.c ()将发送方/接收方通信的原始或复杂数据元素序列化为线性字节数组表示形式;
- [SWS_SomeIpXf_00214] 在数据序列化之后,如果 sessionhandlingingsr 设置为sessionHandlingActive() ,则[ SWS _ SomeIpXf _ 00138]中指定的 SomeIpXf _ < transformerid > 函数将增加分配给 < transformerid > 的会话处理 ID 计数;
- [SWS_SomeIpXf_00215] 当分配给 < transformerid > 的会话处理 ID 计数器为0xffff 并 且 递 增 时 , 如 果 sessionhandlinglingsr 被设置为sessionHandlingActive () ,那么它应该滚动到 0x0001(而不是 0x0000);
- [SWS_SomeIpXf_00141]
- Paramtype 是根据[15,SRS BSW General ]和[14,SWS BSW General ]定义的参数传递规则从类型派生的;
- 类型应该是 RTE 的所有数据转换活动之后的数据元素的数据类型;
- transformerId 应该是在[ SWS _ xfrm _ 00062]([3,ASWS Transformer General ])中指定的变压器的名称模式;
- 此函数存在于使用 SOME/IP 序列化的每个转换后的 Client/Server 通信的服务器和每个客户端;
- 此函数同时存在于客户端和服务器上,但参数是不同的;
- 在客户机上,它序列化 Client/Server 调用的请求;
- 在服务器上,它序列化 Client/Server 调用的响应;
- [SWS_SomeIpXf_00142] 的函数 SomeIpXf _ < transformerid > 应存在于从数据转换到转换技术的有序引用转换器列表中的第一个引用,如果数据转换是由角色 datattransformation 中的 issignal 引用的,issignal 引用呼叫信号或重新转换信号中的 ClientServerToSignalMapping引用的系统信号;
- [SWS_SomeIpXf_00143] 应使用 SOME/IP serialization()将客户机/服务器通信的所有原始或复杂操作参数和返回值(如果在服务器端执行)序列化为线性字节数组表示形式;
- [SWS_SomeIpXf_00203] 函数 SomeIpXf _ < transformerid > 如果返回代码大于或等于 0