• (转)存储器类型


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

  • 相关阅读:
    [UE4]创建多把枪,使用Class,参数的对象类型
    [UE4]换枪需要做的事,容器:数组、集合、Map
    [UE4]蓝图重构
    [UE4]为什么会有类型检查
    [UE4]ChildActor组件
    [UE4]Character,飞行模式。
    [UE4]Pawn和Controller,第一人称和第三人称切换
    [UE4]组件
    [UE4]Acotr
    [UE4]封装、继承、多态
  • 原文地址:https://www.cnblogs.com/god_like_donkey/p/1613565.html
Copyright © 2020-2023  润新知