打印

2440大小端的初级问题

[复制链接]
2088|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangbotm|  楼主 | 2010-8-9 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在2440的启动代码中,如果想让系统在大端模式下运行,需将ENDIAN_CHANGE设定为TRUE,然后编译器会根据不同的总线宽度编译不同的指令,32位、16位和8位指令的机器码分别如下0xea000007、0x0007ea00、0x070000ea,小弟不明白的是这个指令为何跟位宽产生了关联,对32位的0xea000007,实际大端编译后A+3、A+2、A+1、A的值分别为07、00、00、ea,对于16位则分别对应00、ea、07、00,8位时则是ea、00、00、07,这样系统上电时,在小端模式下运行,读出的指令不就分别是0x07000000ea、0x00ea0700、0xea000007,怎么会都是b ChangeBigEndian这条指令的意思了,实在不明白这指令跟BUS_WIDTH有什么关系,希望大虾们给予指点,不甚感激

相关帖子

沙发
xinzha| | 2010-8-10 14:25 | 只看该作者
你所见到的这条指令是在转成大端之前,实际还是小端。
而cpu要读入的顺序是0xea,0x00,0x00,0x07,这样的话就要求32bit的时候以word形势组织是0xea000007,16bit下就要是,0xea00,0x0007,而你要是以32位读出的话就是0x0007ea00,8bit下就是0xea,0x00,0x00,0x07,这个时候以32位读出就是0x070000ea。

使用特权

评论回复
板凳
zhangbotm|  楼主 | 2010-8-13 22:03 | 只看该作者
查了下,明白点了
BUS_WIDTH应该是flash的存储位宽,个人认为,当大端编译完成后,程序烧写时,系统会根据编译的结果,按大端格式存入flash,这样如果是16位存储器,地址A存储0x0007,A+2地址则存储0xea00,而系统运行后实际是按小端格式读取flash,也就是读出0xea000007,和32位指令一致。
不知这种理解是否正确,望高手指点。如果是这样的话32位宽flash的大端编译结果和小端编译结果应该是完全一样的,只有16位或8位这种需要对word分割的才会体现一定差异,不知是否?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

9

帖子

1

粉丝