在51系列中data,idata,xdata,pdata的区别

发布者:EnchantedDreams最新更新时间:2016-07-27 来源: eefocus关键字:51系列  data  idata  xdata  pdata 手机看文章 扫描二维码
随时随地手机看文章
    dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。

 
     idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
 
     xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
 
     pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
 
     startup.a51的作用,和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char dATa xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。
 
    有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。
 
bit
    是在内部数据存储空间中 20H .. 2FH 区域中一个位的地址,这在DATA的20H以后以字节形式出现,可互相参照。另外加上8051 可寻址 的SFR,但刚刚试过,只是00H--7FH起作用,也就是说当数据有变化时颜色变红,以后的从80H到--FFH就不是位寻址区了,是位寻址的特殊寄存器,如涉及到了可位寻址的那11个当然会有反应。
    复位后,程序计数器PC的内容为0000H,内部RAM各单元的值不确定。各功能寄存器的复位值如下:堆栈指针SP的复位值为07H,累加器ACC、寄存器B的复位值为00H,数据指针DPTR的复位值为0000H,而p0、p1、p2、p3四个口的复位值为0FFH。其他SFR如PSW、TCON、TMOD、TL0、TH0、TL1、TH1的复位值也为00H。
 
wave
    中是低128字节和高128字节(0-7FH),低128字节是片内RAM区,高128字节(80-FFH)是SFR(特殊功能寄存器)bit则是位于低128字节的20H .. 2FH 区域,即data的20H .. 2FH 区域

code
    是在 0000H .. 0FFFFH 之间的一个代码地址。
我用
ORG     5000H
TAB:    DB      22H,3BH,43H,66H,5H,6DH,88H后,
CODE从5000H开始以后变成DB各位

data

    是在 0 到 127 之间的一个数据存储器地址,或者加 128 .. 255 范围内的一个特殊功能寄存器(SFR)地址。两者访问的方式不同。实际上由于PSW的复位设置PSW.3=RS0和PSW.4=RS1皆为0,所以通用工作寄存器区就是第0区,所以data的00--07H部分是与REG栏中的R0--R7对应的。以后的则仅代表低128字节的内部RAM。


idata
    是 0 to 255 范围内的一个 idata 存储器地址。
 
    idata与data重合低128字节,有的地方只有DATA表示256字节的片内RAM,
    xdata 是 0 to 65535 范围内的一个 xdata 存储器地址。
 
 
指针类型和存储区的关系详解

一、存储类型与存储区关系

     data     --->     可寻址片内ram
     bdata     --->     可位寻址的片内ram
     idata     --->     可寻址片内ram,允许访问全部内部ram
     pdata     --->     分页寻址片外ram (MOVX @R0) (256 BYTE/页)
     xdata     --->    可寻址片外ram (64k 地址范围FFFFH)
     code     --->    程序存储区 (64k 地址范围),对应MOVC @DPTR

二、指针类型和存储区的关系

     对变量进行声明时可以指定变量的存储类型如:
     uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。

     同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的
使用如:

     uchar xdata * data pstr

     是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用),
可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况。

     ......
     uchar xdata tmp[10];     //在外ram区开辟10个字节的内存空间,地址是外ram的0x0000-0x0009
     ......

     第1种情况:

     uchar data * data pstr;
     pstr="tmp";

     首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编
代码:

     MOV 0x08,#tmp(0x00)         ;0x08是指针pstr的存储地址

     看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在"*"号前的那个),所以按KeilC编译环境来说
就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的
默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。

     第2种情况:

     uchar xdata * data pstr;
     pstr = tmp;

     这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向
