偶尔发现STM32小端格式的证据
- 今早做调试过程中,对一个6字节的大数进行运算后放回数组中,发现数组中数据的排列是反着的,开始很诧异,仔细分析下便知怎么回事。
- 大致代码如下:
void my_function(uint32_t SrcAddr)
{
long long temp_plusval = 0X333333333333;
uint32_t lower_val = temp_plusval & 0XFFFFFFFF;
uint8_t p_data[20] = {0};
...
temp_plusval |= SrcAddr+ lower_val;
memmove(&p_data[10], &temp_plusval, 6);
...
}
- 调试结果:
![调试结果](https://i-blog.csdnimg.cn/blog_migrate/2f93ebc2d994449d7ab5a0468d658c3a.png#pic_center)
- 从图可以看出,计算后的
temp_plusval
值为0X333337337333
,而使用memmove
后在数组中排列是反着的,箭头方向是我们习惯读数值的方向,这就是因为STM32的存储模式是小端格式的。
- 数据0x12345678存储格式
大端格式:
低地址 <---- 0x12 | 0x34 | 0x56 | 0x78 ----> 高地址
小端格式:
低地址 <---- 0x78 | 0x56 | 0x34 | 0x12 ----> 高地址
memmove
在C中的实现,归根结底都有这些语句:
void *memmove(void *dest, const void *src, size_t count)
{
...
if(...)
{
...
*dest++ = *src++;
...
}
else
{
...
*dest-- = *src--;
...
}
}
- 可以看到从
src
取出的数据直接给了dest
,再把指针向后偏移。 也就是函数中把temp_plusval
的值0X333337337333从低地址处先取出了0x33放到p_data[10]
处,偏移后是0x73放到p_data[11]
,再0x33,0x37,0x33,0x33,最终就看到了数组中的结果。 - 借此记录,我对小端格式更加直观的一次经历。