SOME/IP--协议英文原文讲解4

前言
SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块:

1. SOME/IP协议讲解

2. SOME/IP-SD协议讲解

3. python/C++举例调试讲解


4.1.3 Endianess -- 字节序
[PRS_SOMEIP_00368]
Upstream requirements: RS_SOMEIP_00026
All SOME/IP Header Fields shall be encoded in network byte order (big endian). -- Header 由于是基于网络传输 跟随为 网络字节序--大端存贮

[PRS_SOMEIP_00759]
Upstream requirements: RS_SOMEIP_00026
The following fields in the payload of SOME/IP messages shall be encoded in network
byte order (big endian): payload和Header一样的字节序
• the optional length field of extensible structs ([PRS_SOMEIP_00079]),
• the TLV tag ([PRS_SOMEIP_00203]) and the length field ([PRS_SOMEIP_00221]) of 
  structured datatypes and arguments with identifier and optional members,
• the optional length field for fixed length strings ([PRS_SOMEIP_00760]),
• the length field for dynamic length strings ([PRS_SOMEIP_00089]),
• the optional length field for extensible fixed length arrays ([PRS_SOMEIP_00944]),
• the length field of dynamic length arrays ([PRS_SOMEIP_00376]),
• the length field of unions ([PRS_SOMEIP_00126]),
• and the type field of unions ([PRS_SOMEIP_00129]).

以上说明的是payload哪些变长类型时需要添加length字段,后面会有详细介绍。

[PRS_SOMEIP_00369]
Upstream requirements: RS_SOMEIP_00026
The byte order of the parameters inside the payload shall be defined by configuration. 
An exception is the tag for TLV (as defined by [PRS_SOMEIP_00202]
and [PRS_SOMEIP_00203]) which shall have byte order according to
[PRS_SOMEIP_00204] and [PRS_SOMEIP_00759].
payload的数据参数类型和排列顺序应该被定义在配置文件中,这样双方对着配置文件就可以序列化和反序列化了。不过TLV除外--后面讲解

4.1.4 Serialization of Data Structures
The serialization is based on the parameter list defined by the interface specification.
The interface specification defines the exact position of all data structures in the PDU
and has to consider the memory alignment.
Alignment is used to align the beginning of data by inserting padding elements after
the data in order to ensure that the aligned data starts at certain memory addresses.
There are processor architectures which can access data more efficiently (i.e. master)
when they start at addresses which are multiples of a certain number (e.g multiples of
32 Bit).
[PRS_SOMEIP_00611]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00029
Alignment of data shall be realized by inserting padding elements after the variable
size data if the variable size data is not the last element in the serialized data stream.--强调了变长元素如果不是最后一个元素 必须填充。

这段话主要解释了 SOME/IP 进行数据结构序列化时的对齐规则,其中涉及 数据对齐 (Alignment)填充 (Padding) 机制,重点如下:

1. 序列化 (Serialization) 基于接口定义

"The serialization is based on the parameter list defined by the interface specification."

  • 序列化 指的是将内存中的数据转换成一个标准格式的数据流,以便传输或存储。
  • 接口规范 (interface specification) 决定了 每个数据结构在 PDU (Protocol Data Unit) 中的具体位置,因此数据的存放方式是 提前规定好的,不能随意调整。

2. 需要考虑数据对齐

"The interface specification defines the exact position of all data structures in the PDU and has to consider the memory alignment."

  • PDU (协议数据单元) 是 SOME/IP 传输数据的基本单位。
  • 数据对齐 是指 确保数据在特定的内存地址上对齐存放,以优化 CPU 访问效率
  • 这意味着:SOME/IP 不能简单地按顺序存放数据,而是要保证合适的对齐规则,如果不满足对齐要求,就需要填充 (Padding)

3. 为什么要对齐?

