CPU架构决定大小端模式_cpu架构与大小端的关系-CSDN博客
常见处理器大小端_大端系统有哪些-CSDN博客
大端存储、小端存储
端序(英语:Endianness),又称字节顺序,又称尾序,在计算机科学领域中,指存储器中或在数字通信链路中,组成多字节的字的字节的排列顺序。
大小端存储的关系主要涉及数据在内存中的存储方式,这与处理器的设计密切相关。大小端存储指的是多字节数据类型(如整数、浮点数)在内存中的字节排列顺序。不同的处理器架构可能采用不同的存储模式。例如,Intel的x86系列处理器通常使用小端存储模式。
在进行跨平台通信时,必须考虑到存储模式的问题,因为不同架构的计算机之间进行数据交换时,如果不进行适当的字节序转换,可能会导致数据解读错误。
- 大端存储(Big-Endian):在大端模式下,数据的高位字节(最重要的字节)存放在内存的低地址处,而低位字节(最不重要的字节)存放在高地址处。这种方式直接对应于人类通常书写数值的方式,例如十六进制数0x1234,在大端模式下,内存中的布局就是0x12在前(低地址),0x34在后(高地址)。
- 小端存储(Little-Endian):在小端模式下,数据的低位字节存放在内存的低地址处,而高位字节存放在高地址处。这意味着,当从低地址开始读取时,最先读到的是数据的低位字节。
小端,低地址低字节;大端,低地址高字节
处理器存储模式
ARM架构的处理器默认使用小端模式(Little-Endian),但有些处理器支持大端模式(Big-Endian)并可以通过配置进行切换。以下是一些支持大端模式的ARM处理器:
- ARM Cortex-A系列:许多Cortex-A系列处理器支持大端模式。
- ARM Cortex-R系列:一些Cortex-R系列处理器也支持大端模式。
- ARM Cortex-M系列:ARM Cortex-M系列处理器默认使用小端模式。不过,Cortex-M系列处理器也支持大端模式(Big-Endian),可以通过配置进行切换。STM32 默认是小端模式的,STM8 是大端。
大端和小端存储的优缺点
小端存储的优点
- 简化读取操作:当处理器读取小于其原生字长的数据时,低位字节总是在最低的地址,这使得读取操作更为简单。例如,如果只需要读取一个32位整数的最低16位,可以直接从最低地址开始读取两个字节,而不需要关心整个32位数的其余部分。
- 高效的数值运算:CPU做数值运算时可以从内存中按顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效。
- 简化数据转换:内存的低地址处存放低字节,所以在强制转换数据类型时不需要调整字节的内容。
大端存储的优点
- 直观性:大端存储方式符合人类的直观认识,即高位优先。因此,对于有符号整数和浮点数的表示,大端存储可以更容易地解释为十进制数。
- 符号位判断:符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小。
- 网络通信:大端存储方式在网络通信中具有优势,许多网络协议(如TCP/IP)规定数据必须是高位先行,这样可以确保不同设备之间的兼容性和通信的一致性。
高位先行MSB 、低位先行LSB
传输位序一般用于描述串行设备的传输顺序。网络协议中只有数据链路层的底端会涉及到。
高位先行即在传输一个字节的时候先传输高位msb;低位先行即在传输一个字节的时候先传输低位lsb。高位先行和低位先行是针对串行数据传输方式来说的。常见的串行传输方式有串口(UAR)、I2C、SPI等。以串口传输方式为例,标准的串口传输方式是低位先行,芯片在通过TX引脚发送数据时,依次发送位0、位1……位7。
协议类型 | 协议名称 | 备注 |
---|---|---|
小端序(先传低位) | RS-232 | |
RS-422 | ||
RS-485 | ||
USB(串口) | ||
以太网 | 虽然高字节先传,但每一字节内低位先传 | |
大端序(先传高位) | I2C协议 | |
SPI协议 | ||
摩尔斯电码 |
高位先行(Most Significant Bit first)
高位先行(MSB先行)是指在数据传输过程中,数据的最高有效位(Most Significant Bit,即数值最大的那一位)首先被发送。这种设计在许多串行通信协议中被采用。
高位先行的优势
- 提前了解数据大小:在处理大量数据时,接收方可以更早地知道传输的数据的大致大小,从而更有效地进行数据处理。
- 标准化和兼容性:许多标准化的通信协议规定了高位先行,这样可以确保不同设备之间的兼容性和通信的一致性。
- 数据传输的正确性和效率:采用高位先行可以确保数据传输的正确性和效率,特别是在需要严格遵循协议规范的情况下。
低位先行(Least Significant Bit first)
低位先行(LSB先行)是指在数据传输过程中,数据的最低有效位(Least Significant Bit,即数值最小的那一位)首先被发送。这种设计在一些串行通信协议中被采用。
低位先行的优势
- 与存储方式一致:许多处理器内部采用小端模式存储数据,因此在数据传输时使用小端先行可以减少数据转换的开销。
- 简化硬件设计:在某些硬件设计中,小端先行可以简化数据传输和处理的逻辑。
单片机内的小端先行和传输的大端先行
STM32单片机内部使用的小端先行(Little-Endian)存储方式和ISP(In-System Programming)中数据通常先发送高位(MSB先行)并不冲突。这两者是在不同的上下文中应用的。
小端先行是指在单片机内部,多字节数据类型的存储方式,即数据的低位字节存储在低地址处。而ISP中的MSB先行是指在串行数据传输过程中,数据位的发送顺序,即数据的最高有效位(MSB)先发送。
在进行ISP编程时,通常会有一个协议转换过程,将单片机内部存储的数据按照串行通信协议的要求进行位顺序的调整。因此,尽管单片机内部的数据是以小端方式存储的,但在通过串行接口发送时,可以按照协议规定的MSB先行方式发送数据。这样的设计允许单片机与外部设备或编程工具之间进行有效的数据交换,同时保持内部数据处理的效率。
总的来说,小端先行和MSB先行是两种不同的概念,分别应用于内部数据存储和外部数据传输,它们各自适用于不同的场景和需求,但在实际应用中可以通过适当的转换来兼容。这种灵活性是现代微控制器设计中的一个重要特点。
字节序、比特序
- 字节序主要用于描述多字节数据在内存中的存储顺序和传输顺序,常见于处理器架构和网络协议中。
- 比特序主要用于描述单个字节内比特的排列顺序,常见于串行通信协议中。
字节序(Byte Order)
字节序指的是多字节数据在内存中的排列顺序。主要有两种类型:
- 大端序(Big-Endian):最高有效字节(Most Significant Byte, MSB)存储在内存的低地址处。
- 小端序(Little-Endian):最低有效字节(Least Significant Byte, LSB)存储在内存的低地址处。
//大端序
地址: 0x00 0x01 0x02 0x03
数据: 0x12 0x34 0x56 0x78
//小端序
地址: 0x00 0x01 0x02 0x03
数据: 0x78 0x56 0x34 0x12
字节序类型 | 解释 |
---|---|
CPU字节序 | 指处理器在内存中存储多字节数据的顺序。小端序(Little-Endian)和大端序(Big-Endian)是两种常见类型。 |
外部Bus字节序 | 指外部总线在传输多字节数据时的顺序,由总线协议定义。 |
设备字节序 | 指外部设备在传输和存储数据时的字节顺序,通常遵循其支持的协议的字节序。 |
网络协议字节序 | 指网络协议在传输数据时使用的字节顺序,大多数网络协议采用大端序。 |
Ethernet协议字节序 | 指以太网协议在传输数据时的字节顺序,采用大端序。 |
IP协议字节序 | 指IP协议在传输数据时的字节顺序,采用大端序。 |
编译字节序 | 指编译器在生成代码时使用的字节顺序,编译器根据目标处理器的字节序生成相应的代码。 |
比特序(Bit Order)
比特序指的是单个字节内比特的排列顺序。主要有两种类型:
- MSB先行(Most Significant Bit first):最高有效位(Most Significant Bit, MSB)存储在字节的最低位。
- LSB先行(Least Significant Bit first):最低有效位(Least Significant Bit, LSB)存储在字节的最低位。