主题 : 2440的大小端问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 8791
精华: 0
发帖: 6
金钱: 70 两
威望: 35 点
综合积分: 12 分
注册时间: 2009-09-06
最后登录: 2009-09-21
楼主  发表于: 2009-09-08 14:24

 2440的大小端问题

从2440的启动代码中可以看出,程序一开头就可以通过程序指令将2440改为大端模式,也就是说自从改模式后2440对以后的指令将以大端模式解读;但2440启动的默认状态是小端模式,也就是说在改为大端模式之前的指令(包括改模指令本身)2440都将以默认的小端模式来解读。那么这就有个问题,2440的启动代码中既要有改模之前的小端模式指令,又要有改模之后的大端模式指令,然而2440启动代码的编译要么是小端,要么是大端,那么怎样才能解决这个矛盾?不知道我以上的理解有没有错误?        
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-09-08 15:20
如果你说的是2440init.s里的这段代码
复制代码
  1.     AREA    Init,CODE,READONLY
  2.     ENTRY
  3.     ;1)The code, which converts to Big-endian, should be in little endian code.
  4.     ;2)The following little endian code will be compiled in Big-Endian mode.
  5.     ;  The code byte order should be changed as the memory bus width.
  6.     ;3)The pseudo instruction,DCD can't be used here because the linker generates error.
  7.     ASSERT    :DEF:ENDIAN_CHANGE
  8.     [ ENDIAN_CHANGE
  9.         ASSERT  :DEF:ENTRY_BUS_WIDTH
  10.         [ ENTRY_BUS_WIDTH=32
  11.         b    ChangeBigEndian        ;DCD 0xea000007
  12.         ]
  13.         [ ENTRY_BUS_WIDTH=16
  14.         andeq    r14,r7,r0,lsl #20   ;DCD 0x0007ea00
  15.         ]
  16.         [ ENTRY_BUS_WIDTH=8
  17.         streq    r0,[r0,-r10,ror #1] ;DCD 0x070000ea
  18.         ]
  19.     |
  20.         b    ResetHandler
  21.     ]

那只有当定义了ENDIAN_CHANGE时才会执行endian的更改,否则使用的是默认的little endian
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 8791
精华: 0
发帖: 6
金钱: 70 两
威望: 35 点
综合积分: 12 分
注册时间: 2009-09-06
最后登录: 2009-09-21
2楼  发表于: 2009-09-10 12:23
我说的就是定义了ENDIAN_CHANGE时的情况,也就是说我需要2440改为大端.但在改大端的指令执行完以前,2440默认的是小端,也就是说开始的一条跳转指令和改大端的3条指令本身都应该是小端,这样2440才能正确解读,那么改大端的3条指令以及开始的一条跳转指令都应该以小端形式存储;只有在改大端的指令执行完以后,2440才能按照大端的方式解读以后的指令,那么这些以后的指令就必须是以大端形式存储.具体到norflash中的地址是0x0的跳转指令和0x24起始的3条改大端指令要以小端形式存储,这是为了2440刚启动的默认小端解读;除此以外的norflash中的其它指令都应该是大端形式存储,这样改大端指令结束后2440就以大端方式来解读这部分的指令.不知道我这样理解对不对?
级别: 新手上路
UID: 8791
精华: 0
发帖: 6
金钱: 70 两
威望: 35 点
综合积分: 12 分
注册时间: 2009-09-06
最后登录: 2009-09-21
3楼  发表于: 2009-09-11 10:41
请大侠们帮忙解答一下吧!!!
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-09-11 11:36
要验证你的想法,实践会比在这里问有用的多
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 8791
精华: 0
发帖: 6
金钱: 70 两
威望: 35 点
综合积分: 12 分
注册时间: 2009-09-06
最后登录: 2009-09-21
5楼  发表于: 2009-09-18 09:53
有没有谁知道啊?