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 ()

不建議使用,因爲會佔用特別大的存儲空間:

使用前:
在這裏插入圖片描述
使用後:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章