例说MCU的端模式
2015-05-28
端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。
下表说明了一个32位的数据在大端模式及小端模式下按字节存储的先后顺序(HH表示32位数据的最高字节,LL则为最低字节):
由上表可以看出,在大端模式中,一个多字节数据按从高字节到低字节的顺序存储,而在小端模式中则相反。在实际应用当中,不同的处理器采用的端模式也不一样,为了让大家更简单地理解以及引起大家足够的重视,下面我分别以STM32F103和STM8S103K4来做一个简单的实验。
定义一个结构体类型如下图:
在STM8S105K4中编写如下程序:
[说明]: 以上只是工程中截取的部分代码,完成的工程在附件当中,附件地址在审核后将会在文章回贴中提供给大家。
仿真结果-端模式转换前直接进行结构体到数组的内存复制的结果:
仿真结果-端模式转换后进行结构体到数组的内存复制的结果:
在STM32F072中编写如下程序(结构体定义与前文所述一致):
[说明]: 以上只是工程中截取的部分代码,完成的工程在附件当中,附件地址在审核后将会在文章回贴中提供给大家。
仿真结果-端模式转换前直接进行结构体到数组的内存复制的结果:
仿真结果-端模式转换后进行结构体到数组的内存复制的结果:
由以上实验我们通过对比STM8S105K4和STM32F072在未进行端转换前内存复制的结果得出结论:
1. STM8S105K4采用的是大端模式,即32位或16位数据按照从高字节到低字节的顺序存储在内存当中。
2. STM32F072采用的是小端模式,即32位或16位数据按照从低字节到高字节的顺序存储在内存当中。
由此也证明了前文中的说法,不同的处理器采用的端模式可能不一样。也正因为此,我们在编写某些外部设备驱动的时候或者有关通信协议的驱时应该把端模式考虑进去,要进行转换可以参考下面的代码:
当然,你可以选择不进行端模式的转换,而直接通过按字节的方式来存储,但这样的话很多时候会大大地降低您代码的效率,这里就不多作解释了。
[特别说明]: 在上文及上文的图中有些地方注释说的是端模式的转换,并不是指把MCU的端模式进行转换。