C51编程在不同内存空间(data xdata bdata)定义变量的注意事项

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,不是很清楚,因为在微机的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 类调用情况_java 如何调用类?情况如下

本人目录如下:在surge目录下有一个java文件想创建一个LBChart2DFrameDemo对象,不知道如何创建?。注意:LBChart2DFrameDemo使用了Chart2D.jar包中内容。这个目录ClsChart2D尚未加在...本人目录如下:在surge目录下有一个…

BZOJ1085: [SCOI2005]骑士精神

【传送门:BZOJ1085】 简要题意: 有一个5*5的棋盘,棋盘上有12个白棋子,12个黑棋子,和一个空格,每只棋子只能按照马走日的规则移动,求出最少步数达到以下状态 题解: DFSA* DFS很容易做…

猎豹网校 java_猎豹网校Java 零基础入门 JAVA基础视频教程(精制)

00.NetBeans_下载和安装.mp4 01.Java_语言概述.mp402.Java标识符和关键字.mp403.Java_变量和基本数据类型.mp404.Java_简单数据类型转换和类包装.mp405.Java_算术运算符表达式.mp406.Java_关系运算符和逻辑运算符.mp407.Java_位_赋值_条件运算符.mp408.Java_基本语句和跳转语句…

获取实体表相关信息

ClassMetadata meta session.getSessionFactory().getClassMetadata(clazz);//实体名称String entityName meta.getEntityName();//主键名称String pkName meta.getIdentifierPropertyName();转载于:https://blog.51cto.com/javaworker/736018

软测第二周作业WordCount

一、Github地址: https://github.com/duwei1996/wc 二、PSP2.1表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 3030 Estimate 估计这个任务需要多少时间 3030 Development 开发 540900 Analysis …

hook java android_Android Hook Java的的一個改進版本

Hook Java的的一個改進版本《注入安卓進程,並Hook java世界的方法》這篇好文相信大家都看這,里面所提到的方法估計大家也都試過。不過里面的所用的方法,我發現有兩個可以改進的地方。改進點一:更簡單地修改java方法為本地方法.../…

VB6转换C#2010函数替换

VB6转换C#2010函数替换 VB6 ---------------->C#2010 1、InStr(strKey, " ")-->strKey.IndexOf(" ") InStr([start, ]string1, string2[, compare]) 返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中,从start开始找stri…

C#读写文本文件

C#中读写文本文件.txt文件既可以用File类也可用StreamReader、StreamWrite类。这两种方法都需要引用using System.IO命名空间。 下面分别给出例子: 1.File类写入文本文件: 1 private void btnTextWrite_Click(object sender, EventArgs e)2 …

java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...

如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式需求,项目A在服务器A上,需要重定向到服务器B上项目B,并且需要携带参数,参数对用户不可见,所以不可以将参数拼接在重定向url后面&a…

RichTextBox的使用

WPF里面虽然很多形式上跟Winform一样,但是控件的使用上面还是会有很多诧异。RichTextBox就是一个例子,是的,在WPF里面对这个控件可以做很多Winform很难做的效果出来。比如在对RichTextBox插入图片,winform时代除了用复制粘贴这种借…

前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS

对于富客户端的 Web 应用页面,自动登录、页面修改、抓取页面内容、屏幕截图、页面功能测试…面对这些需求,使用后端语言需要花费不少的精力才能实现。此时 SlimerJS、phantomJS 或 CasperJS 或许是更好的一种选择。 一、PhantomJS 和 SlimerJS PhantomJS…

java 封装 继承 堕胎_Java的继承、封装和多态

一、继承继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承的特性子类拥有父类非 private 的属性、方法。子类可以拥有自己的属性和方法,即子类…

HTML5学习笔记简明版(4):新元素之video,audio,meter,datalist,keygen,output

video 通过<video>标签&#xff0c;我们可以抛弃最近不怎么讨好的Flash&#xff0c;直接在页面中播放视频文件。视频文件自然是最符合语义化的文件格式&#xff0c;但该元素标签同样支持音频与图片。 过去(及目前)&#xff0c;我们通常要使用类似下面这样繁冗丑陋的代码来…

P2782 友好城市

题目描述 有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸&#xff0c;而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市&#xff0c;但…

五个在线图形工具创建简单的设计元素

有很多网站可以为图形元素生成提供服务&#xff0c;但获得非常好的工具并不容易。这就是为什么我共享五个在线的图形工具的原因 Logotype Maker 这是一个简单而自由的做标志的Web工具&#xff0c;它可以帮助您创建一个标志 BgPatterns BgPatterns按几次按键&#xff0c;做背景图…

java shape类_Java——Shape类

Description定义一个形状类Shape&#xff0c;提供计算周长getPerimeter()和面积getArea()的函数定义一个子类正方形类Square继承自Shape类&#xff0c;拥有边长属性&#xff0c;提供构造函数&#xff0c;能够计算周长getPerimeter()和面积getArea()定义一个子类长方形类Rectang…

sulin Python3.6爬虫+Djiago2.0+Mysql --实例demo

1.切换到项目目录下&#xff0c;启动测试服务器 manage.py runserver 192.168.0.108:8888 2.设置相关配置 项目目录展示如下&#xff1a; beauty>settings.py 修改 2.1 添加app到应用程序中 2.2 设置模板路径 2.3 配置数据为mysql 2.4设置静态文件路径 2.5设置漏油 3.beau…

dubbo的invoke命令_dubbo 调试服务telnet命令

1.概述在我们使用dubbo实现分布式布局时&#xff0c;如果我们想测试我们刚写好的service层服务是否正确时&#xff0c;通常要将service层和web层同时开启&#xff0c;通过浏览器调用controller层端口&#xff0c;达到测试service层的目的。有时&#xff0c;这样的测试方法过于麻…

18个不常见的C#关键字,您使用过几个?

18个不常见的C#关键字&#xff0c;您使用过几个&#xff1f;1、__arglist 让我们先从__arglist开始。 __arglist是用来给方法传送参数。通常我们是通过函数头部指定的参数列表给方法传递参数的。如果我们想要给方法传递一组新的参数&#xff0c;我们需要重载方法。如果我们想…

C指针详解

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运…