【嵌入式-stm32】一次数据强制转换引起的思考(Mcu大小端模式)
通过对大小端数据存储的理解,明白了我手上mcu的存储器存储模式属于小端模式,所以在对该数据进行强制转换时会出现问题,强制转换时mcu会先认为该数据为32位数据,当强制转换最低字节的数据时会将原本32位数据的最低字节转出,而不是将memory对应地址中的数据读出。大端模式中地址的变化顺序(低到高)与数据的阅读顺序(高位到低位,如12345678我们会从高位开始读,即从左到右)想吻合。在对存储器中的数
一、问题:
某次,在对某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:大端存储(低地址在高位,高地址在低位)
更多推荐
所有评论(0)