KeilのMDK + STM32バイトAC5とアライメント動作方法AC6 2つのコンパイラで

最近ac6.9コンパイラの使用は、コンパイル速度が非常に速く、コンパイラAC5よりHAL STM32ライブラリのコンパイル速度を使用して、本当に速いです。
試験本明細書STM32バイト整列されたコードのテストは、構造は、主にシミュレーション環境で同時に印刷最も使用される項目の実際の構造。

AC5テストの結果:

CC_ARM_AC5の#ifdef 
AC5コンパイラ、1以外//この実施形態では、構造体の構造体の長さは方法を整列していない、変数のそれぞれの長さであり
__packed _li_stのtypedef構造体
{ 
	// 1番目; uint8_t A 
	uint16_tのB; // 2 
	uint32_t C; // 4ヶ月
	uint64_tをD; // 8ヶ月         
} li_st; 

構造// AC5コンパイラ2は、構造の長さ方法に位置合わせし、各変数の長さは、そのされていない
のtypedef構造体_li_st_2 
{ 
	uint8_t。 1件の@ 
	uint16_tのB; // 2番目
	のuint32_tにC; // 4番目
	uint64_tをD; // 8番目         
}属性は、__ __((__ packed__))li_st_2; 

//)4バイトに、同じ8バイトに整列して指定することができ。
構造体student_4Bのtypedef 
{ 
    文字名[7]; // + 1 = 8 7。
    のuint32_tのID; // 4。
    チャー件名[5]; // + 3 = 8 5。。
} __attribute __((整列(4))。)li_st_4B。

#pragmaパック(1)/ * 1バイトアライメントとして指定3 /。
typedefは構造体_li_st_1B 
{ 
	A uint8_t; // 1番目
	uint16_tのB; // 2番目
	のuint32_t C; // 4番目
	uint64_tをD; // 8番目         
li_st_1B}; 
の#pragmaパック()/ *割り当て解除整列し、デフォルトのアラインメントを復元* / 

の#pragmaパック(2)/ 2 *バイトアライメントで指定* / 
typedefは構造体_li_st_2B 
{ 
     チャーB; 
     INT A、
     ショートC; 
} li_st_2B; 
の#pragmaパック()/ *割り当て解除揃え、デフォルトの配置を復元します* /

次のようにテスト結果は以下のとおりです。

 

 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 () /*取消指定对齐,恢复缺省对齐*/

 

おすすめ

転載: www.cnblogs.com/CodeWorkerLiMing/p/12076701.html