(转)存储器类型

原文地址:http://blog.csdn.net/lemonzhu/archive/2009/10/30/4745915.aspx

第6章 存储器问题

片内存储器

无论使用哪种语言,即使是高级语言中很复杂的语句最终也会被分解为基本操作,诸如“将数据块从某个存储器复制到另一个”。最终实现的机器指令的形式为“将存储器地址X中的内容移到(move)寄存器Y中”。

微控制器和微处理器中实现这种基本的“move”指令主要有两种:
使用直接寻址:存储单元的地址(即上面例子中的存储器地址X)作为指令的一部分而明确给出。
使用间接寻址:存储单元的地址并不作为指令的一部分被明确的给出,而是在指令中包括另一个存储单元或寄存器的地址,该地址中所有存储的内容是存储器地址X。

注意,直接寻址和间接寻址知道区别还有其他作用。
例如,在8051系列芯片内部,有一块特殊功能寄存器存储区和另一个通用的存储区。两个存储区的大小相同(128字节),而且共用同样的地址范围。其中的一块存储区只能间接访问,而另一块只能直接访问。因此,当编译器翻译某个C语句时,必须选择合适的机器指令来保证对存储区的正确访问。在大多数情况下,这个流程对程序员是完全隐藏的。


存储器类型
磁带:对磁带的读写所需的时间变化很大,取决于绕动整个磁带,还是仅仅绕动几个厘米。
RAM:随机存取存储器,在电源掉电时数据会丢失,但访问随机选择的存储单元,只需同样的时间。
DRAM:动态随机存储器,掉电时信息丢失。
SRAM:静态随机存储器,掉电时信息丢失,存取时间是DRAM的三分之一。
ROM:掩膜只读存储器,使用前写进信息,后面使用中只读。
PROM:可编程只读存储器。
EEPROM:电可擦除可编程只读存储器。
Flash ROM:闪存。

8051的存储器影像
-----------                                 ------------      ------------
|  CODE |                                |            |      |             |
|            |  ----------                  |            |      |            |
|            |  |           |                 | PDATA |      | XDATA |
|            |  | IDATA |                 |           |      |             |
|            |  |-------  |  ---------    |            |      |             |
|            |  | DATA  |  | SFR  |   |            |      |             |
|            |  |           |  |         |   |            |      |            |
-----------   ----------   ---------   -----------      -------------


程序代码区:CODE
8051中,程序代码在ROM中就地运行,而不是复制到RAM中运行。

除了程序代码之外,代码区还用于存储(只读)数据,例如查表数据。
使用ROM来存储数据表可以提高性能。例如程序代码需要计算正弦或余弦,在大多数系统上需要大量cpu操作,如果将相关计算的结果放在一个数组中,将使cpu的负荷降低为原来的千分之一左右。

将数据存储在ROM中很容易做到,例如使用Keil:
int code table[256] = {0x0, 0x123, ...};


DATA、BDATA和IDATA区
内部数据区分为三个重叠的区域:DATA、IDATA和BDATA。

使用DATA区
DATA区指向内部数据存储器的前128个字节,使用直接寻址。
Keil的小内存模式,C51编译程序默认设置为使用DATA区,也可以使用data关键字:
char data input;


使用IDATA区
IDATA区指向内部数据存储器的所有256个字节,包括与之重叠的DATA区的128个字节。使用间接寻址,访问速度比DATA慢。
char idata input;
注意,IDATA区通常用作堆栈区,一般而言,最好将这个区域留给编译器使用。


使用BDATA区
BDATA与DATA区重叠。它指向内部DATA区中16个字节大小的可位寻址存储器(地址0x20~0x2F)。

通过bit、bdata、sbit来使用这个区域:
unsigned char bdata bit_addressable;
bit flag;
sbit bit0 = bit_addressable^0;


特殊功能寄存器(SFR)存储区
用来控制定时器、计数器、串行输入/输出、端口输入/输出和各种外设。
128~255字节的IDATA区和SFR区共用同样的地址空间,然而,这两个存储器区域使用不同的寻址方式访问。128~256字节的IDATA区只能间接寻址,而特殊功能寄存器只能直接寻址。


外部数据存储器
外部数据存储器访问速度比较慢,可被分成两个区域。
XDATA区可以指向所有(64K)数据地址空间中的任意地址。
PDATA区指向这个地址空间的前256个字节。
访问PDATA变量比访问外部数据空间的其他变量的速度更快。


内部的“外部”存储器
尽管XDATA存储器映射为XDATA区,但它并不是必须在物理上位于微控制器之外。实际上,许多现代芯片都包含片内XDATA RAM,这些RAM区的使用方法和外部存储器一样。


各种存储区中所存储数据的典型访问时间:
DATA:一个周期,直接存取
IDATA:二个周期,复制8位地址到寄存器(1周期),移动指令(1周期)
PDATA:三个周期,复制8位地址到寄存器(1周期),移动指令(2周期)
XDATA:四个周期,复制16位地址到寄存器(2周期),移动指令(2周期)
CODE:四个周期,复制16位地址到寄存器(2周期),移动指令(2周期)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lemonzhu/archive/2009/10/30/4745915.aspx

原文地址:https://www.cnblogs.com/god_like_donkey/p/1613565.html