在用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是什么样的理解?
用户874192 2015-6-8 13:03
用户1406868 2015-6-6 18:12
用户1454308 2015-5-27 20:12
用户1648374 2015-5-27 17:41
用户1430619 2015-5-27 12:59
用户1667805 2015-5-27 12:42
用户1702976 2015-5-27 11:06
用户1090372 2012-8-31 15:36