最近在使用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 () /*取消指定對齊,恢復缺省對齊*/