星锐网站建设,前端开发常用网站,qq群怎么推广起来最快,群晖 wordpress 阿里云当我们想要讨论CAN协议底层发送到数据线上的二进制信号的编码方式时#xff0c;最值得关注的两点是#xff1a;字节编码#xff08;Endianness#xff09;和比特顺序#xff08;Bit Numbering#xff09;。先一句话揭晓答案#xff1a;CAN协议的字节编码是大端编码…当我们想要讨论CAN协议底层发送到数据线上的二进制信号的编码方式时最值得关注的两点是字节编码Endianness和比特顺序Bit Numbering。先一句话揭晓答案CAN协议的字节编码是大端编码比特顺序是逆序。使用CANOE提供的CAN报文编辑工具可以直观地看到CAN报文在内存中如下图所示一般情况下对于汽车控制器的开发人员来说是不需要知道CAN报文的编码方式的因为通常会购买一整套的CAN协议栈代码包来完成报文组装的工作。不过如果开发或维护过AutoSAR的CAN协议栈的话就会知道CAN协议栈通过构建若干静态表的方式将信号在内存中的Buffer、信号的起始和结束比特位、报文在内存中的Buffer等串联在一起。每一个信号都有一对Read和WriteReceive/Send接口间接地对信号的Buffer进行操作。所以应用开发者只通过调用接口将信号值写入信号的Buffer时CAN协议栈就会自动将信号值填入报文Buffer的对应位置并且在报文下一个发送周期将新的报文发送到CAN总线。什么是字节编码不论任何数据在现代电子和计算机系统里进行存储或传输最终都是以二进制的形式发生的这里的讨论不包括早期的三进制计算机和现在最新的量子计算机。受限于存储器单元尺寸或总线宽度数据会被按8bit、16bit、32bit、64bit等长度分段切割。不同的存储器存放被分段的二进制数据时会使用不同的顺序这就是不同的字节编码。也就是说当数据长度超过8bit时数据的存放顺序才会被字节编码影响。字节编码有大端编码Big-Endian、小端编码Little-Endian和混合编码Bi-Endian or Middle-Endian三种。三种字节编码方式如下所示小端编码大端编码混合编码抱歉这不是CAN协议支持的格式CANOE生成不了图片了只能以0x0A0B0C0D为例用表格表示一下吧0x0B | 0x0A | 0x0D | 0x0C什么是比特顺序其实比特顺序算是汽车行业的术语并不是很标准的一个定义用于表示一个信号在一段消息中占据的Bit位置。通常比特顺序分为正序和反序两种也就是通常当我们谈到八成计算机、通信协议、存储器等的Byte中的Bit的顺序时它都是正序的。而只有当我们谈到CAN协议时它才有可能是反序的。换句话说CAN信号也有可能使用正序的比特顺序毕竟它是人为定义的。以一个16Bit长的信号为例在大端编码的情况下如下展示两种比特顺序正序如图所示Sample_Signal_6从第15Bit开始到第0Bit结束。逆序也就是说Sample_Signal_6从第8Bit开始到第7Bit结束。这就变得在逻辑上有些奇怪了。目前为止我也没查到CAN协议为什么要选择逆序的比特顺序如果有知道原因朋友请不妨向我透露一下。熟悉CAN协议的同学可能也听说过Intel格式和Motorola格式。那么什么是英特尔格式Intel Order什么又是摩托罗拉格式Motorola Order小端编码格式被称为英特尔格式而大端编码格式也被称作摩托罗拉格式这两种说法是等价。不论采用哪一种格式字节编码在计算机系统中都是处于最底层的存在要么体现在内存中字节的排列、要么体现在通信线上的码流的字节顺序在现代计算机系统中自动就被处理了所以这一切对绝大多数程序开发人员来说是透明的。正因如此现在已经很少讨论为什么字节编码格式会和两家科技巨头的名字产生关系了。而且我搜索了许久发现中文世界主要是CAN总线工程师会用Intel格式和Motorola格式的说法却没人讨论这种说法的缘由。所以我决定对这个历史问题进行了一番探索。最早的计算机都是大端编码。1965年前后IBM在开发IBM System/360时使用了大端编码格式而后IBM开发出的一系列元祖级计算机System/370,、ESA/390、z/Architecture、Series/1等等都是继承了这一格式。所以大端编码为什么不叫“IBM格式”史前巨兽——IBM System/360在这一时期上古计算机大佬DEC在2002年被HP吞并开发出的PDP-10系列同样使用大端编码。可是接下来在生产16位机PDP-11系列时DEC却剑走偏锋使用了一种现在被称为“混合编码”的格式。现在我们已经很陌生了但是PDP-11可以说是那个时代最重要的计算机产品在生涯服役期间创下了60万台的销量一举为DEC打下计算机半壁江山。PDP-11的设计激发了Intel X86和Motorola的设计理念同时其搭载的操作系统部分设计也对MS-DOS产生了深远的影响。甚至现在大名鼎鼎的UNIX第一次正式亮相也是搭载在PDP-11系列上顺便证明了C语言在计算机编程的优越性。生涯销量60w台的PDP-11IBM为了与PDP-11竞争生产出同样是16位机的Series/1为了提升竞争力IBM决定把PDP-11的UNIX系统移植到Series/1上在这次的移植中人类第一次遭遇了字节编码差异产生的bug这就是著名的“NUXI问题”。IBM工程师最早移植的一段Unix函数中有本应一个打印一串“Unix”字符串的功能可是在实际运行时打印出的确实“nUxi”。这是因为在混合编码的PDP-11上“Unix”字符串在内存中的存储顺序为n | U | i | x系统在读取时做了字节顺序调整。可是在大端编码的Series/1上内存中顺序是本来就是:U | n | i | x系统用同样的方法调整字节顺序反而造成了错误。遇到NUXI问题的IBM Series/1其实虽然早期的IBM芯片使用的是大端编码但是后来在PowerPC时代使用的却主要是混合编码了。说完了IBM接下来聊一聊英特尔。那个计算机芯片军备竞赛如火如荼的时代英特尔还是场中名不见经传的参赛者。他们接到了一个重要的生意为CTCComputer Terminal Corporation早期PC大佬现在也只剩名字还流传了的Datapoint 2200供应芯片。这台Datapoint 2200是小端编码的计算机因此英特尔也用小端编码设计他们的8008。虽然8008的设计周期并没有赶上Datapoint 2200以至于2200不得不选用其他的替代方案但是8008经验却为Intel提供了宝贵的财产。黄金散热器和黄金PIN脚的Intel 8008首先Intel 8008的指令集在后继者——“网红爆款时代宠儿”——Intel 8080上被继承并且最终演化成为大名鼎鼎的x86指令集。其次小端编码在英特尔x86家族上被继承下来以至于直到现在最新的Intel x86或AMD64或x86-64家族的芯片上即使已经能够兼容大端和小端编码了但是实际上在最低层使用的仍旧是小端编码只是系统多增加了一步自动转换的操作。时代之子——8080同样拥有黄金散热器和PIN脚又说道摩托罗拉这边没什么特别的故事了。他们家的芯片直到变成Freescale为止都是以大端编码为主。现在Freescale都已经变成NXP了即使产品已经引入了ARM架构也和那个Motorola没关系了。至于ARM架构我们知道ARM是很“年轻”的芯片公司再加上他们只做设计不从事生产的经营模式产品没有那么多历史包袱。在ARM3之前都是小端编码而之后一直以混合编码为主导。讲到这里答案应很清晰了在计算机历史的长河里Intel始终是小端编码阵营的开拓者而Motorola的整个生涯都在大端编码的领土耕耘。所以现在人们把“Intel 编码”等同于小端编码而“Motorola 编码”等同于大端编码。可是AMD也是小端编码阵营的忠实信徒为什么没有“AMD 格式”的说法呢其实大端和小端或者说Intel格式或者Motorola格式像那个时代的很多设计方案一样并不是某种预知未来般的抉择仅仅是一种更具随机性的二选一。于是在机缘巧合之下一方选择了大端编码而另一方选择了小端却变成了一种传承或者执念。