ROM(代码储存区)和RAM(数据储存区)

众所周知,51内部的存储器分为数据存储器RAM和程序存储器ROM。以AT89c51为例,其中有128字节随机存储器(又称数据储存器RAM)和4K字节的只读存储器(又称程序存储器ROM)。
先说说这个4K字节的程序存储器或者说只读存储器,我们写的程序经过编译器编译成机器码都是存在这个区域,所以称为程序存储器;但单片机上电执行的时候,此区域内的数据只能读取而不能写入,他的只读存储器的名称从这而来。89c51的ROM采用的是FPEROM(Flash Programmable and Erasable Read Only Memory),具体工艺我也不太清楚,号称可以擦写1000次,也就是说你每天写30次,一个多月就报废了。
在说说128字节的随机存储器或者说数据存储器,程序运行过程中,一些中间变量存储在这个地方,也能从这个地方获取需要运算的值,所以称之为随机存储器,也称为数据存储器。个人觉得相当于计算机的内存,掉电丢失。
看看MSC-51指令就知道,所有的数据移动指令都是对RAM区操作的,就是因为无法改变ROM。
51内部的存储器在物理上可分为4个区域:片内ROM,片外ROM,片内RAM和片外RAM。从逻辑上可分为三个区域,64KB片内外统一编址的程序存储器(ROM),128字节或256字节的片内数据存储器(RAM),64KB片外数据存储器(RAM)。

对应的keil编译器关键字为:
data : 片内数据存储器(RAM)低128字节(51系列片内只有128字节,52系列有256字节)
bdata: 可位寻址的片内RAM
以上两种类型可以快速的存取数据,常用来放临时性的传递变量或使用频率较高的变量。
idata : 片内数据存储器(RAM)256字节
xdata: 片外数据存储器64KB
pdata: 片外数据存储器低256字节

code: 64KB程序存储器(如果变量定义在这个空间,后面就不能修改了,如果有语句改变它的值,编译器就会报错。)

此外,C51还有三种存储模式(这是在开发环境里面设置的):SMALL, COMPACT, LARGE
SMALL模式下,如果不做特别说明,参数及局部变量默认为data型,放在片内RAM128字节内,访问迅速。由于内部的RAM有限,如果变量过多,会导致频繁的使用寄存器,而使代码变的冗长。此时栈也在片内的RAM,栈长很关键,因为栈长依赖于不同函数的嵌套层数。
COMPACT:不做特别说明,参数及局部变量默认为pdata,栈空间在内部RAM。
LARGE:参数及局部变量默认为xdata,使用DPTR来寻址。访问效率低,此外这种数据指针不能对称操作。
全局变量会根据定义的类型或者存储的模式分配在相应的存储区内,有固定的地址,如果全局变量过多则会导致占用太多内存,处理速度变慢。

转载自
https://wenku.baidu.com/view/b2cd5c00443610661ed9ad51f01dc281e43a564c.html

发布了0 篇原创文章 · 获赞 2 · 访问量 142

猜你喜欢

转载自blog.csdn.net/tangpeng_will/article/details/103747931