zoukankan      html  css  js  c++  java
  • (转)存储器类型

    原文地址: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

  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/god_like_donkey/p/1613565.html
Copyright © 2011-2022 走看看