xdata区("*"前xdata关键字的作用)。编译后的汇编代码如下。

     MOV 0x08,#tmp(0x00)         ;0x08和0x09是在内ram区分配的pstr指针变量地址空间
     MOV 0x09,#tmp(0x00)

     这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。

     第3种情况:

     uchar xdata * xdata pstr;
     pstr="tmp";

     这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。

     MOV DPTR, #0x000A         ;0x000A,0x000B是在外ram区分配的pstr指针变量地址空间
     MOV A, #tmp(0x00)
     MOV @DPTR, A
     INC DPTR
     MOV A, #tmp(0x00)
     MOVX @DPTR, A

     这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。

     第4种情况:

     uchar data * xdata pstr;
     pstr="tmp";

     如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1 种情况一样这样也是有bug的,但是这次是把pstr分
配到了外ram区了。编译后的汇编代码如下。

     MOV DPTR, #0x000A         ;0x000A是在外ram区分配的pstr指针变量的地址空间
     MOV A, #tmp(0x00)
     MOVX @DPTR, A

     第5种情况:

     uchar * data pstr;
     pstr="tmp";

     大家注意到"*"前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是 “请跟我
来”,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗?为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51
编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!

     MOV 0x08, #0X01             ;0x08-0x0A是在内ram区分配的pstr指针变量的地址空间
     MOV 0x09, #tmp(0x00)
     MOV 0x0A, #tmp(0x00)

     注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了
呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间,对于没有声明指针指向存储空间类型的指针,
系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51 User's Guide。

     第6种情况:

     uchar * pstr;
     pstr="tmp";

     这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。

     MOV DPTR, #0x000A         ;0x000A-0x000C是在外ram区分配的pstr指针变量地址空间
     MOV A, #0x01
     MOV @DPTR, A
     INC DPTR
     MOV DPTR, #0x000A
     MOV A, #tmp(0x00)
     MOV @DPTR, A
     INC DPTR
     MOV A, #tmp(0x00)
     MOVX @DPTR, A

     这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。

关键字:51系列  data  idata  xdata  pdata 引用地址:在51系列中data,idata,xdata,pdata的区别

上一篇:51单片机抗干扰技术
下一篇:Keil C51与标准C比较

推荐阅读最新更新时间:2024-03-16 15:01

