51单片机data,bdata,idata,xdata使用注意事项

发布者:science56最新更新时间:2024-08-19 来源: cnblogs关键字:51单片机  data  bdata  idata  xdata  注意事项 手机看文章 扫描二维码
随时随地手机看文章

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。

2、data区内最好放局部变量。

因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;

3、确保你的程序中没有未调用的函数。

在keil c里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点keil c做得很愚蠢,但也没办法。

4、程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。

在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是:bdatabit ledstate;但位类型不能用在数组和结构体中。

5、其他不频繁用到和对运算速度要求不高的变量都放到xdata区。

6、如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。

7、当使用到指针时,要指定指针指向的内存类型。

在c51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为:char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。

单片机初学者一般对c51语言里的data,xdata,bdata,idata,code,不是很清楚,因为在微

 

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

机的c语言里根本没有这些东西,一下子出来难以让人接受,特别是没有硬件基本的朋友们.这也是写程序的时候经常犯错误的地方。请看下表 
普通51系列单片机存储空间资源分配情况

空间名称

地址范围

说明

datad:00h~7fh片内ram直接寻址区
bdatad:20h~2fh片内ram位寻址区
idatai:00h~ffh片内ram间接寻址区
xdatax:0000h~ffffh64k片外ram数据区
codec:0000h~ffffh64k片内外rom代码区
bank0~bank31b0:0000h~ffffh
:
:
b31:0000h~ffffh
分组代码区,最大可扩展32x64kb rom






下表是新型80c51单片机扩展空间的分配情况

空间名称

地址范围

说明

datad:00h~7fh片内ram直接寻址区
bdatad:20h~2fh片内ram位寻址区
idatai:00h~ffh片内ram间接寻址区
xdatax:0000h~ffffh64kb常规片外ram数据区
hdatax:0000h~ffffffh16mb扩展片外ram数据区
codec:0000h~ffffh64k常规片内外rom代码区
hconst(ecode)c:0000h~ffffffh16mb扩展片外rom常数区(对dallas390可用作代码区)
bank0~bank31b0:0000h~ffffh
:
:
b31:0000h~ffffh
分组代码区,最大可扩展32x64kb rom



单片机中关键字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

 


关键字:51单片机  data  bdata  idata  xdata  注意事项 引用地址:51单片机data,bdata,idata,xdata使用注意事项

上一篇:C51中断函数的写法
下一篇:单片机keil C中的data、bdata、idata、xdata、hdata、pdata、code解释

推荐阅读最新更新时间:2026-03-20 11:39

关于C51内的code idata data bdata pdata xdata
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。 code:64K片内片外ROM代码区 在51系列中data,Bdata,idata,xdata,pdata的区别 data:固定指前面0x00-0
[单片机]
51单片机idata,xdata,pdata,data的详解
data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 bit :是指0x20-0x2f的可位寻址区 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内存优化(data idata xdata
对 51 单片机内存的认识,很多人有误解,最常见的是以下两种 ① 超过变量128后必须使用compact模式编译 实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 ② 128以上的某些地址为特殊寄存器使用,不能给程序用 与 PC 机不同,51 单片机不使用线性编址,特殊寄存器与 RAM 使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用 RAM 空间。 由于内存比较小,一般要进行内存优化,尽量提高内存的使用效率。 以 Keil C 编译器为例,small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低 128 个字节,但这 128 个字节也不是全为我们的程序所用,
[单片机]
单片机中data,idata,xdata,pdata,code区别
很多 单片机 初学者甚至有些用老工程师对data,idata,xdata,pdata,code这些东西一直都搞不明白是怎么回事。最近看到一篇关于keil中data,idata,xdata,pdata,code的问题的文章,转过来跟大家分享一下! 从数据存储类型来说,8051系列单片机有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列单片机特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同
[单片机]
单片机基础:keil中data,idata,xdata,pdata,code区别
很多单片机初学者甚至有些用老工程师对data,idata,xdata,pdata,code这些东西一直都搞不明白是怎么回事。最近看到一篇关于keil中data,idata,xdata,pdata,code的问题的文章,转过来跟大家分享一下 从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL
[单片机]
关于51架构单片机中的BDATA
51架构的单片机都有一段可位寻址的区域,位于20H~2FH,总共128位。 在C51中编程时,分配的bit型变量以都会定位到这段区域里。 如果某个变量声明其存储类型为bdata型,例如bdata unsigned char xxx,则xxx会分配到位寻址RAM内, 此时xxx不但可以按照标准的无符号字符型访问,还能通过以下定义分别访问其每一个位: sbit abcd0 = xxx ^ 0; sbit abcd1 = xxx ^ 1; sbit abcd2 = xxx ^ 2; sbit abcd3 = xxx ^ 3; sbit abcd4 = xxx ^ 4; sbit abcd5 = xxx ^ 5; sbit
[单片机]
keil c51的内部RAM(idata)动态内存管理程序
  程序比较简单,但感觉比较有意思,个人认为有一定应用价值,希望大家有更好的思路和方法,互相促进。   程序的基本思路是:在CPU堆栈指针SP以上的RAM区域,通过把堆栈指针SP上移若干个字节,把空出的RAM区域供用户使用,当用户在使用完后又可以把该RAM区域释放。   头文件dmalloc51.h /* ********************************************************************************************************* * C51内部RAM动态内存申请函数 ,动态内存释放函数 * (c)
[单片机]
Keil C51对C语言的关键词扩展之十一: xdata
xdata声明的变量位于外部ram 64KB地址范围内某一位置。 程序示例: unsigned int xdata m=0; /* 声明一个全局变量,可位于外部ram 64KB地址范围内任意位置,由编译器决定 */ int main(void) { ...... }
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved