首页 新闻资讯 技术资料 论坛 网站地图
应用产品 CPLD/FPGA 软件开发 消费电子 嵌入式硬件 IC设计 嵌入式软件
电子元器件搜索:
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
维库电子市场网是知名的电子元器件交易网站, 为电子生产企业提供IC库存和技术资料查询服务。
位置: 首页 > 详细信息
  请教LPC2292外扩存储器时,,地址线的连接问题
出处:21ic 时间: 2007-06-12
atao涛 发布于 2007-5-29 16:41:00
    请教:
       lpc2292外扩16位SRAM(IS61LV25616)时,,为什么地址要搓开???
    

http://bbs.21ic.com/upfiles/img/20075/2007529164110185.rar


luhuaren 发布于 2007-5-29 18:18:00
可以分析arm从IS61LV25616读一个数据的过程

ARM处理器输出一个32位的地址,当然它是想得到一个32位的数据,但是IS61LV25616是16位的,当ARM输出地址0的时候,要访问的是IS61LV25616的地址0,和1内的数据(刚才已经说了,ARM要得到一个32位的数据),当ARM输出地址4的时候,它要访问IS61LV25616的地址2,和3处的数据。。。


ATAO涛 发布于 2007-6-6 17:01:00
       连接关系:LPC2292的A1连接到IS61LV25616的A0

           CPU                           SRAM
  ..  A4 A3 A2 A1 A0                     ..   A3 A2 A1 A0
  ..  0  0  0  0  0                      ..   0   0  0  0
  ..  0  0  0  0  1                      ..   0   0  0  0
  ..  0  0  0  1  0                      ..   0   0  0  1
  ..  0  0  0  1  1                      ..   0   0  0  1
  ..  0  0  1  0  0                      ..   0   0  1  0
  ..  0  0  1  0  1                      ..   0   0  1  0
  ..  0  0  1  1  0                      ..   0   0  1  1
  ..  0  0  1  1  1                      ..   0   0  1  1
...........                              ..   .   .  .  .

    按照这规律.. 当CPU地址为0 或1时,访问RAM的地址0;
                 当CPU地址为2 或3时,访问RAM的地址1;
                  难不成每次取8位????   不理解...

    


luhuaren 发布于 2007-6-7 9:17:00
    按照这规律.. 当CPU地址为0 或1时,访问RAM的地址0;
                 当CPU地址为2 或3时,访问RAM的地址1;
                  难不成每次取8位????   不理解...



注意  RAM是16位的。。。。。。  访问RAM地址0的时候相当于访问一个16位的数据,16位相当于两个字节,对于CPU来说,是地址0和1

还有。。。一开始回的那个帖子有点错误。。。



atao涛 发布于 2007-6-12 9:18:00
   谢谢.....不好意思,,对ARM不了解,,,

问题 1\
     "访问RAM地址0的时候相当于访问一个16位的数据,16位相当于两个字节,对于CPU来说,是地址0和1"   这是不是可以这样理解.. ----CPU取数是以8bit为单位的,在cpu内部对取自RAM的16位数据进行预处理,,当cpu地址为0时,,取ram地址0的16位的低半字节,,,当cpu地址为1时,,取ram地址0的16位高半字节??????  还有,,我用CPU-- IXP 425的时候,,外接16位SDRAM--mt48lc16m16a2的时候不需要地址错位,,,可以以字方式取树........

问题2\
    如果对lpc2292和外部ram不进行地址错位,,,这样是不是只能CPU的偶地址(0,2,4....)才能取到ram的数据(每个16位数据的低半字节)???????
                                        谢谢....




luhuaren 发布于 2007-6-12 9:34:00

内存地址对齐及大小端(转)
    
    
2006-12-06 22:00:49    
     
大中小    
我们常常看到“alignment", "endian"之类的字眼, 但很少有C语言教材提到这些概念. 实际上它们是与处理器与内存接口, 编译器类型密切相关的.

考虑这样一个例子: 两个异构的CPU进行通信, 定义了这样一个结果来传递消息:

style="COLOR: rgb(0,1,2)"struct Message

{

  short opcode;

  char subfield;

  long message_length;

  char version;

  short destination_processor;

}message;

用这样一个结构来传递消息貌似非常方便, 但也引发了这样一个问题: 若这两种不同的CPU对该结构的定义不一样,  两者就会对消息有不同的理解. 有可能导致二义性. 会引发二义性的有这两个方面:
    内存地址对齐
    大小端定义
    
本文先介绍内存地址对齐和大小端的概念, 再回头来看这个例子就豁然开朗了.

内存地址对齐




洋名叫做" Byte Alignment".

大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址. 比如Motorola 68000不允许将16位的字存储到奇数地址中, 将一个16位的字写到奇数地址将引发异常.
实际上, 对于c中的字节组织, 有这样的对齐规则:
    单个字节(char)能对齐到任意地址
    2字节(short)以2字节边界对齐
    4字节(int, long)以4字节边界对齐

不同CPU的对其规则可能不同, 请参考手册.
    

为什么会有上述的限制呢? 理解了内存组织, 就会清楚了
CPU通过地址总线来存取内存中的数据, 32位的CPU的地址总线宽度既为32位置, 标为A[0:31]. 在一个总线周期内, CPU从内存读/写32位. 但是CPU只能在能够被4整除的地址进行内存访问, 这是因为: 32位CPU不使用地址总线的A1和A2. (比如ARM, 它的A[0:1]用于字节选择, 用于逻辑控制, 而不和存储器相连, 存储器连接到A[2:31].)