"Alignment is used to align the beginning of data by inserting padding elements after the data in order to ensure that the aligned data starts at certain memory addresses."

  • 某些处理器架构 (CPU) 访问特定地址的数据时更高效,比如:
    • 32 位数据 (4 字节) 最好存放在 4 的倍数的地址上
    • 64 位数据 (8 字节) 最好存放在 8 的倍数的地址上
  • 如果数据 不对齐,有些 CPU 可能需要 额外的指令 才能正确读取,导致性能下降

4. 一些架构依赖对齐来提高访问效率

"There are processor architectures which can access data more efficiently (i.e. master) when they start at addresses which are multiples of a certain number (e.g. multiples of 32 Bit)."

  • CPU 访问内存时,往往有最佳对齐要求
    • 32 位 (4 字节) 访问时,最优地址是 4 的倍数
    • 64 位 (8 字节) 访问时,最优地址是 8 的倍数
  • 如果数据 没有正确对齐,可能会:
    1. 触发 CPU 额外的访问操作(如 x86 可能执行 2 次读取)。
    2. 导致某些 RISC 架构直接崩溃(如某些 ARM 处理器不允许非对齐访问)。

5. SOME/IP 通过插入 Padding 确保对齐

[PRS_SOMEIP_00611] Alignment of data shall be realized by inserting padding elements after the variable size data if the variable size data is not the last element in the serialized data stream.

  • 如果一个变量大小的数据 (variable size data) 不是最后一个元素,就需要在后面填充 (Padding) 来确保对齐。
  • 这是为了让后续的定长数据 (如 UINT32, UINT64) 能够正确对齐

💡 关键点:

  • 固定大小的数据 (如 UINT32, UINT64) 一般直接对齐存放
  • 变长数组 (variable size array) 后面需要填充 (Padding),以保证下一个数据项正确对齐
  • 如果变长数据是最后一个元素,则可以不填充 Padding(因为没有后续数据需要对齐)。

总结

  1. SOME/IP 在序列化数据时,会严格按照接口规范定义的顺序存放数据。
  2. CPU 访问某些特定地址上的数据更高效,因此数据对齐很重要。
  3. 如果某个变长数组不是最后一个数据,就要在它后面插入 Padding,以保证后续数据的对齐。
  4. 填充 (Padding) 只是为了对齐,不会影响数据本身的意义。

Note: Please note that the padding value is not defined. -- 填充的值不做定义 随意设置

这个例子中为啥变长数组结束的地址已经是4字节对齐了为啥还要再填充?

关键点:变长数组的长度是不确定的

协议规范规定,变长数组后必须填充 (Padding),除非它是最后一个成员
这个规则并不依赖于当前变长数组是否对齐,而是为了保证序列化数据的一致性和解析的通用性。

📌 主要原因有两个:

  1. 协议层面的通用性

    • SOME/IP 设计时,要求 所有变长数据 (Variable-size Data) 不是最后一个字段时,必须填充 Padding
    • 这样可以保证 所有固定大小的数据 (如 UINT32, UINT64) 都是按照它们的对齐要求放置的,避免不同情况下处理逻辑的复杂性。
  2. 防止解析时出现不确定行为

    • 变长数组的大小可能会发生变化,比如:
      • 如果当前变长数组的长度为 4 字节,你会觉得可以不填充。
      • 但如果 数组长度变成 3 字节,那 UINT32 就会变成非对齐存储,需要额外的填充。
    • 为了解决这种情况,协议强制规定变长数据后必须填充 Padding,以确保固定大小的数据始终是对齐的。

[PRS_SOMEIP_00569]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00029
Alignment shall always be calculated from start of SOME/IP message.字段对齐内存计算时必须从整个SOMEIP消息的开始位置计算 包括SOME/IP的header
[PRS_SOMEIP_00612]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00029
There shall be no padding behind fixed length data elements to ensure alignment of
the following data. 定长字段后面不用添加对齐填充。
Note:
If data behind fixed length data elements shall be padded, this has to be explicitly
considered in the data type definition. 如果定长后有填充 必须单独说明
[PRS_SOMEIP_00613]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00029
The alignment of data behind variable length data elements shall be 8, 16, 32, 64,
128 or 256. Bits. 填充的长度必须是1、2、4、8、16、32、64字节。

