keil mdk+stm32的ac5和 ac6兩個編譯器下的字節對齊操作方法


最近在使用ac6.9的編譯器,編譯速度是真的很快,使用stm32的hal庫編譯速度也比ac5的編譯器快很多。
本文試驗stm32中字節對齊的代碼測試,主要是結構體,因為結構體中實際項目中用到最多,同時在仿真環境中打印出來。

ac5的測試結果:

#ifdef CC_ARM_AC5
//該方式只是使用ac5編譯器,結構體不對齊的方式1,結構體的長度,就是各個變量長度的和
__packed typedef  struct _li_st 
{
	uint8_t a;   //1個
	uint16_t b; //2個
	uint32_t c; //4個
	uint64_t d; //8個        
}li_st;

//ac5編譯器的結構體不對齊的方式2,結構體的長度,就是各個變量長度的和
typedef  struct _li_st_2 
{
	uint8_t a;   //1個
	uint16_t b; //2個
	uint32_t c; //4個
	uint64_t d; //8個        
}__attribute__((__packed__)) li_st_2;

//)到4字節,同樣可指定對齊到8字節。
typedef struct student_4B
{
    char name[7];		//7+1=8
    uint32_t id;		//4
    char subject[5];	//5+3=8
} __attribute__((aligned(4))) li_st_4B; 

#pragma pack (1) /*指定按1字節對齊方式3*/
typedef  struct _li_st_1B
{
	uint8_t a;   //1個
	uint16_t b; //2個
	uint32_t c; //4個
	uint64_t d; //8個        
}li_st_1B;
#pragma pack () /*取消指定對齊,恢復缺省對齊*/

#pragma pack (2) /*指定按2字節對齊*/
typedef  struct _li_st_2B
{
     char b;
     int a;
     short c;
}li_st_2B;
#pragma pack () /*取消指定對齊,恢復缺省對齊*/

測試結果如下:

 

 ac6的測試結果:

#elif (CC_ARM_AC6)

//ac6 ac5通用,的結構體不對齊方式,結構體的長度,就是各個變量長度的和
typedef  struct _li_st_ac6
{
	uint8_t a;   //1個
	uint16_t b; //2個
	uint32_t c; //4個
	uint64_t d; //8個        
}__attribute__((packed)) li_st_ac6  ;

//ac6 ac5通用,的結構體不對齊方式2,結構體的長度,就是各個變量長度的和
#pragma pack (1) /*指定按1字節對齊*/
typedef  struct _li_st_ac6_1B 
{
	uint8_t a;   //1個
	uint16_t b; //2個
	uint32_t c; //4個
	uint64_t d; //8個        
}li_st_ac6_1B;
#pragma pack () /*取消指定對齊,恢復缺省對齊*/


//ac6 ac5通用,下面的定義和8字節一樣的大小,主要看內存分布
#pragma pack (4) /*指定按4字節對齊*/
typedef  struct _li_st_ac6_4B 
{
	uint8_t a;   //1個 + 1
	uint16_t b; //2個 
	uint32_t c; //4個
	uint64_t d; //8個        
}li_st_ac6_4B;
#pragma pack () /*取消指定對齊,恢復缺省對齊*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM