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),再高位的呀。