热度 13
2012-6-18 09:32
2708 次阅读|
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是什么样的理解?