RE 看一下这篇**。。

[复制链接]
4725|8
 楼主| atao涛 发表于 2007-5-29 16:41 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;请教:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpc2292外扩16位SRAM(IS61LV25616)时,,为什么地址要搓开???<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20075/2007529164110185.rar'>https://bbs.21ic.com/upfiles/img/20075/2007529164110185.rar</a>
luhuaren 发表于 2007-5-29 18:18 | 显示全部楼层

re

可以分析arm从IS61LV25616读一个数据的过程<br /><br />ARM处理器输出一个32位的地址,当然它是想得到一个32位的数据,但是IS61LV25616是16位的,当ARM输出地址0的时候,要访问的是IS61LV25616的地址0,和1内的数据(刚才已经说了,ARM要得到一个32位的数据),当ARM输出地址4的时候,它要访问IS61LV25616的地址2,和3处的数据。。。
ATAO涛 发表于 2007-6-6 17:01 | 显示全部楼层

图纸上的连接关系是: CPU的A1连接到IS61LV25616的A0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;连接关系:LPC2292的A1连接到IS61LV25616的A0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRAM<br />&nbsp;&nbsp;..&nbsp;&nbsp;A4&nbsp;A3&nbsp;A2&nbsp;A1&nbsp;A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;A3&nbsp;A2&nbsp;A1&nbsp;A0<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;0<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;0<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;1<br />&nbsp;&nbsp;..&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;1<br />...........&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;.&nbsp;&nbsp;.&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;按照这规律..&nbsp;当CPU地址为0&nbsp;或1时,访问RAM的地址0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当CPU地址为2&nbsp;或3时,访问RAM的地址1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;难不成每次取8位????&nbsp;&nbsp;&nbsp;不理解...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;
ATAO涛 发表于 2007-6-6 17:08 | 显示全部楼层

但数据线是连16位

  
luhuaren 发表于 2007-6-7 09:17 | 显示全部楼层

re

&nbsp;&nbsp;&nbsp;&nbsp;按照这规律..&nbsp;当CPU地址为0&nbsp;或1时,访问RAM的地址0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当CPU地址为2&nbsp;或3时,访问RAM的地址1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;难不成每次取8位????&nbsp;&nbsp;&nbsp;不理解...<br /><br /><br /><br />注意&nbsp;&nbsp;RAM是16位的。。。。。。&nbsp;&nbsp;访问RAM地址0的时候相当于访问一个16位的数据,16位相当于两个字节,对于CPU来说,是地址0和1<br /><br />还有。。。一开始回的那个帖子有点错误。。。<br />
 楼主| atao涛 发表于 2007-6-12 09:18 | 显示全部楼层

again

&nbsp;&nbsp;&nbsp;谢谢.....不好意思,,对ARM不了解,,,<br /><br />&nbsp;问题&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;访问RAM地址0的时候相当于访问一个16位的数据,16位相当于两个字节,对于CPU来说,是地址0和1&quot;&nbsp;&nbsp;&nbsp;这是不是可以这样理解..&nbsp;----CPU取数是以8bit为单位的,在cpu内部对取自RAM的16位数据进行预处理,,当cpu地址为0时,,取ram地址0的16位的低半字节,,,当cpu地址为1时,,取ram地址0的16位高半字节??????&nbsp;&nbsp;还有,,我用CPU--&nbsp;IXP&nbsp;425的时候,,外接16位SDRAM--mt48lc16m16a2的时候不需要地址错位,,,可以以字方式取树........<br /><br />问题2<br />&nbsp;&nbsp;&nbsp;&nbsp;如果对lpc2292和外部ram不进行地址错位,,,这样是不是只能CPU的偶地址(0,2,4....)才能取到ram的数据(每个16位数据的低半字节)???????<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;谢谢....<br /><br />
luhuaren 发表于 2007-6-12 09:34 | 显示全部楼层

RE 看一下这篇**。。

