这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请再解释一个关于ADS中ro/rw base的疑惑(已查阅资料)!

共1条 1/1 1 跳转至

请再解释一个关于ADS中ro/rw base的疑惑(已查阅资料)!

菜鸟
2005-08-26 06:51:47     打赏


首先说一下,我认为我还是看了不少的资料,然后再来问这个问题的,看起来下面我写的很多,其实我只是想把问题描述清楚一点,我认为我已经写的比较详细了,所以应该不会耽误各位大侠多少时间,所以希望能耐心看完,谢谢 !

我的CPU是4510,我在各种资料上都看过相关的解释:
-ro-base address(即设定Image$$RO$$Base--我的理解)
这个选项将包含有RO(Read-Only属性)输出段的加载地址和运行地址设置为address,
该地址必须是字对齐的,如果没有指定这个选项,则默认的RO基地址值为0x8000。
-rw-base address
这个选项设置包含RW(Read/Write属性)输出段的域的运行时地址,该地址必须是字对
齐的。

Image$$RO$$Base is the address of the read-only execution region (usually
contains code and read-only data).--ro运行时地址

Image$$RW$$Base is the address of the read-write execution region (usually
contains data).--rw运行时地址

所以大致意思,我是知道的,不过在还是在有几个问题想不明白:

问题1、就是这个设定的Image$$RO$$Base与我们复位时CPU读取第一条指令的 0x0 地址有什么关系?这个“Image$$RO$$Base”到底又设定了那些源代码的运行起始地址?比如在一个Bootloader中,往往包含同时包含汇编代码和C语言代码两部分,这个“Image$$RO$$Base”只设定了C语言中RO段的运行地址 ?(拷贝RO RW段代码到Image$$RO$$Base,Image$$RW$$Base标识的位置是我的bootloader 汇编代码进入C前做的最后一件事)
如果说也设定了汇编中ro部分代码的运行地址,那问题2又怎么解释 ?

问题2、有人说“请注意,将工程编译为烧入Flash的二进制代码时,需要将链接器重新设置,将调试时程序空间定位地址(RO Base地址)改为0x00000000”,但我明明刚刚编译的Bootloader就将ro base设为了0xf00000,现在我已将其烧写入Flash中测试过,Bootloader运行良好,而且在上电时Flash首先被映射到0地址开始的地方,这与设定的0xf00000差的很远,当然在程序将进入C语言前,会remap SDRAM到0~16M空间,并将RO RW段拷贝到Image$$RO$$Base,Image$$RW$$Base标识的位置,问题是这个拷贝之前我的所有代码(比如SDRAM初始化,remap,堆栈初始化等)都运行的很正常,这又怎么解释呢?
这样一来我到有个奇怪的想法就是,如果我的程序没有C语言代码,岂不是就可以不用管这个ro base的设置?因为从一开机到拷贝ro/rw段前,我所有的汇编代码执行良好。

问题3、我的vector.S中复位入口“ResetEntry”的部分代码如下,用AXD载入ADS编译的这个.bin文件的时候可以看到,这个“ResetEntry”标号开始的代码被编译到了.bin文件的最前面,因为我在链接设置里面把reset section放在了img的最前面。我有点不明白就是这个“ResetEntry”标号代表着的一个地址与Image$$RO$$Base又有什么关系 ?与复位时CPU读取第一条指令的 0x0 地址又有什么关系?因为我的Bootloader在拷贝ro段代码时用到了这个标号,同时我的Bootloader代码也并不是真正放在Flash的起始部分(即开机的0地址处),只是在0地址处放了一条跳转到Flash的高端,再执行哪里存放的Bootloader代码。

AREA reset, CODE, READONLY
ENTRY
;复位和上电启动的入口
ResetEntry
b SYS_RST_HANDLER
b UDF_INS_HANDLER
.........................................


4、我在AXD调试程序时还发现,调试过程中我可以把ADS生成的.bin文件载入SDRAM中任何位置,然后修改pc值执行之,不论你的Image$$RO$$Base,Image$$ROW$$Base设定在什么地方,当然我的这个调试的程序肯定没有对ro/rw段做任何的拷贝操作。这让我更对RW段运行时地址和Image$$ROW$$Base的关系感到疑惑,因为rw段中不是保存有程序需要的变量或数据么?Image$$ROW$$Base设定了rw段的运行地址,那岂不是也就设定了运行时变量或数据在内存中的存在位置?那我用AXD加载的这个程序又在哪里获得的程序运行需要的变量和数据呢 ?

上面的问题其实一直就困扰了我好久,不过因为项目方面比较急,所以也就一直放在哪里没有对其深究,现在稍微有点空,才放到网上来,请各位解惑,非常感谢 !
我的表达能力也不怎么好,上面的问题也许有点罗嗦,如果还有什么没有说清楚的也希望能提出来,3KS ag !

[align=right][color=#000066][此贴子已经被作者于2005-8-26 9:48:25编辑过][/color][/align]



关键词: 请再     解释     一个     关于     疑惑     查阅     资料     这个         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]