基于AT89C51系列单片机和霍尔传感器实现测控系统的设计
近年来,随着传感器技术的不断发展,特别是单片机技术的广泛应用,采用单片机与PC机构成的小型传感器测控系统越来越多。因为它们很好地结合了单片机的价格低,功能强,抗干扰能力好,温限宽和面向控制等优点及Pc机操作系统中Windows的高级用户界面、多任务、自动内存管理等特点。在这种测控系统中,单片机主要进行实时数据采集及预处理,然后通过串行口将数据送给PC机,PC机再对这些数据进一步处理,例如求均值、方差、画动态曲线与计算给定、打印输出的各种参数等任务。 这里采用霍尔传感器作为前端进行数据采集,然后在单片机控制下进行A/D转换,并将信号通过串口送给PC机进行绘图处理。 1 系统介绍 系统可以分为3个部分。第一部分是信号源,由霍尔
[单片机]
基于AT89C<font color='red'>51</font><font color='red'>系列</font>单片机和霍尔传感器实现测控系统的设计
Proteus--51系列汇编
l 单键控制多灯延时闪烁 延时子程序 ORG 0000H ; 程序开始 MAIN: MOV C,80H ;P0.0口的状态传递给位累加器C JNB 80H,GUAN ;按位操作;按P0.0口的状态为0获得跳转,否则顺序执行 MOV P1,#00H ;按P0.0口为1,得到顺序执行本指令;p1,p2,p3全部置低电平 MOV P2,#00H MOV P3,#00H ACALL DELAY ; 调延时子程序 GUAN : 按P0.0口的状态为0获得的跳转执行指令 子程序 CPL C
[单片机]
Proteus--<font color='red'>51</font><font color='red'>系列</font>汇编
MCS-51系列单片机指令快速记忆方法
随着微电子技术和超大规模 集成电路 技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、 汽车电子 、通信、智能仪器仪表)得到了广泛的应用。学习、使用 单片机 的人越来越多,而生产单片机的厂家很多,单片机种类繁杂,不知如何选择。据统计,八位单片机占全球单片机销量的65%。在八位单片机中,Intel公司的8051单片机内核已成为8位单片机事实上的标准。因此,对初学者而言,选择8051单片机来学习不失为明智的选择。    学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。MCS-51共有111条指令,现介绍我们总结出的快速记忆MCS-51指令
[单片机]
C8051F系列单片机的低功耗技术分析与设计
在控制终端系统设计中,当系统要求整体功耗偏低时, C 8051F 系列单片机是一个最佳的选择。它们拥有灵活的时钟硬件,使系统能够方便地在高效运作模式与低功耗模式问进行转换,智能的电源管理模式能够在正常工作及待机状态自由切换,从而降低整个系统的能量损耗;当工作频率低于 10kHz 时,时钟丢失检测器 (MCD) 能够引发系统产生复位,确保系统工作的安全可靠。 1 C 8051F 各部分组件的功耗 当一个系统对功耗要求严格时,可以在硬件电路建立前首先粗略计算一下整个系统所需的功耗。由于 C 8051F 系列单片机为数模混合 SOC 系统,能够实现整个设计的大部分功能,因此整个设计系统的功耗将主
[单片机]
51单片机系列知识1--单片机的内外结构
一、单片机的典型结构 0.(《单片机MCS—51原理及应用开发教程》晁阳。清华大学出版社) 1、 单片机的内部结构 中央处理器 存储器 内部总线 I∕O接口 并行接口 穿行接口 中断系统 特殊功能部件 时钟电路 布尔处理器 定时器∕计数器 A∕D、D∕A转换器 直接存储器访问通道DMA.PWM.WDT ①内部总线:内部总线是CPU连接片内主要部件的纽带,是各类信息传送的公共通道。内部总线主要由3种不同性质的连线组成,分别是地址线、数据线、控制线。地址线主要用来传送存储器所需要的地址码和外部设备的设备号,通常由C
[单片机]
兆易创新重磅发布首款GD32W515系列产品,12月量产供货
11月25日,兆易创新官微发布消息称,公司正式发布基于Arm® Cortex®-M33内核的GD32W515系列Wi-Fi微控制器。 全新MCU具备领先的基带和射频性能,内置TrustZone架构打造安全数据存储的硬件可信赖执行环境,并且延续了GD32 MCU家族的软硬件完美兼容性。 GD32W515系列产品以增强的处理能力和丰富的集成特性为智能家居、工业物联网、消费类电子等各类应用场景提供无线连接的开发之选。目前,该系列产品已经开始提供样片,并将于12月正式量产供货。 (GD32W515系列Cortex®-M33内核Wi-Fi MCU) 领先的射频性能和丰富的集成资源 据介绍,GD32W515系列MCU持续采用最新的Arm
[手机便携]
Keil C51对C语言的关键词扩展之七: data
8051单片机内部256字节RAM,低128字节既可直接寻址,又可间接寻址,高128字节RAM只能间接寻址(直接寻址方式下,高128字节被映射到SFR特殊功能寄存器)。内部RAM中包含16字节可位寻址区域,该区域起始地址为20H。 内部RAM存储区被分为三种不同的存储区类型:data,idata,bdata。 1)data指低128字节,以直接寻址方式访问存在该区域的变量。 2)idata指全部256字节,该存储类型编译后的代码以间接寻址方式访问内存。 3)bdata指16字节可位寻址区,该区域地址范围为20H-2FH。使用bdata能够定义可位寻址的变量。 汇编语言内部RAM直接寻址方式,示例: MOV A,10H /* 将
[单片机]
MCS51系列单片机软件抗干扰技术中的误区介绍
单片机中存在这样一种广泛流传的误解:在MCS-51系列单片机中,只要用指令使程序从起始地址开始执行,就可以复位单片机,摆脱干扰。通过一个简单的实验,揭示了软件复位的可靠方法。   有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved