51单片机RAM的使用

发布者:HeavenlyWonder最新更新时间:2015-10-29 来源: eefocus关键字:51单片机  RAM 手机看文章 扫描二维码
随时随地手机看文章
今天还是一个人加班,梳理一下之前一直疑惑的几个小问题吧。以一款51内核的STC89C52单片机作为说明,STC89C52具有8K字节Flash,512字节RAM,看门狗定时器等,其他资源不在今天讨论主题之内,不再赘述。
先说说自己之前的误区,以前提到片内RAM和片外RAM的时候,总是以为片内RAM就是52单片机512字节的RAM,片外RAM的扩展是很多经典单片机教材里都讲述的,P0口是地址低八位兼数据总线,P2是地址高八位,当扩展RAM的时候,WR,RD,ALE,P0,P2怎么怎么接,巴拉巴拉。。。但在此处,512字节的RAM并不是我原来认为的那样全部是内部RAM,事实上,它的前256Byte是真正的片内RAM,而后256Byte是集成的片外RAM。注意,它俩的访问方式是有区别的。下面进行说明:
 
typedef unsigned char uchar;
typedef unsigned int uint;
uchar i = 0;
uint j = 0;
uchar code table[] = {.....};
当时定义数据类型的时候,从来没想到过idata,bdata,pdata,xdata这些关键字是干什么的。
51单片机RAM的使用                                      图1.keil编译结果
这也就导致了每次编译完,总是会出现 xdata = 0 的字样,当时自己竟然没有深究它们是干什么的,更别说去看M51文件了。
另外,在keil的option->target的选项中,有一项Memory Model中有如下图2的三种模式,也是自己没注意过的。当然,这里也是与今天讲的主题相关的。
51单片机RAM的使用                                     图2.keil编译器设置
 
好,到此为止,大家应该明白了,idata,bdata,data,xdata,pdata这些关键字 以及编译器的相关选项都是与变量在内存中的分配有关系的。
1.片内256字节RAM已经足够容纳我们定义的所有变量,
一、当Memory Model选为small模式,这时,定义变量时,加不加idata,data这两个关键字,都不影响变量存储的位置(均存放在前256字节中)。但若这样使用:
uchar xdata i = 0; 
uchar pdata i = 0;
那么这个 i 便存放在了集成片外RAM中,xdata pdata存在读取速度上的差别。
二、当Memory Model选为compact或large模式, 这时定义变量时,如果不加关键词,即
uchar i = 0;
uint j = 0;
那么,i 与 j 是存放在集成片外RAM中的。此时,如果要将变量搬移到片内RAM,则要加关键字:
uchar idata i = 0;
uint idata j = 0;
或者
uchar data i = 0;
uint data j = 0;    //bdata支持位操作同时也将变量放在片内RAM
 
2.片内256字节RAM不够用时,一般我们就直接使用compact 或 large 内存模式了。
此时,我们首先使用 bdata idata data这些关键字,将大部分变量放在片内RAM区,剩下的变量无论是否使用xdata pdata关键字,他们都会放入集成片外256字节的RAM中。
那读者可能要问了,片内不够用了,如果我还是将Memory Model定义为small模式呢? 是啊,这时会出现什么情况呢。这时,如果合理使用bdata idata data xdata pdata这些关键字,也是可以按你的想法将变量分别放入片内RAM 和集成片外RAM的。 有一个问题,当前256字节够用 且选择small模式时,若没对定义的变量进行初始化,则他们默认为零。但在这里,如果还不进行初始化,那么变量的值是随机的,所以必须初始化。
 
最后,如果我有理解不对的地方,欢迎大家对以上提到的内容进行批评指正,大家交流中共同进步。
关键字:51单片机  RAM 引用地址:51单片机RAM的使用

上一篇:单片机的位定义
下一篇:关于51单片机中C语言编写的精确延时函数

推荐阅读最新更新时间:2024-03-16 14:37

