keilv6編譯器位元組對齊
㈠ 怎麼看keil編譯器定義的數據類型佔多少位
辦法1:直接在代碼中,使用sizeof運算符,例如a=sizeof(int),那麼a的值就是int的長度。
辦法2:編譯成功後,打開.map文件(或.m51),查找SYMBOL
例如:
00000036H SYMBOL DATA BYTE temp
00000037H SYMBOL DATA BYTE temp2
temp,temp2是變數名,00036H是變數起始地址,DATA表示在data區,BYTE表示變數是BYTE型的,也就是一個位元組。你可以通過不同變數的地址差來計算長度。
㈡ keil編譯器中如何使代碼位元組對齊
tab 鍵縮進,可以設置自動縮進,寫得代碼好看,有靠你自己!
㈢ ARMClang6.1編譯優化導致的訪問不對齊異常
keil-project-options for target-選項卡c/c++ 左側中間有個optimization 後面的對應的就是編譯優化設置 level 0就是不優化
㈣ 怎麼佔一個位元組
KEIL
C直接支持位定義功能,不用這么麻煩
單個位定義
bit
flag;
bit
b;
if(flag)....
b
=
flag;
組合方式
char
bdata
my_flag;
sbit
flag0
=
my_flag^0;
sbit
flag1
=
my_flag^1;
sbit
flag2
=
my_flag^2;
...
my_flag
=
3;
if(flag0){
...
}
㈤ keil軟體里有位元組對齊設置項嗎
如果你說的是【自動縮進】,這個只有IAR裡面有Ctrl + T.
如果你說的是換行對其,Keil和IAR裡面都有。
Keil系列教程:
http://blog.csdn.net/column/details/13472.html
IAR系列教程:
http://blog.csdn.net/column/details/13696.html
㈥ __attribute__ ((__packed__)); 怎麼用
1. __attribute__是GNU C對標准C語法的擴展,是GNU C的一大特色,可以用於設置函數的屬性,變數的屬性,類型的屬性
packed屬性:使用該屬性可以使得變數或者結構體成員使用最小的對齊方式,即對變數是一位元組對齊,對域(field)是位對齊。
使用該屬性對 struct或者union類型進行定義,設定其類型的每一個變數的內存約束。當用在 enum類型定義時,暗示了應該使用最小完整的類型 。
下面的例子中,x成員變數 使用了該屬性,則其值將緊放置在a的後面:
struct test
{
char a;
int x[2] __attribute__ ((packed));
};
像下面的結構體,結構體的長度,就是各個變數長度的和
struct student
{
char name[7];
uint32_t id;
char subject[5];
} __attribute__ ((packed));
下面的 例子中,my-packed-struct類型的變數數組中的值將會緊緊的靠在一起,但內部 的成員變數s不會被「pack」,如果希望內部的成員變數也被packed,my- unpacked-struct也需要使用packed進行相應的約束。
struct my_packed_struct
{
char c;
int i;
struct my_unpacked_struct s;
} __attribute__ ( (__packed__) );
2. __packed是進行一位元組對齊。使用_packed一般會以降低運行性能為代價,由於大多數cpu處理數據在合適的位元組邊界數的情況下會更有效,packed的使用會破壞這種自然的邊界數。
typedef struct1
{
char x;
int y;
}struct1;
typedef __packed struct2
{
char x;
int y;
}struct2;在32位的ARM SDT編譯器中
sizeof(struct1)值為8
sizeof(struct2)值為5;
㈦ STM32 M3內核 keil編譯器,位域定義中在前面的是放在低位的還是高位的
是最低位, 一般存放數據默認都是位元組內低位對齊呀。
就像你定義一個8位數據A,若A取值范圍為0~1,那就是A的bit0位可能為0、可能為1,而其他位均固定為0;若A取值范圍為0~3,那A的bit0、bit1位是可0、可1,而其他位固定為0不變。。。。。
同樣道理,在1個位元組內的位段,存放佔位時也是先低位(bit0),再高位的呀。