关于ADS1.2里设置RO Base 和RW Base的疑问?

[复制链接]
6862|16
 楼主| sklar 发表于 2007-4-26 14:50 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;谢谢进来解答!<br />&nbsp;&nbsp;请问在ADS1.2里设置的RO&nbsp;Base和RW&nbsp;Base是做什么用的?<br />&nbsp;&nbsp;我现在只能理解为:在ADS1。2里设置的RO&nbsp;Base和RW&nbsp;Base,是不是就是设置SDRAM的分布?跟代码放哪里没关系的?代码具体放哪里是不是烧写的时候设置的?&nbsp;<br />&nbsp;&nbsp;比如开发板提供的BISO&nbsp;在ADS工程里RO&nbsp;Base设置为0xc000000&nbsp;RW&nbsp;Base设置为0xc5f0000,可是BIOS不是要放0X0000000的吗?晕了&nbsp;
pigjiang 发表于 2007-4-26 16:35 | 显示全部楼层

我觉得你说的有道理.

这个设置对代码烧入flash以后的分布没有关系。只是把code和data分段了一下.<br />
 楼主| sklar 发表于 2007-4-26 16:54 | 显示全部楼层

呵呵,进来的都发表下看法吧

&nbsp;&nbsp;&nbsp;知道的说下,不清楚的也把自己的看法说说吧,大家交流啊,楼上的用什么ARM板?我用的是立YU泰的44B0
luhuaren 发表于 2007-4-26 17:15 | 显示全部楼层

re

RO&nbsp;Base设置为0xc000000&nbsp;RW&nbsp;Base设置为0xc5f0000,可是BIOS不是要放0X0000000的吗<br /><br />注意:如果是用44B0,那么44B0上电复位后PC的值是0,<br />&nbsp;&nbsp;&nbsp;&nbsp;AREA&nbsp;&nbsp;&nbsp;&nbsp;Init,CODE,READONLY<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ENTRY&nbsp;<br />ResetEntry<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;ResetHandler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;for&nbsp;debug<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;HandlerUndef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;handlerUndef<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;HandlerSWI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;SWI&nbsp;interrupt&nbsp;handler<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;HandlerPabort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;handlerPAbort<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;HandlerDabort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;handlerDAbort<br />&nbsp;&nbsp;&nbsp;&nbsp;b&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;;handlerReserved<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;HandlerIRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;HandlerFIQ<br /><br />系统上电后第一条指令执行的是b&nbsp;ResetHandler&nbsp;&nbsp;&nbsp;&nbsp;(在0地址处)这是一条相对跳转指令,也就是说,这条指令和RO的设置无关<br />跳转到ResetHandler处,进行一些初始化动作后,就要进行代码拷贝,就是把FLASH里的代码拷贝到RO指定的地址处,代码拷贝是这样实现的:<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;;拷贝并粘贴&nbsp;RW&nbsp;data/zero&nbsp;initialized&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,BaseOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldreq&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;TopOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;InitRamData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;;计算拷贝程序在flash中的实际位置&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;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r2,&nbsp;r1;r2-r1-&gtr1<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,=CopyProcEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;;将拷贝程序复制到ram中&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;&nbsp;&nbsp;&nbsp;;****************************************************<br />0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;&nbsp;&nbsp;&nbsp;r0!,&nbsp;{r4-r7}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;&nbsp;&nbsp;&nbsp;r2!,&nbsp;{r4-r7}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;;********************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;;********************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;TopOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;=CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;;装入绝对地址(指到RAM中去的)<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;CopyProcBeg<br />&nbsp;&nbsp;&nbsp;&nbsp;;********************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;;只拷贝CopyProcEnd以后的代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;********************************************************<br />CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;&nbsp;&nbsp;&nbsp;r0!,&nbsp;{r4-r11}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;&nbsp;&nbsp;&nbsp;r2!,&nbsp;{r4-r11}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br />CopyProcEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />InitRamData&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;BaseOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;BaseOfZero&nbsp;&nbsp;&nbsp;&nbsp;<br />0<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;ldrcc&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;strcc&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r2],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;&nbsp;&nbsp;&nbsp;EndOfBSS<br />1&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;strcc&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r2],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;===================================================================<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,BaseOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,r1&nbsp;&nbsp;&nbsp;&nbsp;<br />请注意这几条语句,尤其是adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry,这条语句当你反汇编后发现是一条这样的指令<br />;[0xe24f0f5d]&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,pc,#0x174&nbsp;&nbsp;&nbsp;;&nbsp;#0xc008000<br />     也是一条与位置无关的指令,ResetEntry的值同PC的值相关联,<br />当然,PC一上电的值为0,所以这里ResetEntry的值也为0,所以<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,BaseOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />比较的结果就是R0 != R1于是进行代码拷贝,将复制程序拷贝完后,就可以跳转到RAM中去,执行RAM中的拷贝程序,将FLASH中的代码拷贝到RAM中去..
luhuaren 发表于 2007-4-26 17:20 | 显示全部楼层

RE

可以下在U-BOOT的源码看一下,感觉很多开发板上流行的BOOT代码都是从U-BOOT上改过来的
pigjiang 发表于 2007-4-27 08:46 | 显示全部楼层

有个疑问

IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Base|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;ROM&nbsp;code&nbsp;start&nbsp;&nbsp;&nbsp;&nbsp;<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Limit|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;RAM&nbsp;data&nbsp;starts&nbsp;after&nbsp;ROM&nbsp;program<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RW$$Base|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Pre-initialised&nbsp;variables<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Base|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;uninitialised&nbsp;variables<br />IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Limit|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;End&nbsp;of&nbsp;variable&nbsp;RAM&nbsp;space<br />===============================================<br />这几行的||里面的标号是从哪里获得的?<br />他们是不是就是设置linker的output选项里面填入的RO和RW的值?
wowow 发表于 2007-4-27 09:58 | 显示全部楼层

