地址怎么得到?

qxb 2007-03-27 02:35:05
#define U1RBR (*((volatile unsigned char *) 0xE0010000))



volatile unsigned char *ptr;

ptr =&U1RBR;

指针得到的不是0xE0010000

怎么才能得到 0xE0010000 这个地址呢?
...全文
576 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
somosky 2007-04-01
  • 打赏
  • 举报
回复
使用强制类型转换就可以得到指针了。
#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;
试试看!
tyj_3 2007-03-30
  • 打赏
  • 举报
回复
楼上,你再仔细分析一下,如果U1RBR 的值就是0xE0010000,还能对U1RBR赋值吗!
darkrainbow 2007-03-30
  • 打赏
  • 举报
回复
怎么才能得到 0xE0010000 这个地址呢?
U1RBR 的值就是 0xE0010000 了 直接 ptr =U1RBR; 就行了....
tyj_3 2007-03-30
  • 打赏
  • 举报
回复
ptr =&U1RBR;
U1RBR=0x07;
然后看看*ptr的值是什么吧
tyj_3 2007-03-30
  • 打赏
  • 举报
回复
#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;使用是没有错的
lbing7 2007-03-28
  • 打赏
  • 举报
回复
LZ这个就用宏来做..

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

试试这种技巧.呵呵
梅名智 2007-03-28
  • 打赏
  • 举报
回复

Keil里好这句好像必须加
#define U1RBR (*((volatile unsigned char *) 0xE0010000))
属于那个区域
Xdata,data,pdata,
wantieee 2007-03-28
  • 打赏
  • 举报
回复
丢!没仔细看!
弹片机的指针比较麻烦,和PC不一样
不同“类型“有不同的字节存储!

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

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

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

指针相同的类型后,就OK了!!
============================================================
正解!
wantieee 2007-03-28
  • 打赏
  • 举报
回复
有必要这么麻烦吗???????????????
volatile unsigned char *ptr = (volatile unsigned char *) 0xE0010000;

不就可以了!


qxb 2007-03-28
  • 打赏
  • 举报
回复
谢谢大家回答 我就是 想的到 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.csdn.net/Expert/topic/5414/5414691.xml?temp=2.965945E-02
lbing7 2007-03-27
  • 打赏
  • 举报
回复
我和楼主的平台不一样哈...

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

yzx1983 2007-03-27
  • 打赏
  • 举报
回复
能不能解释得再详细一点……

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

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

如何确定PTR的类型?确定后可以得到E0010000?这不是4字节么?
lbing7 2007-03-27
  • 打赏
  • 举报
回复
yzx1983(捕风捉影) ( ) 信誉:100 Blog 2007-03-27 17:15:54 得分: 0


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

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


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

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

指针相同的类型后,就OK了!!
yzx1983 2007-03-27
  • 打赏
  • 举报
回复
顺便问一下,什么叫“必须指定指针指向区域方能正确得到地址”?

如果楼主没有得到0xe0010000,也许跟这个有点关系。
yzx1983 2007-03-27
  • 打赏
  • 举报
回复
这个还是可以解释的嘛

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

它定义的U1RBR并不是一个强制类型转换的指针,而是表示 一个强制类型转换指针所指向的地址的值 的表达式(注意那个星号哦),那么对这个表达式取地址,取出来的结果是0xE0010000,也是可以理解的……
lbing7 2007-03-27
  • 打赏
  • 举报
回复
ADS1.2是什么单片机的开发平台?

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

volatile unsigned char *ptr = 0xE0010000;

要不你再看看你编译器的文档...
qxb 2007-03-27
  • 打赏
  • 举报
回复
我是ads1.2 不行
lbing7 2007-03-27
  • 打赏
  • 举报
回复
#define U1RBR (*((volatile unsigned char xdata *) 0xE001))

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

ptr = &U1RBR;

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

while(1)
{
;
}
}

晕哈,在KEIL下,必须指定指针指向区域方能正确得到地址.
qxb 2007-03-27
  • 打赏
  • 举报
回复
我是ads1.2
如果
ptr =U1RBR;
提示
implicit cast of non-0 int to pointer
如果
ptr =&U1RBR
不报错 地址不对
lbing7 2007-03-27
  • 打赏
  • 举报
回复
ptr =&U1RBR

在KEIL 里这个是可以取到地址的...
加载更多回复(1)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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