tag 标签: xdata

相关博文
  • 热度 25
    2014-4-21 14:22
    1205 次阅读|
    0 个评论
    unsigned char xdata *P说明指针指向的对象是一个处于Xdata的元素,比如数组. xdata unsigned char *p表明指针本身位于Xdata,至于指向什么类型的地址,自由变换.  
  • 热度 18
    2013-8-1 13:23
    4749 次阅读|
    1 个评论
    由于51内核的资源有限,所以在进行程序编写时常会出现下列内存区关键字,如XDATA,DATA,CODE,IDATA,PDATA等等,具体意思请参阅Keil相关帮助文档。   假如我们想在XDATA区初始化数组时,就可能会出现程序没有初始化之前是可以运行的,但初始化之后就不能运行了。这也是我遇到的一个问题,明明程序是对的,怎么就不能运行了呢?原因就是我在程序里在XDATA区初始化了128bytes的数组。有人可能觉得初始化128bytes的数组后程序怎么可能不会运行了呢?难道是超过了XDATA区的范围了吗?当初我也这么想过,于是在XDATA区声明了一个同样大小的数组但没有初始化值,但程序同样是能运行,这说明并不是超范围的原因,因为编译后的XDATA区的大小远小于DATASHEET中给出的大小,将这一数组换成关键字CODE后同样可以运行,一时间真是没有明白。经过上论坛求助,网友给出的说法是当你在程序开头时在XDATA区初始化大量数组时,由于XDATA区的寻址较慢而C8051F单片机的看门狗复位时间又较短,于是还没有初始化完成程序就已经复位了,同样经过调试器的帮助发现确实我的128个字节并没有全部初始化成功,只有一小部分是成功的,后部分是乱码,同样也验证了网友的这一说法,网友给出的解决方法是在51的启动文件STARTUP.A51中事先就将WDT关闭,由于很多人都忘记了51的汇编所以给出例子,在STARTUP.A51中需要加入的语句是STARTUP1:   EXTRN CODE(SysInit)                     // SysInit是主程序中的函数,里面应该关闭WDT。   CALL SysInit   通过这种方式就事先关闭了WDT,经过重新编译下载,程序正常运行。个人觉得51分出众多的内存区确实比较麻烦·!  
  • 热度 13
    2012-6-18 09:32
    2737 次阅读|
    1 个评论
    在用keil编写程序的过程中定义了两个全局数组变量,每个数组都是48个字节,加上原来的程序还占有一些字节,结果在编译时发现出错了: *** ERROR L107: ADDRESS SPACE OVERFLOW 地址空间溢出,以前自定义变量没那么多,所以没有遇到过这样的问题。我又重新看了下使用的C8051F021的数据手册,发现RAM应该是4k多,为什么会出现这样的问题呢,上网搜下知道问题的原因了。     网上有人说将keil中的memory mode改成compact就行了。     改成compact或large确实可以了,那么为什么呢? Compact(紧凑模式)使用的是pdata而large使用的是xdata.small用的是data。这里就涉及到了c51中ram的存储方式。     经常涉及到的有以下几种存储类型 data     ---     可寻址片内ram bdata     ---     可位寻址的片内ram idata     ---     可寻址片内ram,允许访问全部内部ram pdata     ---     分页寻址片外ram (MOVX @R0) (256 BYTE/页) xdata     ---    可寻址片外ram (64k 地址范围FFFFH) code     ---    程序存储区 (64k 地址范围),对应MOVC @DPTR 下面是C8051F021的片内存储器组织 也就是说data和idata在内部数据地址空间内,一个是低128字节,idata能访问整个256个字节,这里面的寻址方式不同。而pdata和xdata是在外部数据地址空间里的。     small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低 128字节,但这 128 个字节也不是全为你程序所有,寄存器 R0-R7必须映射到低RAM,要占去 8 个字节,如果使用寄存组切换,占用的更多。所以一般来说只可以使用 data 区最大为 120 字节,超出 120 个字节则必须用 idata指定为间接寻址。如果数据更多超过了256个字节,则必须要用到外部数据地址空间了。 data: 直接寻址,速度快,常用的变量尽量放在这里 固定指前面0×00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idata: 间接寻址,类似指针 固定指前面0×00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)     Pdata暂时还不是很清楚,在keil中说是256个外部数据地址空间,在程序中实际测试发现如果都定义成pdata型变量,超过256字节确实程序编译不通过。 xdata: XRAM外部扩展的RAM区域。外部扩展RAM,一般指外部0×0000-0xffff空间,用DPTR访问。 pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。 此外,在keilc中不能使用位数组。 不知道大家对pdata是什么样的理解?