51单片机RTL8019AS网卡驱动程序
SNMP网管板使用了RTL8019AS 10M ISA网卡芯片接入以太网。选它的好处是:NE2000兼容,软件移植性好;接口简单不用转换芯片如PCI-ISA桥;价格便宜2.1$/片(我的购入价为22元RMB/片);带宽充裕(针对51);较长一段时间内不会停产。8019有3种配置模式:跳线方式、即插即用P&P方式、串行Flash配置方式。为了节省成本,我去掉了9346而使用X5045作为闪盘存储MAC地址和其他可配置信息。P&P模式用在PC机中,这里用不上。只剩下跳线配置模式可用,它的电路设计参考REALTEK提供的DEMO板图纸。一天时间就可以完成,相对来说硬件设计比较简单。   与这部分硬件相对应的软件是网卡驱动。所谓驱动程序
[单片机]
<font color='red'>51单片机</font>RTL8019AS网卡驱动程序
8051单片机的中断发送
最近使用c8051做开发,串口程序移入工程时,整个程序竟然不跑了,加断点,调试,发现在串口查询发送出了问题,程序在查询发送完毕的时候,竟然死在这,就是while(TI0==0)这地方,用其它型号单片机没有这种情况,c8051F120单片机强大无比,但也复杂,用起来不顺手,下面就搜集了有关串口中断发送的资料,改为中断发送解决程序死的问题。 有关串口发送的程序例子: 假设要发送一组数据 Send 一般采用查询发送(循环发送)方式: unsigned char Send ; //发送量 unsigned char i; //循环量 for(i = 0; i 10; i++
[单片机]
labview深入探索------全局变量、局部变量与内存管理
很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因: 违背了数据流的编程 读取局部变量需要拷贝数据 不能象SUBVI一样可以重用数据BUFFER 不利于程序调试 容易引起竞争 我在论坛上看到很多初学者的程序,里面充满了大量的局部变量,可以这样说,当你使用了过多的局部变量的时候,你的程序结构是有问题的,在早期的LV版本中根本不存在全局变量和局部变量,同样可以编制规模很大的程序,这说明局部变量和全局变量并不是必须的,LV提供了它们是因为在特定的情况下可以简化编程。 当我们使用SUBVI时,我们需要定义一个连接器,包括输入输出端子,调用VI的数据从输入端子进入,当SUBVI未执行完毕时,数据是不会流出到
[测试测量]
labview深入探索------全局变量、局部变量与<font color='red'>内存</font>管理
延时20ms和1s的51单片机程序举例
试分别编写延时20ms和1s的程序。设fosc=6MHz。 参考答案: yh equ 20h yl equ 21h x equ 22h start: mov a,x mov dptr,#tab movc a,@a+dptr mov yh,a mov a,x add a,#1 movc a,@a+dptr mov yl,a here: sjmp here tab: dw 1,8,27,64,125,216,343,512,729
[单片机]
STM32定义堆栈地址到ram区顶部
本设置针对stm32f103rbt6的设置,该 芯片 RAM大小为20kB,故RAM区地址范围为0x20000000—0x20005000,芯片信息如下图所示; 第一步: 设置.sct文件; ;************************************************************* ; *** Scatter-Loading Descrip ti on Filegenerated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x0002000
[单片机]
STM32定义堆栈地址到<font color='red'>ram</font>区顶部
MSP430F4xxx小RAM堆栈溢出
前几天一个大学同学在线问我他最近搞项目开发时遇到的一个问题,跟他聊了聊。他最近在搞水表的计量开发,采用的平台是MSP430F4250(PS:很早之前去潍坊考察过一个做表的企业,发现搞表计量的大多都在用MSP430(貌似也有用STM8的),其中F4系列用的较多,一方面当然是考虑到功耗的问题,现在的表多是电池供电,一用就得用个一两年是必须的,还有就是F4系列自带段式液晶的驱动,并且支持差分的高分辨率A/D输入,这点蛮重要的,现在的高精度传感器貌似一色的差分输出),他遇到的问题是程序里某个变量经常性的会被意外改变,造成数据混乱,所以产品一直无法出货。 看到上面的问题,有经验的人很快就会意识的问题的所在,无非就是两种可能,一个是该变量
[单片机]
AT89S51单片机的详细资料介绍
很多初学51单片机的网友会有这样的问题:AT89S51是什么 书上和网络教程上可都是8051,89C51等!没听说过有89S51 ! 这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年推出的产品,典型产品有 8031(内部没有程序存储器,实际使用方面已经被市场淘汰),8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在, MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51,已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。 有
[单片机]
面对多核 “真”的就一定比“假”的好?
自从多核处理器渐成趋势之后,市场上关于多核处理器的真假辩论甚嚣尘上。争论的中心集中在两大多核巨头AMD和Intel身上。 AMD对它的4×4系统特别得意,号称是真四核,并说Intel处理器不是真四核。AMD想要撬开Intel四核处理器的散热外壳,以对照是否用一个硅片实现了四个核的封装。 Intel无法像AMD那样设计多核,有它自身的原因,它的处理器没有内置内存控制器,加上处理器之间的交流还需要通过芯片组实现,因而对Intel来说,在一个硅片上实现四个核封装是费力不讨好的事情。Intel自己也说,在制造上,以目前的工艺看,似乎“假”四核更有成本优势。 Intel自然有不好启齿的地方,它无法面对自己处理器架构设计稍微落后的窘境,
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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