一、问题:

某次,在对某mcu flash进行操作时,在该地址写入数据 0x12345678

在这里插入图片描述

用该语句对数据进行读取时,发现读出的数值顺序反了,感觉很奇怪,之后发现可能是数据存储大小端模式的问题。

0x78 = ((volatile uint8_t)(0x00007E00+0))

0x56 = ((volatile uint8_t)(0x00007E00+1))

0x34 = ((volatile uint8_t)(0x00007E00+2))

0x12 = ((volatile uint8_t)(0x00007E00+3))

二、大小端:

大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
**加粗样式**

再结合一张图进行理解:

在这里插入图片描述

从上面表格、图可以看得出来,大小端的差异在于存放顺序不同

优缺点:

大端模式中地址的变化顺序(低到高)与数据的阅读顺序(高位到低位,如12345678我们会从高位开始读,即从左到右)想吻合。所以当沿着地址空间找到某个数据内存的时候,我们首先就可以根据他的内容的第一个字节来判断正负。

小端模式的优点:强制类型转化,如int(4字节)转化成short(2字节),直接可以取出前面的低位两字节。另一优点是CPU计算是从数据的低位到高位计算,效率高。所以当CPU从地址的低位到高位移动的时候,正好数据也是从地位到高位变化,计算高效。

三、结论:

通过对大小端数据存储的理解,明白了我手上mcu的存储器存储模式属于小端模式,所以在对该数据进行强制转换时会出现问题,强制转换时mcu会先认为该数据为32位数据,当强制转换最低字节的数据时会将原本32位数据的最低字节转出,而不是将memory对应地址中的数据读出。

四、解决方案

在对存储器中的数据进行强制转换时最好先将数据按原有类型读出,再用位移操作,将对应位数据取出,避免因为大小端产生问题。或者进行大小端数据的转换。

五、常见mcu的大小端

STM32:小端存储(低地址在低位,高地址在高位)

51:大端存储(低地址在高位,高地址在低位)

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