【转载】51单片机data,bdata,idata,xdata使用注意事项

摘要:
“51 MCU编程在不同内存空间dataxdatabdata中定义变量的注意事项”:因此,只有经常使用或需要高操作速度的变量才能放置在数据区域中,其内存使用情况与全局变量相同;将所有未定义内存位置的变量放入扩展数据区域。c51中没有定义内存类型的通用指针,它需要3个字节;0000h~ffffh64k片外ram数据区编解码器:

"51单片机编程在不同内存空间data xdata bdata定义变量的注意事项":

关键词51 单片机 编程 不同 内存空间 data xdatabdata 定义 变量 注意事项

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 xdata bdata定义变量的注意事项

此文链接:http://www.makaidong.com/IT%E5%8D%9A%E5%AE%A2%E5%9B%AD/6774.shtml

转载请注明出处:51单片机编程在不同内存空间data xdata bdata定义变量的注意事项 - 博客园

免责声明:文章转载自《【转载】51单片机data,bdata,idata,xdata使用注意事项》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇unity客户端与c++服务器之间的简单通讯_1Java7 新特性 —— java.nio.file 文件操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jenkins邮件-使用变量定制化html邮件报告

jenkins当中邮件插件: Email Extension Plugin jenkins基本使用和邮件配置请参考测试派文章:http://testingpai.com/article/1609225132204 本文着重来讲解: 1)在邮件正文当中,引用邮件插件提供的变量 2)自定义邮件正文的html模板。 最终要达到的效果为: 第一步:查看Email...

C#连接六类数据库的代码集

本文列出了C#连接Access、SQL Server、Oracle、MySQL、DB2和SyBase六种不同数据库的程序源码和需要注意的点。 1.C#连接Access 程序代码: 1usingSystem.Data;2usingSystem.Data.OleDb;3..4stringstrConnection="Provider=Microsoft.Je...

C# DataTable.Select() 筛选数据

有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法, DataTable.Select(),其用法如下: Select() Select(string filterExpression) Select(string filterExpression, string sort) Select(string filterExpression,stri...

竞态与线程安全

竞态 对于同样的输入,程序的输出有时候正确而有时候却是错误的。这种一个计算结果的正确性与时间有关的现象就被称为竞态(RaceCondition) 导致竞态的常见原因是多个线程在没有采取任何措施的情况下并发更新、读取同一个共享变量。 竞态往往伴随着数据的脏读问题,即线程读取到一个过时的数据;丢失更新问题,即一个线程丢失数据所做的更新没有体现在后续其他线程对该...

python实现同时给多个变量赋值的方法 Simultaneous Assignments

Simultaneous Assignments x,y=y,x 这个赋值的执行流程是什么? python的多元赋值原理是tuple的元组封装 (tuple packing) 和 序列拆封(sequence unpacking)。 t = 12345, 54321, 'hello!' 这是元组封装 (tuple packing) 的例子,将多个值放进tu...

php 命名空间(要求php5.3以上)

要求php5.3以上 <?phpnamespace test;// 命名空间与目录类似功能,也可定义子命名空间,用分层的方式定义:/*namespace mydirokproject; 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前: */const...