RO/RW

RO/RW地址在debug/release设置不同的值,一个用于仿真器加载到ram运行,一个用于flash中运行。如果你用了中断,并且ARM不支持REMAP,调ram程序时flash里必须也烧进中断向量表。<br /><br /><br />|Image$$RO$$Base|&nbsp;之类是linker生成的,但有些情况下不生成。最好自己读一读关于linker的pdf
 楼主| sklar 发表于 2007-4-27 12:28 | 显示全部楼层

to luhuaren

&nbsp;&nbsp;&nbsp;你的这些代码我在44Binit.S文件里没有,不过有点懂你说的意思了,ADS里设置的这些地址就是把代码考到SDRAM里的地址?<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,BaseOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//??这里没怎么没说跳到哪里?
luhuaren 发表于 2007-4-27 15:02 | 显示全部楼层

re

当然,PC一上电的值为0,所以这里ResetEntry的值也为0;<br />不好意思,这句话写的不对..........ResetEntry的值得应该是|Image$$RO$$Base|&nbsp;<br /><br />如果RO的值和你程序烧录起始地址的值不同,(如:你设置的RO=0xc000000,注意这个地址是在指向RAM,而你烧录的代码是在0地址处),这样就需要你烧录在0地址开始处的一小部分启动代码把程序从烧录地址搬运到RO设置的地址中去,但要注意,连接器为你连接的地址是以RO为基准的,这样你可能会有个疑问,为什么程序的运行域是以RO(0xc000000)为基准,但处于FLASH(0地址开始)里的一小部分启动代码还能运行呢,这就是因为程序中用了与地址无关的指令,使得一上电,能够顺利的执行0地址处的启动代码<br />注意<br />ENTRY&nbsp;<br />ResetEntry<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;ResetHandler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;for&nbsp;debug<br />这条指令并不是跳转到RO处,它还是跳到了FLASH里,<br />再注意以下几句<br />&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里并不是把真正的ResetEntry的值装入了R0,其实装入R0的值是0,可以看看反汇编,你自然明白&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,BaseOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,r1&nbsp;&nbsp;&nbsp;&nbsp;<br />想必应该可以理解了,如果再不理解,那建议多看看书.
 楼主| sklar 发表于 2007-4-27 16:09 | 显示全部楼层

收了

&nbsp;&nbsp;&nbsp;&nbsp;恩,还得多看了!
时宗 发表于 2007-4-27 19:21 | 显示全部楼层

参考一下CPU datasheet

以24102440为例:SDRAM&nbsp;一般用的是CPU的BANK6和BANK7(各64M),从BANK0到BANK6正好是0X30000000也就是所谓的0地址ResetEntry。
luhuaren 发表于 2007-4-27 19:56 | 显示全部楼层

RE

&nbsp;没搞懂楼上的说的意思。
 楼主| sklar 发表于 2007-4-27 21:22 | 显示全部楼层

11楼可以详细点吗

&nbsp;&nbsp;&nbsp;呵呵,11楼说的我也不明白!<br />期待详细点!
pigjiang 发表于 2007-4-27 22:20 | 显示全部楼层

to luhuaren还有个疑问

&nbsp;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;;计算拷贝程序在flash中的实际位置&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;&nbsp;&nbsp;&nbsp;;****************************************************<br />&nbsp;--&gtldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r2,&nbsp;r1;r2-r1-&gtr1<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,=CopyProcEnd<br /><br />如你所说,前面比较r0和r1结果自然是不等,所以直接运行到这里来了。<br />请问:CopyProcBeg&nbsp;&nbsp;是44binit.s里面的一个标号,它所代表的地址到底应该是在flash里还是在ram里?如果在flash里,那么r2应该小于r1,因为r1=BaseOfROM,那么sub&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r2,&nbsp;r1这个减法是不是有问题?<br /><br />主要是觉得这个时候标号CopyProcBeg&nbsp;&nbsp;应该是在flash里的某一个地址。<br />今天看了一天这段代码也没明白,谢谢指点!
luhuaren 发表于 2007-4-27 22:51 | 显示全部楼层

RE

ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />注意用的是LDR指令<br /><br />由ADS生成的代码的标号是以设置的RO为基准的,也就是说CopyProcBeg是RAM中的一个地址&nbsp;。<br /><br /><br />但是如果你用ADR&nbsp;&nbsp;&nbsp;&nbsp;r2,=CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />这条指令就不一样了,具体怎么不一样,看看指令的解释,但很多地方只是一笔带过,没有很详细的解释,我是看了汇编后代码才明白的<br />它会生成一条类似下面的指令<br />sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,pc,#0x174&nbsp;&nbsp;&nbsp;;&nbsp;#0xc008000<br /><br />以上我理解的应该没有错误,因为我已经在板子上验证过。<br /><br />在我不理解这些的时候,到网上搜索过很多资料,但是没有谁确切的解释过这些东东,后来等我弄明白了以后,在LINUX论坛上发现有讨论U-BOOT的帖子对这些做了很明确的解释。<br />为什么程序的运行域和加载域不同,但启动代码还能在加载域运行,并将加载域的代码拷贝到运行域中去,然后将PC指到运行域中去,在运行域中执行代码,可能是每一个初学者看启动代码时最难理解的地方。理解了这些,其他的,都相对好弄一些/
pigjiang 发表于 2007-4-28 11:09 | 显示全部楼层

谢谢luhuaren的解释。

还需进一步参透:)
TalentHRX 发表于 2016-4-1 16:36 | 显示全部楼层
初学嵌入式,多多指教,前来观贴。。。。。正好遇到同样的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

136

帖子

1

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