打印

edn没有讨论出答案的帖子,转发一下,大家讨论

[复制链接]
1593|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
王居士|  楼主 | 2008-11-22 18:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#1 楼主:求教,C51地址定义和范围的问题 
贴子发表于:2008-11-14 16:51:44


请教各位大哥,51系列的单片机,看到以下程序
#define PBYTE    ((unsigned char *)0x10000L)
#define Addr1    PBYTE[0x01]                
unsigned char pdata * idata RPCBuf=&Addr1;     

这几行代码是什么意思?能不能使用RPCBuf[]的数组

51系列的单片机地址范围不是到FFFFH吗(64K的片外地址空间)
,为什么第一行的代码是0x10000L?如果我定义的地址超出范围,会有什么问题?


#2 个人判断 高手指导
贴子回复于:2008-11-18 11:27:03


由于unsigned char *)0x10000L,没有xdata ,片内外统一编址,所以 PBYTE的地址为



0x10000-片内ram,这样可利用PBYTE[]  片外最后的ram空间。



小弟初学,可能有错,请各前辈批评指教阿。



#3 没写错?
贴子回复于:2008-11-19 23:12:27


0x10000L,表示PBYTE的绝对地址是在idata的0x00;



#define Addr1    PBYTE[0x01]               // 在片内idata地址0x01处定义为变量Addr1,以后给这个变量赋值,就是给这个地址赋值    




unsigned char pdata * idata RPCBuf=&Addr1;     //在片内定义一个idata的指针RPCBuf指向变量Addr1



这几条能运行?怎么感觉怪怪的,idata的0x01不是通用寄存器吗



不知道说的对不对,好久没编程了,以上的内容楼主作个参考吧

相关帖子

沙发
王居士|  楼主 | 2008-11-22 19:23 | 只看该作者

大家研究一下吗

顶一下

使用特权

评论回复
板凳
ayb_ice| | 2008-11-22 21:01 | 只看该作者

我来解释一下

#define PBYTE    ((unsigned char *)0x10000L)
#define Addr1    PBYTE[0x01]                
unsigned char pdata * idata RPCBuf=&Addr1; 

第一句是说把地址0x10000L强行转换成指向unsigned char的指针,
第二句和第一句有关,就是把PBYTE当然数组,指数组的0x01成员,亦即数组的首地址是0x10000L
第三句就是不用解释了。。。

其实整个有点错误,pdata 没有0x10000L这么大的地址范围。。。

使用特权

评论回复
地板
zalin| | 2008-11-22 22:31 | 只看该作者

C51的通用指针

因为51的地址空间比较多,所以KEIL和IAR等一些编译器都有三字节的通用指针

使用特权

评论回复
5
王居士|  楼主 | 2008-11-23 15:39 | 只看该作者

再问

楼上能否再详细一点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

0

粉丝