前几天群里有一位同学使用AT89S51这个单片机编程,遇到了一个情况:keil软件的options for Target的Target选项中,其中的Memory Model选项,同样的程序,如果选择Small模式进行编译,把程序下载到单片机内,程序就工作正常;如果选择Large模式进行编译,下载到单片机内程序就工作不正常,这个就是新手偶尔遇到,但是很难分析出原因的内存使用溢出问题。


51单片机的问题,是历史问题,比较复杂,那现在一般一些新型单片机这种问题就简单一些,但是也得注意关于RAM的溢出问题。RAM是用来保存临时数据的,一旦我们的使用量超过了RAM的大小或者区域,那就可能造成一些不可预知的错误问题。

51单片机的RAM分为片内和片外,标准的51内核是0x00~0x7F一共128B,而现在的大多数半导体厂商开发的51系列单片机都带了扩展片内RAM,即片内RAM区域一般是从0x00到0xFF一共256B。随着功能需求越来越多,程序量越来越大,那片内这256B也不够用了,因此又扩展了片外RAM,片外RAM的预留比较大,最大可以从0x0000到0xFFFF一共64KB,当然了,每个具体型号有多大不一定,具体看通过芯片的手册来了解。

而现在的51单片机的片外RAM, “片外”只是一个名词而已,实际上很多也是直接做到了单片机内部,但是访问地址,还是以外部的起始地址的方式。就是说,片内RAM的地址从0x00到0xFF,而片外是从0x0000到0xFFFF;其中最开始的256B是重复的地址,这部分通常情况下只要RAM够用就可以不理会,软件编译器会自动给我们处理好。当选默认small模式,优先使用内部的前128B,而选Large模式,优先使用的是片外的64K。因此上面那个同学的问题就在这里了,因为他用的是AT89S51单片机,而这个单片机是没有片外RAM的,如果选择了Large模式,那优先使用的是片外,因此编译完成,下载到单片机里,程序运行时用了这个单片机所没有的区域,那肯定就不行了。


通常KEIL C51语言中的以下几个关键字,代表了RAM不同区域的划分:

data:片内RAM从0x00~0x7F

idata:片内RAM从0x00~0xFF

pdata:片外RAM从0x00~0xFF

xdata:片外RAM从0x0000~0xFFFF

其中,data是idata的一部分,pdata是xdata的一部分。这个问题我们可以不关心,只和汇编编程有关。

那如果选择了small模式,我们定义一个变量a:unsigned char a = 0;他是默认保存在data区域,这个时候data是可以省略,但是我们想定义到xdata区域,就必须前边加xdata关键字:unsigned char xdata a = 0;

如果选择large模式,unsigned char a = 0;是定义在片外xdata区域,如果要定义在片内就必须加data关键字。

但是在RAM够用的情况下,我们优先使用data的,其次使用idata关键字,再次使用pdata关键字,最后使用xdata。这个和底层访问指令有关系,用前边的读写速度要快一些,比如pdata访问是单字节地址,而xdata是双字节地址,访问速度就慢了。


这里讲解C51的RAM,但是通过51的RAM同学们也得理解其他类型单片机的RAM使用问题,如果你不了解,一旦遇到RAM溢出,查找问题不好查。

1.《单片机内部ram功能如何划分 单片机系统复位后》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《单片机内部ram功能如何划分 单片机系统复位后》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3257934.html