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

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; 这样有没有什么错误啊 ??


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

...全文
49 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

69,368

社区成员

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

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