原创 C51中data idata等的关系

2012-6-18 09:32 2707 12 13 分类: 消费电子

在用keil编写程序的过程中定义了两个全局数组变量,每个数组都是48个字节,加上原来的程序还占有一些字节,结果在编译时发现出错了:

*** ERROR L107: ADDRESS SPACE OVERFLOW

地址空间溢出,以前自定义变量没那么多,所以没有遇到过这样的问题。我又重新看了下使用的C8051F021的数据手册,发现RAM应该是4k多,为什么会出现这样的问题呢,上网搜下知道问题的原因了。

    网上有人说将keil中的memory mode改成compact就行了。

f.jpeg

    改成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的片内存储器组织

qf3.jpeg

也就是说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是什么样的理解?

文章评论1条评论)

登录后参与讨论

用户874192 2015-6-8 13:03

这个车如果在上海可以上牌,买一辆玩玩。不能上牌,销量会有问题。

用户1406868 2015-6-6 18:12

担心,风投都投认识的人,此波景气过后,多少人惨啊

用户1454308 2015-5-27 20:12

Good

用户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

由pdata表示的存储变量,编译后的指令的助记符也是MOVX,是对扩展存储器的访问,但间址是用@R0或@R1,只有8位,默认高8位地址由当前的P2锁存器的状态给出。如果所需扩充的存储器在256字节(1页)以内,可以不要高8位地址,于是P2被省下,可以做I/O。也可以P2由软件控制,实现多页控制,不同的P2值决定不同的一个页面。那么对同一个变量的访问,硬件上指向不同的页面的存储单元。
相关推荐阅读
用户1610197 2013-09-04 16:22
信号的上升时间和带宽及如何选择合适的示波器
用示波器测量信号时会涉及到信号的带宽与示波器的带宽这两个概念。下面就对这两个概念进行总结和概括。   带宽是对信号做傅里叶变换后得到的所有信号分量的频率范围。所以单一信号的带宽就是其频率对...
用户1610197 2013-04-03 16:15
单片机引脚读写操作
    自己总结下单片机引脚的用法。       使用单片机时肯定会用到单片机的IO引脚。以51单片机P1口为例。内部结构如图所示         当单片机进行写操作时,...
用户1610197 2012-08-28 11:27
共模与差模
    一直以来对共模和差模的了解非常模糊,不是很清楚,现在就总结下,来自网络,有不正确的地方希望大家一定要提出来,共同学习进步。       首先是共模信号和差模信号的定义,差模又称串模...
用户1610197 2012-08-22 23:23
滤波器的使用与设计
    在电子系统里滤波器是很见的组成部分,可以通过R,L,C的搭配组成各种滤波电路。一阶RC滤波器的截止频率等于1/2*pi*RC.,R,C,L串联可以搭建二阶带通滤波器等等。     ...
用户1610197 2012-07-20 15:01
Cadence出光绘文件总结
以前总结过出光绘文件的注意事项,现在重新总结下。 什么是Gerber文件     Gerber文件是所有电路设计软件都可以产生的文件,在电子组装行业又称为模版文件(stencil data),...
我要评论
1
12
关闭 站长推荐上一条 /2 下一条