因为需要将 7位地址位 和 1位读写标志位 进行组合,想到了用 struct 和 union 的方法。
说明:作为自己测试用,使用硬件STM32F407ZET6
本篇文章仅对位段操作再ARM芯片上存储空间位置分配的探究,供给作为需要确定位段操作分配内存位置要求的参考。
位段
此位段操作涉及到一个很重要的问题:位段中的成员在内存中是从左向右分配还是从右向左分配。
用《C和指针》书上的例子:
在32位的处理器上,这个声明将根据下面两种可能的方法创建ch1。
位段的内存分配
期待分配情况:
情况一:
union{
struct{
unsigned Data : 8;
_Bool WR : 1;
unsigned Addr : 7;
}Reg;
uint8_t Bytes[2];
}write_data;
write_data.Reg.Addr = 0x20; //0100 000;
write_data.Reg.WR = 1;
write_data.Reg.Data = 0xF0; //1111 0000;
printf("write_data.Bytes[0]:%x\r\n",write_data.Bytes[0]);
printf("write_data.Bytes[1]:%x\r\n",write_data.Bytes[1]);
打印信息:
内存分配情况:
11110000 01000001
情况二:
union{
struct{
_Bool WR : 1;
unsigned Addr : 7;
unsigned Data : 8;
}Reg;
uint8_t Bytes[2];
}write_data;
write_data.Reg.Addr = 0x20; //0100 000;
write_data.Reg.WR = 1;
write_data.Reg.Data = 0xF0; //1111 0000;
printf("write_data.Bytes[0]:%x\r\n",write_data.Bytes[0]);
printf("write_data.Bytes[1]:%x\r\n",write_data.Bytes[1]);
打印信息:
内存分配情况:
01000001 11110000
情况三:
union{
struct{
unsigned Addr : 7;
_Bool WR : 1;
unsigned Data : 8;
}Reg;
uint8_t Bytes[2];
}write_data;
write_data.Reg.Addr = 0x20; //0100 000;
write_data.Reg.WR = 1;
write_data.Reg.Data = 0xF0; //1111 0000;
printf("write_data.Bytes[0]:%x\r\n",write_data.Bytes[0]);
printf("write_data.Bytes[1]:%x\r\n",write_data.Bytes[1]);
打印信息:
内存分配情况:
10100000 11110000
情况四:
union{
struct{
unsigned Data : 8;
unsigned Addr : 7;
_Bool WR : 1;
}Reg;
uint8_t Bytes[2];
}write_data;
write_data.Reg.Addr = 0x20; //0100 000;
write_data.Reg.WR = 1;
write_data.Reg.Data = 0xF0; //1111 0000;
printf("write_data.Bytes[0]:%x\r\n",write_data.Bytes[0]);
printf("write_data.Bytes[1]:%x\r\n",write_data.Bytes[1]);
打印信息:
内存分配情况:
11110000 10100000