基本类型

The Byte Order is specified for each parameter by configuration.字节序 按照 参数规范定义的排列(上面有讲)

[PRS_SOMEIP_00615]
Upstream requirements: RS_SOMEIP_00030, RS_SOMEIP_00031, RS_SOMEIP_00032
For the evaluation of a Boolean value only the lowest bit of the uint8 is interpreted and
the rest is ignored.
对于布尔数据的类型 仅使用最低为 其它位不考虑 

[PRS_SOMEIP_00077]
Upstream requirements: RS_SOMEIP_00033
The SOME/IP implementation shall not automatically insert dummy/padding data.

不能像C语言那样 随便插入 填充字节来内存对齐(网络序列不需要 因为反序列化就是按照字节来解析的 没有内存对齐的烦恼) 结构体中每个成员的的序列化要按照规范要求来(下面有介绍各种情况) 

[PRS_SOMEIP_00079]

Upstream requirements: RS_SOMEIP_00033, RS_SOMEIP_00040

An optional length field of 8, 16 or 32 Bit may be inserted in front of the Struct depending on the configuration.

[PRS_SOMEIP_00370]

Upstream requirements: RS_SOMEIP_00033, RS_SOMEIP_00040

The length field of the struct shall describe the number of bytes this struct occupies for SOME/IP transport.

可以在结构体前加上描述结构体长度的字段,这个字段可以是1、2、4字节。---需要客户指定

[PRS_SOMEIP_00712]

Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00033

The serialization of structs shall follow the depth-first-traversal of the structured data type.

序列化嵌套结构体 应采用深度优先遍历--按照嵌套的顺序依此序列化。


https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工作总结:git篇

文章目录 前言基础Gerrit1.克隆2.新建本地分支和checkout3.添加到暂存区新增文件到暂存区修改已经添加到暂存区的文件取消添加到暂存区的文件 4.提交到本地仓库在不重复提交的情况下,修改本次提交 5.提交到远程仓库6.评审其他辅助命令 前言 目前也算是工作一段时间…

SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由

前言 在微服务架构中,API 网关是各个服务之间的入口点,承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理,通常需要通过中心化的配置管理系统来实现灵活的路由更新,而无需重启网关服务。Nacos 作为一个开源…

WireShark4.4.2浏览器网络调试指南:数据统计(八)

概述 Wireshark 是一款功能强大的开源网络协议分析软件,被广泛应用于网络调试和数据分析。随着互联网的发展,以及网络安全问题日益严峻,了解如何使用 Wireshark进行浏览器网络调试显得尤为重要。最新的 Wireshark4.4.2 提供了更加强大的功能…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟:生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

Eureka 服务注册和服务发现的使用

1. 父子工程的搭建 首先创建一个 Maven 项目&#xff0c;删除 src &#xff0c;只保留 pom.xml 然后来进行 pom.xml 的相关配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xs…

【PowerShell专栏】实现Terminal工具的安装

微软已经发布了Windows Terminal的版本,提供各个命令操作工具的集成环境,在Windows Terminal中,我们可以集中实现多页签的各个命令方式,相比传统的命令执行分离,着实方便了不少。图为Terminal 界面: 如何实现Windows Terminal的安装呢?有好几种方式可以实现Windows Term…

从0到1:C++ 开启游戏开发奇幻之旅(二)

目录 游戏开发核心组件设计 游戏循环 游戏对象管理 碰撞检测 人工智能&#xff08;AI&#xff09; 与物理引擎 人工智能 物理引擎 性能优化技巧 内存管理优化 多线程处理 实战案例&#xff1a;开发一个简单的 2D 射击游戏 项目结构设计 代码实现 总结与展望 游戏…

九大服务构建高效 AIOps 平台,全面解决GenAI落地挑战

最近,DevOps运动的联合创始人Patrick Debois分享了他对AI平台与软件研发关系的深刻见解,让我们一起来探讨这个话题。 在AI的落地过程中,我们面临着两个主要难题: 引入AI编码工具后的开发者角色转变:随着像GitHub Copilot这样的AI工具的普及,工程师的角色正在发生深刻变革…

