MSP430之共用体中结构体字节对齐问题

MSP430之共用体中结构体字节对齐问题

先上代码:
我所用的平台的字节对齐默认是2字节,下面之间的变量定义为7个字节,为了保证2字节对齐,Power变量就会自动扩展一个字节,但是变量类型又是一个字节,所以发生了字节偏移的情况。

typedef union _PARARW{
	struct{
		UINT8 Name[24];
		///////////////////////////////
		UINT8 Read;
		UINT8 Start;
		UINT8 Stop;
		UINT8 Alarm;
        UINT8 Unit;
       // UINT8 Nothing;//字节对齐填充
		UINT8 Display;
		UINT8 Power;
		////////////////////////////////
		UINT16 Sample;
		UINT32 Record;
		UINT32 Delay;
		SINT16 Limit1H;
		SINT16 Limit1L;
		SINT16 Limit2H;
		SINT16 Limit2L;
		SINT16 Shift1;
		SINT16 Shift2;
		UINT16 Verify;
		UINT8 Blank[9];
	}Item;
	UINT8 Array[64];
}PARARW;

#pragma location = "INFOC"
const UINT8 ParaRWSec[64] = {
  'A','B','C','C','D','E','F','G',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',	// 24 User Name
  ' ',' ',' ',' ',
  READ_HOLD,									// 01 Read
  START_IMME,									// 01 Start
  STOP_FIFO,									// 01 Stop
  BUZZER_OFF,									// 01 Alarm
  CENTIGRADE,									// 01 Unit
 // 0x00,				//字节对齐填充
  DISPLAY_NORMAL,								// 01 Display
  POWER_NORMAL,								    // 01 Power
  0x0a,0x00,									// 02 Sample Interval
  0x3c,0x00,0x00,0x00,							// 04 Record Interval
  0x00,0x00,0x00,0x00,							// 04 Start Delay
  0xb0,0x04,									// 02 Ch1 Limit (1200)
  0x70,0xfe,									// 02 Ch1 Limit (-400)
  0xe8,0x03,									// 02 Ch2 Limit (1000)
  0x00,0x00,									// 02 Ch2 Limit (0)
  0x00,0x00,									// 02 Ch1 Shift (0)
  0x00,0x00,									// 02 Ch2 Shift (0)
  0x00,0x00,									// 02 Check Sum
  0,0,0,0,0,0,0,0,0};							// 9 Reserved

可以看到,共用体中Array地址在0x24E和0x24F分别为0x00和ox0a(假设对应一个u16变量temp16),MSP430为小端模式,高位字节存在高地址,
Power后面扩展出的一个字节就是存储在 0x24F(高地址)上对应的0x0a,也就是temp16的高位。
而Power类型是UINT8,强制转换后,Power变量就是temp16的低位0x00;
同理,后面的变量依次偏移,所以造成了数据混乱;

在这里插入图片描述
在这里插入图片描述

解决办法很简单,就是增加一个变量完成对齐,不要让编译器去自动对齐。
另外,和共用体一起使用并初始化赋值才会出现这种问题,就是说你定义的变量和自定义的数据区域没有对应起来,单独使用结构体的自动对齐只会有结构体大小的差异,不会造成混乱。

至于强制对齐,
#pragma pack (1) //成对使用
#pragma pack ()

不建议使用,因为会占用特别大的存储空间:

使用前:
在这里插入图片描述
使用后:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值