<br />内存地址对齐及大小端(转)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />2006-12-06 22:00:49&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;大中小&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;我们常常看到“alignment&quot;,&nbsp;&quot;endian&quot;之类的字眼,&nbsp;但很少有C语言教材提到这些概念.&nbsp;实际上它们是与处理器与内存接口,&nbsp;编译器类型密切相关的.<br /><br />考虑这样一个例子:&nbsp;两个异构的CPU进行通信,&nbsp;定义了这样一个结果来传递消息:<br /><br />style=&quot;COLOR:&nbsp;rgb(0,1,2)&quot;struct&nbsp;Message<br />&nbsp;<br />{<br />&nbsp;<br />&nbsp;&nbsp;short&nbsp;opcode;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;subfield;<br />&nbsp;<br />&nbsp;&nbsp;long&nbsp;message_length;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;version;<br />&nbsp;<br />&nbsp;&nbsp;short&nbsp;destination_processor;<br />&nbsp;<br />}message;&nbsp;<br />&nbsp;<br />用这样一个结构来传递消息貌似非常方便,&nbsp;但也引发了这样一个问题:&nbsp;若这两种不同的CPU对该结构的定义不一样,&nbsp;&nbsp;两者就会对消息有不同的理解.&nbsp;有可能导致二义性.&nbsp;会引发二义性的有这两个方面:<br />&nbsp;&nbsp;&nbsp;&nbsp;内存地址对齐&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;大小端定义<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />本文先介绍内存地址对齐和大小端的概念,&nbsp;再回头来看这个例子就豁然开朗了.<br /><br />内存地址对齐<br /><br /><br /><br /><br />洋名叫做&quot;&nbsp;Byte&nbsp;Alignment&quot;.<br /><br />大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址.&nbsp;比如Motorola&nbsp;68000不允许将16位的字存储到奇数地址中,&nbsp;将一个16位的字写到奇数地址将引发异常.<br />实际上,&nbsp;对于c中的字节组织,&nbsp;有这样的对齐规则:<br />&nbsp;&nbsp;&nbsp;&nbsp;单个字节(char)能对齐到任意地址&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;2字节(short)以2字节边界对齐&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;4字节(int,&nbsp;long)以4字节边界对齐&nbsp;<br /><br />不同CPU的对其规则可能不同,&nbsp;请参考手册.<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />为什么会有上述的限制呢?&nbsp;理解了内存组织,&nbsp;就会清楚了<br />CPU通过地址总线来存取内存中的数据,&nbsp;32位的CPU的地址总线宽度既为32位置,&nbsp;标为A[0:31].&nbsp;在一个总线周期内,&nbsp;CPU从内存读/写32位.&nbsp;但是CPU只能在能够被4整除的地址进行内存访问,&nbsp;这是因为:&nbsp;32位CPU不使用地址总线的A1和A2.&nbsp;(比如ARM,&nbsp;它的A[0:1]用于字节选择,&nbsp;用于逻辑控制,&nbsp;而不和存储器相连,&nbsp;存储器连接到A[2:31].)<br /><br />访问内存的最小单位是字节(byte),&nbsp;A0和A1不使用,&nbsp;那么对于地址来说,&nbsp;最低两位是无效的,&nbsp;所以它只能识别能被4整除的地址了.&nbsp;在4字节中,&nbsp;通过A0和A1确定某一个字节.<br /><br />再看看刚才的message结构,&nbsp;你想想它占了多少字节?&nbsp;别想当然的以为是10个字节.&nbsp;实际上它占了12个字节.&nbsp;不信?&nbsp;用sizeof(message)看吧.&nbsp;对于结构体,&nbsp;编译器会针对起中的元素添加&quot;pad&quot;以满足字节对齐规则.&nbsp;message会被编译器改为下面的形式:<br /><br />struct&nbsp;Message<br />style=&quot;COLOR:&nbsp;rgb(0,1,2)&quot;{<br />&nbsp;<br />&nbsp;&nbsp;short&nbsp;opcode;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;subfield;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;pad1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Pad&nbsp;to&nbsp;start&nbsp;the&nbsp;long&nbsp;word&nbsp;at&nbsp;a&nbsp;4&nbsp;byte&nbsp;boundary<br />&nbsp;<br />&nbsp;&nbsp;long&nbsp;message_length;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;version;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;pad2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Pad&nbsp;to&nbsp;start&nbsp;a&nbsp;short&nbsp;at&nbsp;a&nbsp;2&nbsp;byte&nbsp;boundary<br />&nbsp;<br />&nbsp;&nbsp;short&nbsp;destination_processor;<br />&nbsp;<br />&nbsp;&nbsp;char&nbsp;pad3[4];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Pad&nbsp;to&nbsp;align&nbsp;the&nbsp;complete&nbsp;structure&nbsp;to&nbsp;a&nbsp;16&nbsp;byte&nbsp;boundary<br />&nbsp;<br />};&nbsp;<br />如果不同的编译器采用不同的对齐规则,&nbsp;对传递message可就麻烦了.<br /><br />Byte&nbsp;Endian<br />&nbsp;<br /><br /><br /><br />是指字节在内存中的组织,所以也称它为Byte&nbsp;Ordering.&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于数据中跨越多个字节的对象,&nbsp;我们必须为它建立这样的约定:<br /><br />(1)&nbsp;它的地址是多少?<br />(2)&nbsp;它的字节在内存中是如何组织的?<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;针对第一个问题,有这样的解释:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于跨越多个字节的对象,一般它所占的字节都是连续的,&nbsp;它的地址等于它所占字节最低地址.(链表可能是个例外,&nbsp;但链表的地址可看作链表头的地址).<br /><br />比如:&nbsp;int&nbsp;x,&nbsp;它的地址为0x100.&nbsp;那么它占据了内存中的Ox100,&nbsp;0x101,&nbsp;0x102,&nbsp;0x103这四个字节.<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面只是内存字节组织的一种情况:&nbsp;多字节对象在内存中的组织有一般有两种约定.&nbsp;考虑一个W位的整数.&nbsp;它的各位表达如下:<br /><br />[Xw-1,&nbsp;Xw-2,&nbsp;...&nbsp;,&nbsp;X1,&nbsp;X0]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它的MSB&nbsp;(Most&nbsp;Significant&nbsp;Byte,&nbsp;最高有效字节)为[Xw-1,&nbsp;Xw-2,&nbsp;...&nbsp;Xw-8];&nbsp;LSB&nbsp;(Least&nbsp;Significant&nbsp;Byte,&nbsp;最低有效字节)为&nbsp;[X7,&nbsp;X6,&nbsp;...,&nbsp;X0].&nbsp;其余的字节位于MSB,&nbsp;LSB之间.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LSB和MSB谁位于内存的最低地址,&nbsp;即谁代表该对象的地址?&nbsp;这就引出了大端(Big&nbsp;Endian)与小端(Little&nbsp;Endian)的问题。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果LSB在MSB前面,&nbsp;既LSB是低地址,&nbsp;则该机器是小端;&nbsp;反之则是大端.&nbsp;DEC&nbsp;(Digital&nbsp;Equipment&nbsp;Corporation,&nbsp;现在是Compaq公司的一部分)和Intel的机器一般采用小端.&nbsp;IBM,&nbsp;Motorola,&nbsp;Sun的机器一般采用大端.&nbsp;当然,&nbsp;这不代表所有情况.&nbsp;有的CPU即能工作于小端,&nbsp;又能工作于大端,&nbsp;比如ARM,&nbsp;PowerPC,&nbsp;Alpha.&nbsp;具体情形参考处理器手册.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;举个例子来说名大小端:&nbsp;&nbsp;比如一个int&nbsp;x,&nbsp;地址为0x100,&nbsp;它的值为0x1234567.&nbsp;则它所占据的0x100,&nbsp;0x101,&nbsp;0x102,&nbsp;0x103地址组织如下图:<br /><br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01234567的MSB为0x01,&nbsp;LSB为0x67.&nbsp;0x01在低地址(或理解为&quot;MSB出现在LSB前面,因为这里讨论的地址都是递增的),&nbsp;则为大端;&nbsp;0x67在低地址则为小端.<br /><br />认清这样一个事实:&nbsp;C中的数据类型都是从内存的低地址向高地址扩展,取址运算&quot;&&quot;都是取低地址.&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;两个测试Bit&nbsp;Endian的小程序<br /><br /><br />method_1<br /><br />#include&nbsp;&ltstdio.h&gt<br /><br />int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;*argv[])<br />{<br /><br />&nbsp;&nbsp;int&nbsp;c&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;if&nbsp;((*(char&nbsp;*)&c)&nbsp;==&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;little&nbsp;endian
&quot;);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;big&nbsp;endian&quot;);<br /><br />&nbsp;&nbsp;return&nbsp;0;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c&nbsp;在内存中的表达为:&nbsp;0x00000001.&nbsp;(这里假设int为4字节).&nbsp;用char可以截取一个字节.&nbsp;LSB为0x01,&nbsp;若它出现在c的低地址,&nbsp;则为小端.<br />method_2<br /><br />#include&nbsp;&ltstdio.h&gt<br /><br />int&nbsp;main(void)<br />{<br />/*&nbsp;Each&nbsp;component&nbsp;to&nbsp;a&nbsp;union&nbsp;type&nbsp;is&nbsp;allocated&nbsp;storage&nbsp;at&nbsp;the&nbsp;beginning&nbsp;of&nbsp;the&nbsp;union&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;union&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;n;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;c[sizeof(short)];<br />&nbsp;&nbsp;}un;<br />&nbsp;<br />&nbsp;&nbsp;un.n&nbsp;=&nbsp;0x0102;<br />&nbsp;<br />&nbsp;&nbsp;if&nbsp;((un.c[0]&nbsp;==&nbsp;1&nbsp;&&&nbsp;un.c[1]&nbsp;==&nbsp;2))<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;big&nbsp;endian
&quot;);<br />&nbsp;&nbsp;else&nbsp;if&nbsp;((un.c[0]&nbsp;==&nbsp;2&nbsp;&&&nbsp;un.c[1]&nbsp;==&nbsp;1))<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;little&nbsp;endian
&quot;);<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;error!
&quot;);<br />&nbsp;&nbsp;return&nbsp;0;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;union中元素的起始地址都是相同的——位于联合的开始.&nbsp;用char来截取感兴趣的字节.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />区分大端与小端有什么用呢?&nbsp;如果两个不同Endian的机器进行通信时,&nbsp;就有必要区分了&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />
luhuaren 发表于 2007-6-12 09:38 | 显示全部楼层

re

http://blog.sina.com.cn/u/4ac4f33e01000741
mmnq 发表于 2008-6-30 22:47 | 显示全部楼层

个人理解

由于是16位ram,必须以2的基数地址读取。0、2、4、6......<br />假若是32未ram则地址A0A1不用,以4为基数读取,0、4、8......
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部