LangChain概述

文章目录 为什么需要LangChainLLM应用开发的最后1公里LangChain的2个关键词LangChain的3个场景LangChain的6大模块 为什么需要LangChain 首先想象一个开发者在构建一个LLM应用时的常见场景。当你开始构建一个新项目时&#xff0c;你可能会遇到许多API接口、数据格式和工具。对于…

【浏览器 - Mac实时调试iOS手机浏览器页面】

最近开发个项目&#xff0c;需要在 Mac 电脑上调试 iOS 手机设备上的 Chrome 浏览器&#xff0c;并查看Chrome网页上的 console 信息&#xff0c;本来以为要安装一些插件&#xff0c;没想到直接使用Mac上的Safari 直接可以调试&#xff0c;再此记录下&#xff0c;分享给需要的伙…

【Rust自学】15.4. Drop trait:告别手动清理,释放即安全

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.4.1. Drop trait的意义 类型如果实现了Drop trait&#xff0c;就可以让程序员自定义当值…

C动态库的生成与在Python和QT中的调用方法

目录 一、动态库生成 1&#xff09;C语言生成动态库 2&#xff09;c类生成动态库 二、动态库调用 1&#xff09;Python调用DLL 2&#xff09;QT调用DLL 三、存在的一些问题 1&#xff09;python调用封装了类的DLL可能调用不成功 2&#xff09;DLL格式不匹配的问题 四、…

SpringBoot 整合 SSM

文章目录 SpringBoot 整合 SSM第一步&#xff1a;使用 Spring Initializr 创建项目第二步&#xff1a;现在配置类中配置数据库第三步&#xff1a;进行 MyBatis 相关操作编写数据表对应的实体类创建 mapper 接口利用 MyBaitsX 插件快速创建 xml 文件创建 Mapper 接口 SQL 实现在…

JVM 面试题相关总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

C++ unordered_map和unordered_set的使用,哈希表的实现

文章目录 unordered_map&#xff0c;unorder_set和map &#xff0c;set的差异哈希表的实现概念直接定址法哈希冲突哈希冲突举个例子 负载因子将关键字转为整数哈希函数除法散列法/除留余数法 哈希冲突的解决方法开放定址法线性探测二次探测 开放定址法代码实现 哈希表的代码 un…

JAVA实战开源项目:网上订餐系统(Vue+SpringBoot) 附源码

本文项目编号 T 039 &#xff0c;文末自助获取源码 \color{red}{T039&#xff0c;文末自助获取源码} T039&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

Three.js实战项目02:vue3+three.js实现汽车展厅项目

文章目录 实战项目02项目预览项目创建初始化项目模型加载与展厅灯光加载汽车模型设置灯光材质设置完整项目下载实战项目02 项目预览 完整项目效果: 项目创建 创建项目: pnpm create vue安装包: pnpm add three@0.153.0 pnpm add gsap初始化项目 修改App.js代码&#x…

【C++题解】1055. 求满足条件的整数个数

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1055. 求满足条件的整数个数 类型&#xff1a;简单循环 题目描述&#xff1a; 在 1∼n 中&#xff0c;找出能同时满足用 3 除余 2 &#xff0c;用 5 除余 3 &#xff0c;用 7 除余…

【PyTorch】6.张量形状操作:在深度学习的 “魔方” 里,玩转张量形状

目录 1. reshape 函数的用法 2. transpose 和 permute 函数的使用 4. squeeze 和 unsqueeze 函数的用法 5. 小节 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&am…

Brave132 编译指南 Windows 篇:构建与运行(七)

1. 引言 在成功获取 Brave 浏览器 132 版本的源代码之后&#xff0c;构建和启动项目便成为开发流程中至关重要的环节。这一阶段将源代码编译链接成可执行程序&#xff0c;使您能够在本地环境中运行和测试 Brave 浏览器。Windows 平台上的构建过程可能涉及特定的工具配置和环境…