找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1780|回复: 3
收起左侧

我想问问C51单片机的运行内存问题

[复制链接]
ID:541921 发表于 2019-6-22 10:21 | 显示全部楼层 |阅读模式
C51单片机的运行的时候,比如说来了个递归的函数,那么应该需要一点运行空间,那么这个空间来自哪里呢?能不能制定到特定的外存拓展器?
回复

使用道具 举报

ID:94031 发表于 2019-6-22 14:06 | 显示全部楼层
C51怎么运行在编译时就确定好了,问题是你为什么要干预它呢。
回复

使用道具 举报

ID:569500 发表于 2019-6-22 15:23 | 显示全部楼层
关于51单片机内存问题,一直是个疑惑大家的问题,因为51单片机是个很另类的单片机。
下面我给楼主讲解一下:
51单片机之所以另类,是因为,他寻址内存的空间,不是靠总线,是用指令的方式。
51单片机有以下几个内存模块组成:
1】ROM或者Flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。
程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64K,所以很少有外扩
片外Flash或者片外的Rom了,Flash或者Rom不管是片内还是片外的,只能用来定义常量,是用code来修饰,也就是说,用code来修饰的东西,在程序运行过程中,不能修改;
2】RAM有------内部RAM的低128位(00-7F),对应C语言就是data,比如我定义一个变量,
              data unsigned char Var = 0;
那么,这个Var变量就是放在内部的低128位Ram中
               -------内部RAM的高128位(80-FF),对应C语言就是idata,比如我定义一个变量,
idata unsigned char Var = 0;
那么,这个Var变量就是放在内部的高128位Ram中
        -------特殊功能寄存器(SFR)(80-FF),对应C语言就是Sfr比如我定义一个变量,
Sfr unsigned char Var = 0x90;
那么,这个Var变量就是放在内部的特殊功能寄存器中,这是你对Var操作,相当于操作一个特殊的寄存器,但是小心,不能随便定义Sfr变量,很危险
              ------外部RAM 64K(0000-FFFF)
外部的RAM可以扩展到65536个,但是前256个算是一页,这一页比较特殊,是用
pdata来修饰的,当然,也可以用xdata来修饰。
除了第一页的256个以外的其他65280个空间,只能用xdata来修饰;
回过头来讨论pdata和xdata,这两个都能修饰外部Ram的第一页,但是,Pdata只能修饰第一页,即最前面的256个外部Ram,那么,这最前面的256个到底用Pdata还是Xdata好的呢?
答案是Pdata,因为Xdata修饰的变量,用的是DPTR寻址,Pdata用的是R0和R1.DPTR因为是16位的,所以可以覆盖整个的64K外部Ram,R0和R1是8位,所以只能寻址最前面的256个,也就是外部Ram的第一页,但是,用R0寻址,比DPTR快一倍,代码也小的很多

楼主又疑惑了,好多地址是重复的,比如,我向80H地址写一个数值,单片机怎么知道读的是内部的高128位RAM?还是SFR?还是外部64K的RAM呢?

答案是用指令,如果是直接寻址,那么访问的就是SFR,如果是R0或者R1间接寻址,就是内部高128位RAM,如果是DPTR或者是R0,R1间接寻址,且配合的是MovX指令,那么就是访问外部64KRAM中的第80H个地址。

概括一下来说,51的内存由以下组成:
1----程序存储器(包括片内Flash或Rom,也包括片外Flash或Rom,C语言用Code定义)
2----内部低128位Ram,C语言用data定义
3---内部高128位Ram,C语言用idata定义
4---内部SFR,C语言用Sfr定义
5---外部65536个Ram(通常,很多单片机厂家不会给你扩展那么多的,一般来说扩展256个字节或者1024个字节就差不多了,最近宏晶的出了个扩展4096字节的。这65536字节的Ram,前256个可以用Pdata修饰,也可以用Xdata修饰,超过256个之后的,只能用Xdata修饰)

以上所说的只是针对51内核的单片机,其他内核的,像ARM之类的,不是这种结构的。

最后,回答楼主的问题:
片外存储区是什么?
这个问题太模糊,答案可以是外扩的Flash,也可以说是外扩的RAM,
如果问题是这么问的:
程序或者常量存储在片外存储区,这个片外存储区指的是什么?
答案是外扩Flash;
如果问题是---变量存储在片外存储区,这个片外存储区指的是什么?
答案是外扩RAM;
一般来说,如果不指明的话,外内存储区,行业内人士指的是外部的Ram。

片内存储器是什么?是不是就是内部的E2PROM?
片内存储区一般来说,指的是内部的Ram,包括高128位(idata)和低128位(data)
片内存储器,这个说法我没听说过,可能是EEPROM吧。
参考链接:https://www.cnblogs.com/yygsj/p/4974895.html
回复

使用道具 举报

ID:401564 发表于 2019-6-22 17:22 | 显示全部楼层
递归的重点不在于内存,C编译器会自动分配的。
递归主要是占用堆栈,8051的堆栈是软件堆栈,它是自动向下压的,理论上来说是无限堆栈,就是你可以一直进栈也没有关系。但实际上是会溢出的。
8051有128个字节的RAM,这已经可能处理大多函数了,函数在调用的时候,一个变量会占用一个地址的,返回的时候,又会释放这个地址了,除非你一个函数定义了255个变量,那你就要考虑一下内存的问题了。如果不是的话,那就不要去管这个问题了,那是编译器的事,实在是想知道,那就去学汇编,有你受的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表