访问内存的最小单位是字节(byte), A0和A1不使用, 那么对于地址来说, 最低两位是无效的, 所以它只能识别能被4整除的地址了. 在4字节中, 通过A0和A1确定某一个字节.

再看看刚才的message结构, 你想想它占了多少字节? 别想当然的以为是10个字节. 实际上它占了12个字节. 不信? 用sizeof(message)看吧. 对于结构体, 编译器会针对起中的元素添加"pad"以满足字节对齐规则. message会被编译器改为下面的形式:

struct Message
style="COLOR: rgb(0,1,2)"{

  short opcode;

  char subfield;

  char pad1;            // Pad to start the long word at a 4 byte boundary

  long message_length;

  char version;

  char pad2;            // Pad to start a short at a 2 byte boundary

  short destination_processor;

  char pad3[4];         // Pad to align the complete structure to a 16 byte boundary

};
如果不同的编译器采用不同的对齐规则, 对传递message可就麻烦了.

Byte Endian




是指字节在内存中的组织,所以也称它为Byte Ordering.   

        对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:

(1) 它的地址是多少?
(2) 它的字节在内存中是如何组织的?
    
        针对第一个问题,有这样的解释:
        对于跨越多个字节的对象,一般它所占的字节都是连续的, 它的地址等于它所占字节最低地址.(链表可能是个例外, 但链表的地址可看作链表头的地址).

比如: int x, 它的地址为0x100. 那么它占据了内存中的Ox100, 0x101, 0x102, 0x103这四个字节.
    
        上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定. 考虑一个W位的整数. 它的各位表达如下:

[Xw-1, Xw-2, ... , X1, X0]
    
        它的MSB (Most Significant Byte, 最高有效字节)为[Xw-1, Xw-2, ... Xw-8]; LSB (Least Significant Byte, 最低有效字节)为 [X7, X6, ..., X0]. 其余的字节位于MSB, LSB之间. 
        LSB和MSB谁位于内存的最低地址, 即谁代表该对象的地址? 这就引出了大端(Big Endian)与小端(Little Endian)的问题。
        如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端. DEC (Digital Equipment Corporation, 现在是Compaq公司的一部分)和Intel的机器一般采用小端. IBM, Motorola, Sun的机器一般采用大端. 当然, 这不代表所有情况. 有的CPU即能工作于小端, 又能工作于大端, 比如ARM, PowerPC, Alpha. 具体情形参考处理器手册.
        举个例子来说名大小端:  比如一个int x, 地址为0x100, 它的值为0x1234567. 则它所占据的0x100, 0x101, 0x102, 0x103地址组织如下图:

 
        0x01234567的MSB为0x01, LSB为0x67. 0x01在低地址(或理解为"MSB出现在LSB前面,因为这里讨论的地址都是递增的), 则为大端; 0x67在低地址则为小端.

认清这样一个事实: C中的数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址.    
两个测试Bit Endian的小程序


method_1

#include <stdio.h>

int main(int argc, char *argv[])
{

&nbsp; int c = 1;
&nbsp; if ((*(char *)&c) == 1) {
&nbsp;&nbsp;&nbsp; printf("little endian\n");
&nbsp; }
&nbsp; else
&nbsp;&nbsp;&nbsp; printf("big endian");

&nbsp; return 0;
}
    
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int c 在内存中的表达为: 0x00000001. (这里假设int为4字节). 用char可以截取一个字节. LSB为0x01, 若它出现在c的低地址, 则为小端.
method_2

#include <stdio.h>

int main(void)
{
/* Each component to a union type is allocated storage at the beginning of the union */
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp; union {
&nbsp;&nbsp;&nbsp; short n;
&nbsp;&nbsp;&nbsp; char c[sizeof(short)];
&nbsp; }un;
&nbsp;
&nbsp; un.n = 0x0102;
&nbsp;
&nbsp; if ((un.c[0] == 1 && un.c[1] == 2))
&nbsp;&nbsp;&nbsp; printf("big endian\n");
&nbsp; else if ((un.c[0] == 2 && un.c[1] == 1))
&nbsp;&nbsp;&nbsp; printf("little endian\n");
&nbsp; else
&nbsp;&nbsp;&nbsp; printf("error!\n");
&nbsp; return 0;
}    
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union中元素的起始地址都是相同的——位于联合的开始. 用char来截取感兴趣的字节.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

区分大端与小端有什么用呢? 如果两个不同Endian的机器进行通信时, 就有必要区分了    

    
    
    



luhuaren 发布于 2007-6-12 9:38:00
http://blog.sina.com.cn/u/4ac4f33e01000741


关闭】 【打印
相关专题  
通信产品
综合电子技术
嵌入式系统
应用产品
AD/DA
存储器
计算机外设
开发工具
消费电子
医疗电子
嵌入式开发新闻
传感控制
电源系列
IC设计
数控系统
汽车电子
军工/航空航天
CPLD/FPGA
嵌入式硬件
接口电路
测试测量
安防产品
SOPC
软件开发
工业控制

© 2007 百斯嵌入式开发网 网站地图