Keil中取消结构体对齐的方法

Keil中取消结构体对齐的方法

我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下。

union {
	uint8_t tab[16];
	struct {
		uint8_t a;
		uint32_t e32; /* 为了突出结构体对齐问题,将其放到这里 */
		uint8_t b;
		uint8_t c;
		uint8_t d;
	}t;
}test;

for(uint32_t i = 0; i < 16; i++)
{
	tab[i] = (i << 4) | i;
}

但是,在给test.tab赋值之后,会因为结构体对齐原因读取到 “错误” 的test.t.e32,为了解决这个问题,我们要使用过__packed关键字取消结构体对齐,这里面还有坑。

/* 第一次用的时候我是这样用的 */
/* 找了半天不知道错误在哪 */
union {
	uint8_t tab[16];
	__packed struct {
		uint8_t a;
		uint32_t e32;
		uint8_t b;
		uint8_t c;
		uint8_t d;
	}t;
}test;

应该把__packedstruct后面(GNU Compiler)。
在这里插入图片描述
这样就可以解析到正确结果。
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值