实际体会STM32的小端格式

偶尔发现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);
	...
}
  • 调试结果:
    调试结果

  • 从图可以看出,计算后的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,最终就看到了数组中的结果。
  • 借此记录,我对小端格式更加直观的一次经历。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kx_Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值