ADS的Setting中有对ARM Linker的设置,其中包括对RO Base和RW Base的设置,这两项设置主要有以下的作用(以S3C2440为例):
1、程序编译完后要烧录到Flash中运行,对于Norflash,程序可以在Norflash中运行,但运行速度受限制,而且,程序中用到的变量必须放在SDRAM中才能正常使用;而对于Nandflash,程序不能在Nandflash中运行,需要在Bootloader中将Nandflah中的程序拷贝到SDRAM中运行(选择Nandflash启动方式时,CPU会自动将Nanflash中的前4k程序复制到stepping stone中运行,stepping stone是ARM自带的SRAM中的一部分,并且,stepping stone会自动映射成0x00地址。所以,此时程序从0x00地址启动时,就能正常运行Nandflash中的程序了。如果选择Norflash启动,内部SRAM在地址0x40000000处)。既然涉及到了程序拷贝,就要用到以下几个常量:
|Image$$RO$$Base| ; Base of ROM code
|Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
|Image$$RW$$Base| ; Base of RAM to initialise
|Image$$ZI$$Base| ; Base of area to zero initialise
|Image$$ZI$$Limit| ; limit of area to zero initialise
程序编译完后,这些常量的值就确定了。其中|Image$$RO$$Base|就是ADS的ARM Linker中的RO Base,|Image$$RW$$Base| 就是ADS的ARM Linker中的RW Base,|Image$$RO$$Limit|、|Image$$ZI$$Base|和|Image$$ZI$$Limit|是编译器根据RO Base和RW Base自动计算出来的。所以,在将程序由flash拷贝到SDRAM的过程中,要用到RO Base和RW Base。
2、在汇编到代码中,会用到label,如:
ResetEntry
b ResetHandler
其中ResetEntry和ResetHandler均为label,这些label的地址位置会在编译后确定,常用ldr伪指令实现跳转到某label处,如:
ldr pc, =copy_proc_beg
执行完上条指令后,pc变为RO Base+offset(offset是copy_proc_beg与代码首地址的偏移量)。
一般来说,RO Base的值为0x00,所以感觉不到RO Base在此处的作用,但对于特殊用途,如将RO Base设置为0x10000000的时候,就能感受到RO Base的用途了。