5101|21

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

地址怎么得到? [复制链接]

#define U1RBR           (*((volatile unsigned char *) 0xE0010000))



volatile unsigned char   *ptr;

ptr =&U1RBR;

指针得到的不是0xE0010000

怎么才能得到 0xE0010000 这个地址呢?

最新回复

使用强制类型转换就可以得到指针了。 #define U1RBR           (*((volatile unsigned char *) 0xE0010000)) volatile unsigned char   *ptr; ptr =&U1RBR; LZ的这段程序貌似有错。。。 改成: #define U1RBR           ((volatile unsigned char *)0xE0010000)) volatile unsigned char   *ptr; ptr = U1RBR; 或者: #define U1RBR           (*((volatile unsigned char *) 0xE0010000)) volatile unsigned char   *ptr; ptr =*U1RBR; 试试看!  详情 回复 发表于 2007-4-1 13:30
点赞 关注

回复
举报

51

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
#define U1RBR           (*((volatile unsigned char *) 0xE0010000))
这个是宏,它只是在编译的预处理期就被替换掉了,而且只是简单的文本替换

对于你的程序来说,0xE0010000它只是一个常数,常数是没有地址的,只不过它被强制定义成一个指针类型,并按指针运算进行操作罢了

要取到它的值,以下方式即可
ptr =U1RBR;
相当于把一个指针赋给了另一个指针...
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ptr =&U1RBR

在KEIL 里这个是可以取到地址的...
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

4
 
我是ads1.2  
如果
ptr =U1RBR;
提示
implicit cast of non-0 int to pointer
如果
ptr =&U1RBR
不报错 地址不对
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
#define U1RBR           (*((volatile unsigned char xdata *) 0xE001))

void main()
{
     volatile unsigned char xdata* ptr = NULL;

    ptr = &U1RBR;

        (*ptr)++;
        *ptr = U1RBR + 1;

    while(1)
    {
         ;
    }
}

晕哈,在KEIL下,必须指定指针指向区域方能正确得到地址.
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
我是ads1.2  不行
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
ADS1.2是什么单片机的开发平台?

那试试看直接初始化看看?

volatile unsigned char   *ptr = 0xE0010000;

要不你再看看你编译器的文档...
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
这个还是可以解释的嘛

注意这个定义
#define U1RBR (*((volatile unsigned char *) 0xE0010000))

它定义的U1RBR并不是一个强制类型转换的指针,而是表示 一个强制类型转换指针所指向的地址的值 的表达式(注意那个星号哦),那么对这个表达式取地址,取出来的结果是0xE0010000,也是可以理解的……
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
顺便问一下,什么叫“必须指定指针指向区域方能正确得到地址”?

如果楼主没有得到0xe0010000,也许跟这个有点关系。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
yzx1983(捕风捉影) ( ) 信誉:100    Blog  2007-03-27 17:15:54  得分: 0  


   顺便问一下,什么叫“必须指定指针指向区域方能正确得到地址”?

这个就跟具体的环境有在KEIL C51中,
  

通用指针为三个字节:
第一个字节为:指向的区域类型.00为IDATA 01为XDATA,FF为CODE
后面两个为地址

在我没有确定PTR的类型的时候,默认来处理是错误的!!
PTR得不到E001,只得到了00

指针相同的类型后,就OK了!!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
能不能解释得再详细一点……

比如“第一个字节”,是从低位地址开始数还是从高位地址开始数

“通用指针是3字节”,那对于一个32位指针变量赋值,高8位总是为0 ?

如何确定PTR的类型?确定后可以得到E0010000?这不是4字节么?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
我和楼主的平台不一样哈...

所以,我刚刚说让LZ关注一下他的平台,而且再看看编译器的文档..

 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢大家回答 我就是 想的到 U0IIR   的地址 0xE000C008  但是 我的ads1.2 得不到值 得到的是个@   就是 (0x40)

例如 已经定义好了
#define U0IIR           (*((volatile unsigned char *) 0xE000C008))

#define U1IIR           (*((volatile unsigned char *) 0xE0010008))
等等
如何写一个函数 让多个串口初始化都调用一个函数呢?
init()
{
U0IIR = 0x07;
U1IIR = 0x07;
}这样可行但是
我想实现写成
init( 传递地址 )
{
传递地址 = 0x07;
}   
在多串口时 不用重复的都写出来.  
我问过见
http://community.eeworld.net/Expert/topic/5414/5414691.xml?temp=2.965945E-02
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

14
 

Keil里好这句好像必须加
#define U1RBR       (*((volatile unsigned char *) 0xE0010000))
属于那个区域
Xdata,data,pdata,
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

15
 
LZ这个就用宏来做..

#define INITURLT(ARG)\
{\
    ARG = 0x07;\
}

试试这种技巧.呵呵
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 
有必要这么麻烦吗???????????????
volatile unsigned char   *ptr = (volatile unsigned char *) 0xE0010000;

不就可以了!


 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

17
 
丢!没仔细看!
弹片机的指针比较麻烦,和PC不一样
不同“类型“有不同的字节存储!

========================================================
lbing7(楼主,别再给我非专家分!谢谢合作)

通用指针为三个字节:
第一个字节为:指向的区域类型.00为IDATA 01为XDATA,FF为CODE
后面两个为地址

在我没有确定PTR的类型的时候,默认来处理是错误的!!
PTR得不到E001,只得到了00

指针相同的类型后,就OK了!!
============================================================
正解!
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

18
 
#define U1RBR           (*((volatile unsigned char *) 0xE0010000))
volatile unsigned char   *ptr;
ptr =&U1RBR;

ptr = U1RBR;为什么报错,因为U1RBR是一个volatile unsigned char类型的数据,而ptr为一指针变量,把一个字符型数据赋给指针类型不匹配,所以报错.你可以改为ptr =(volatile unsigned char *)U1RBR;当然这就与你使用它的目的就不同了.在ADS1.2下,ptr =&U1RBR;使用是没有错的
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

19
 
ptr =&U1RBR;
U1RBR=0x07;
然后看看*ptr的值是什么吧
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
怎么才能得到 0xE0010000 这个地址呢?
U1RBR 的值就是 0xE0010000 了 直接 ptr =U1RBR; 就行了....
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表