一个简单问题,但我不会,请各位指点:

ghyd 2003-10-20 07:13:38
#define GPIO_BASE 0x40e00000
#define GPDRL (*((volatile ulong *)(GPIO_BASE+0x10)))
上边的那个定义是什么意思啊?
接下来有这么一句:
GPDRL |=0x00000380 这样用可以么?有没有语法错误?(我不是指 “|=”这个运算符)

********************************************************************

另外,假如有如下定义:
#define FFDLL 0x00

........
.........

FFDLL=0x80; 这样有没有什么错误啊 ??


请各位大哥指点,多谢了 !

...全文
52 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
scatzr 2003-10-22
  • 打赏
  • 举报
回复
GPDRL (*((volatile ulong *)(GPIO_BASE+0x10)))
常量+强制类型转化,
主要是强制类型转化,所以这样用。
你的假设是错误的。

这个是编译器在编译之前处理的。
nanfang1983 2003-10-22
  • 打赏
  • 举报
回复
这不是一个宏定义吗?
GPIO-BASE用0*40e00000代替
GPDRL用(*((volatile ulong *)(GPIO_BASE+0x10)))代替
有问题吗

playboyxp 2003-10-22
  • 打赏
  • 举报
回复
#define FFDLL 0x00

........
.........

FFDLL=0x80; 这样写有错
替换以后会使得左边没有变量可以赋值
编译不同过
北极猩猩 2003-10-21
  • 打赏
  • 举报
回复
GPIO_BASE是一个整数,使地址的基数,GPIO_BASE+0x10使该基址开始的0x10号地址(当然类型是整数)
((volatile ulong *)GPIO_BASE+0x10)将该地址数转换为一个指针;
(*((volatile ulong *)(GPIO_BASE+0x10)))则是取得这个地址所在的内存单元(可以用来赋值)
GPDRL |=0x00000380 就是将这个地址单元的内容同0x00000380进行异或。

至于第二个问题当然是不行的,进行了宏替换后就变成了这样
0x00 = 0x80
当然是错误的了
ghyd 2003-10-21
  • 打赏
  • 举报
回复
多谢上边的几位,但有谁能给我仔细的解释一下:(*((volatile ulong *)(GPIO_BASE+0x10))) 的含义啊 ?希望能一步一步的分析。
Jupin 2003-10-20
  • 打赏
  • 举报
回复
这是有关硬件编程的吧?

#define GPIO_BASE 0x40e00000
#define GPDRL (*((volatile ulong *)(GPIO_BASE+0x10)))
上边的那个定义是什么意思啊?
// 取某一内存空间或flash空间的值,并告诉编译器这个变量是可变的,每次都
// 要从原地址读出,而不是从寄存器读出。

接下来有这么一句:
GPDRL |=0x00000380 这样用可以么?有没有语法错误?(我不是指 “|=”这个运算符)
// 没有错误,GPDRL相当是一个变量,
********************************************************************

另外,假如有如下定义:
#define FFDLL 0x00

........
.........

FFDLL=0x80; 这样有没有什么错误啊 ??
// 这是错误的,因为前面把它定义为一个常量了,就不能改变它的值。
daizh 2003-10-20
  • 打赏
  • 举报
回复
对于你的假设:
#define FFDLL 0x00

........
.........

FFDLL=0x80; 这样有没有什么错误啊 ??
这样是错误的,FFDLL已经被定义位为常量,就不能再对它赋值。
ttlb 2003-10-20
  • 打赏
  • 举报
回复
up
daizh 2003-10-20
  • 打赏
  • 举报
回复
#define GPIO_BASE 0x40e00000
定义一个常量GPIO_BASE它的值位0x40e00000(这样应该表示地址)
#define GPDRL (*((volatile ulong *)(GPIO_BASE+0x10)))
定义一个宏GPDRL它取(GPIO_BASE+0x10)值的内容。(volatile ulong *)用与类型强制转换。
GPDRL |=0x00000380
实质上表示(*((volatile ulong *)(GPIO_BASE+0x10))) = (*((volatile ulong *)(GPIO_BASE+0x10))) | 0x00000380
企业实战持续集成-Jenkins视频教程(必备技能)软件版本:Jenkins 1.625 Linux零基础、初学者、中级运维、高级运维,让你轻松突破高薪20K+,通过本套实战课程的全程学习,能力跨越一个台阶,选择和努力决定薪资,向高级运维工程师迈进。通过本课程的学习,大家可以从懵懂到熟悉,从熟悉到熟练,能够在企业中熟练运用,同时在学习的过程中有任何不明白的地方,都可以向我咨询,我会积极帮助大家解决问题。   课程增值:    1、通过购买本课程你可以全套的有目标的学习企业必备运维知识,有目标有方向。    2、大家购买的不仅仅是一个课程,课程只是一种学习方式,免费加入会员群,你的所有问题都会在第一时间得到解答,实现真正的全程辅导。    3、能够得到全程的辅导,我会耐心的帮助大家,指导大家在工作和生活中积极向上,你会得到满满的正能量。    4、我教你的不仅仅技术,而且会教你做人做事的方法,让你受益一辈子,这才最重要的。   5、大家认真学习完整套课程,工作的机会是非常非常多,所以从现在起,就要努力提升自己的能力,有句话说的好:如果自己都不愿意动,别人还怎么帮助你,只要你动,我会协助和推荐你工作,分析在面试中的不足,然后改进,让你得到你真正想要的工作。进入BAT也是有可能的哦,一切还得取决于你。适合对象:本课程适合真正想改变,有决心有毅力,想通过技术改变自己,想学习的人,适合Linx初学者,Linux爱好者,Linux初级、Linux中级,以及想进一步发展为Linux高级资深运维工程师。学习条件:有一台自己的PC机、或者笔记本即可,能安装常用软件VMware等,能够主动学习。把学习当成自己的一回事。相信每位同学付出努力的同时,一定会有美好的结果,我们一起努力!学习宣言:我曾经经历过学习Linux的苦恼,没有人指点,进步慢如蜗牛,也是非常荣幸得到很多人的帮助和指导,所以今天想帮助真心想学习的朋友,少走弯路,用技术成就自己的梦想。讲课风格:Linux从入门到高级系列全部重点放在企业应用上面,课程主要针对互联网企业运维,因此不会花多余的时间去阐述无关紧要和企业用不到的东西,所以全程都是围绕实战运维,操作为主。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