搜索
bottom↓
回复: 10

请教结构体定义的一些问题【恢复】

[复制链接]

出0入0汤圆

发表于 2008-12-23 17:05:00 | 显示全部楼层 |阅读模式
最近学习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.

出0入0汤圆

 楼主| 发表于 2008-12-25 14:00:07 | 显示全部楼层
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地址啊,地址里面的东西?

出0入296汤圆

发表于 2008-12-27 19:19:14 | 显示全部楼层
to 【9楼】 robinyuan

    你看错文件了,请打开iom48v.h

出0入0汤圆

 楼主| 发表于 2008-12-27 13:32:30 | 显示全部楼层
没人理啊?

出0入0汤圆

发表于 2008-12-25 09:07:11 | 显示全部楼层
DDRC本身定义不是地址,DDRC是地址里面的东西,(*((volatile BYTEBIT *)&Addr)) 这里的Addr是变量,所以要加&,所以(*((volatile BYTEBIT *)&DDRC)) .BIT1是正确的,而# define PORTA (*( (volatile char *)0x3b) )这里的0x3b是一个常数。



注意在强制转换前有个*噶,说错了的话大家别K我喔-_-!

出0入0汤圆

 楼主| 发表于 2008-12-24 22:55:24 | 显示全部楼层
宏定义最终展开为   (*((volatile BYTEBIT *)&DDRC)) .BIT1  

DDRC加&取址符不理解,DDRC本身定义已经是地址了啊  /*此问题还是不明白*/  



这个是RD_UseBits.h文件里建议用的 # define PORTA (*((volatile char *)0x3b))  没有用&取址符 



Gorgon Meducer 可否回答这个问题?

出0入296汤圆

发表于 2008-12-24 22:00:10 | 显示全部楼层
to 【4楼】 gliet_su 

    眼见为实……

出0入0汤圆

发表于 2008-12-24 21:39:38 | 显示全部楼层
据说位域编译出来的汇编大,不知真假。

出0入0汤圆

 楼主| 发表于 2008-12-23 23:24:03 | 显示全部楼层
接受楼上的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.

出0入0汤圆

发表于 2008-12-23 23:08:37 | 显示全部楼层
把C语言从头到尾看一遍,OK?

出0入0汤圆

 楼主| 发表于 2008-12-23 23:01:55 | 显示全部楼层
最终展开为   (*((volatile BYTEBIT *)&DDRC)) .BIT1 

DDRC加&取址符也不是很明白,DDRC本身定义已经是地址了啊  /*此问题还是不明白*/ 



这个是RD_UseBits.h文件里建议用的 # define PORTA (*((volatile char *)0x3b))  没有用&取址符 

本贴被 robinyuan 编辑过,最后修改时间:2008-12-24,00:03:28.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 17:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表