请教结构体定义的一些问题【恢复】
最近学习Gorgon Meducer贡献的PS2协议的文件请教关于RD_UseBits.h里面结构体定义的一些问题
* 8位变量位映射 *
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
}BYTEBIT;
这个结构体中
BIT1:1是啥含义,没有找到下一层的宏定义了,0:1中冒号是啥意思?C里面没见到这个定义 /*此问题已经解决*/
我理了一下宏
# define SET_BIT8_FORMAT(Addr) (*((volatile BYTEBIT *)&Addr))
# define DDR_PC1 DDRC_BIT.BIT1
最终展开为 (*((volatile BYTEBIT *)&DDRC)) .BIT1
DDRC加&取址符也不是很明白,DDRC本身定义已经是地址了啊 /*此问题还是不明白*/
这个是RD_UseBits.h文件里建议用的 # define PORTA (*((volatile char *)0x3b)) 没有用&取址符
本贴被 robinyuan 编辑过,最后修改时间:2008-12-24,00:02:54. DDRC本身定义不是地址,DDRC是地址里面的东西
***********************************************
是不是啊,我从m169def.inc文件翻出来的
.equ PORTD = 0x0B
.equ DDRD = 0x0A
.equ PIND = 0x09
.equ PORTC = 0x08
.equ DDRC = 0x07
.equ PINC = 0x06
.equ PORTB = 0x05
.equ DDRB = 0x04
.equ PINB = 0x03
.equ PORTA = 0x02
.equ DDRA = 0x01
.equ PINA = 0x00
DDRC明明是个0x07地址啊,地址里面的东西? to 【9楼】 robinyuan
你看错文件了,请打开iom48v.h 没人理啊? DDRC本身定义不是地址,DDRC是地址里面的东西,(*((volatile BYTEBIT *)&Addr)) 这里的Addr是变量,所以要加&,所以(*((volatile BYTEBIT *)&DDRC)) .BIT1是正确的,而# define PORTA (*( (volatile char *)0x3b) )这里的0x3b是一个常数。
注意在强制转换前有个*噶,说错了的话大家别K我喔-_-! 宏定义最终展开为 (*((volatile BYTEBIT *)&DDRC)) .BIT1
DDRC加&取址符不理解,DDRC本身定义已经是地址了啊 /*此问题还是不明白*/
这个是RD_UseBits.h文件里建议用的 # define PORTA (*((volatile char *)0x3b)) 没有用&取址符
Gorgon Meducer 可否回答这个问题? to 【4楼】 gliet_su
眼见为实…… 据说位域编译出来的汇编大,不知真假。 接受楼上的BS,赶紧搜索了一通,发现。。。。
唉 我只学过C的皮毛,所以......
贴出来,对自己一个交代
理解C语言位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
本贴被 robinyuan 编辑过,最后修改时间:2008-12-24,00:04:01. 把C语言从头到尾看一遍,OK? 最终展开为 (*((volatile BYTEBIT *)&DDRC)) .BIT1
DDRC加&取址符也不是很明白,DDRC本身定义已经是地址了啊 /*此问题还是不明白*/
这个是RD_UseBits.h文件里建议用的 # define PORTA (*((volatile char *)0x3b)) 没有用&取址符
本贴被 robinyuan 编辑过,最后修改时间:2008-12-24,00:03:28.
页:
[1]