zoukankan      html  css  js  c++  java
  • ARM的STRB和LDRB指令分析

    一、SDRAM

    1、存储结构

      SDRAM的内部是一个存储阵列。阵列就如同表格一样,将数据“填”进去。在数据读写时和表格的检索原理一样,先指定一个行(Row),再指定一个列 (Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理 

      这个单元格(存储阵列)就叫逻辑 Bank(Logical Bank,下文简称 L-Bank)。 由于技术、成本等原因,不可能只做一个全容量的 L-Bank,而且最重要的是,由于 SDRAM的工作原理限制,单一的 L-Ban k将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在 SDRAM内部分割成多个 L-Bank,目前基本都是 4个(这也是SDRAM规范中的最高L-Bank数量),由此可见,在进行寻址时就要先确定是哪个 L-Bank,然后在这个选定的 L-Bank中选择相应的行与列进行寻址。

    2、引脚说明

     

      DQM可以阻塞其对应的空间长度(8位)的有效性。例如,当LDQM有效时,如果输出时,将输出的[7,0]位置成高阻态;如果输入,则阻碍[7,0]的输入,也就是不能修改[7,0]的数据。当UDQM有效时,如果输出时,将输出的[15,8]位置成高阻态;如果输入,则阻碍[15,8]的输入,也就是不能修改[15,8]的数据。

    3、S3C2440与内存相关的硬件电路图

      SDRAM以两片32M的K4S561632构成64M的RAM存储为例进行说明。

     

    4、对SDRAM访问的步骤

    (1) CPU发出片选信号nSCS0有效,选中SDRAM芯片

    (2) SDRAM中有4个L-Bank,需要2根地址信号选中一个,利用的是ADDR24和ADDR25

    (3) 先后发出行地址信号和列地址信号。K4S561632的行地址数是13,列地址数是9。所以,当nSRAS有效时,ADDR2~ADDR14上发出的是行地址信号,它对应32位地址空间的bit[23:11];当nSCAS有效时,ADDR2~ADDR10上发出的是列地址信号,它对应32位地址空间的bit[10:2]。由于BANK6以32位宽度外接SDRAM,ADDR0、ADDR1恒为0,不参与译码。

    (4) 找到存储单元后,被选中的芯片就要进行统一的数据传输了。

    二、分析ldrb/strb指令

    1、S3C2440有关ldrb/strb指令的描述

     2、LDRB

      ldrb指令会根据提供的地址,从数据总线中选择需要的字节。例如:

        ldrb r0,0x30000000取的是0x30000000这个字的[7,0]

        ldrb r0,0x30000001取的是0x30000000这个字的[15,8]

        ldrb r0,0x30000002取的是0x30000000这个字的[23,16]

        ldrb r0,0x30000003取的是0x30000000这个字的[31,24]

      也就是说ldrb指令会先把0x30000000这个地址的字取出来,然后根据ldrb指令提供的地址选择合适的字节。

      ldrb指令接下来要把取到的数据放在目的寄存器的低8位,然后将高24位填充为0。

    3、STRB

      STRB指令首先数据总线(整个字的四个字节)都填充上要写入的一个字节的数据。然后,外部存储系统激活合适的字节存储子系统去存储这一个字节的数据。

       “外部存储系统激活合适的字节存储子系统去存储这一个字节的数据”这句话,我是这样理解的,以"strb r3,[r4]"为例进行说明。

      假设r3 = 0x12 ,r4 = 0x30000001

      STRB指令首先数据总线上都填充上要写入的一个字节的数据,也就是数据总线为0x12121212,访问的字地址是0x30000000。因为要存储一个字节的数据到0x30000001,而0x30000000这个字的其他单元不能更改,所以就将DQM0、DQM2、DQM3都有效,而不屏蔽DQM。这样在写入的过程中,只将0x12写入到0x30000001单元中,而其他三个单元不修改,从而完成strb指令规定的任务。

    参考资料:编译器对变量存储地址的处理

          S3C2440 SDRAM内存驱动

                 数据掩码DQM0,DQM1,DQM2,DQM3

  • 相关阅读:
    第一篇:GCD的使用
    第一篇:线程的安全
    内存问题
    第一篇:多线程的概念
    第一篇:NSOperation的概念
    存储问题
    第一篇:NSTread线程的创建
    第一篇:多线程使用
    遍历所有表,取每个表的MAXID更新到ID控制表
    <转载>SQL查询数据库各表所占空间
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3444411.html
Copyright © 2011-2022 走看看