|
;===========================================================
nand_boot_beg
[ {TRUE} ;用于预编译
bl RdNF2SDRAM ;此函数在Nand.c文件中
Mark by xuehui869
]
ldr pc, =copy_proc_beg
;===========================================================
;以下五项由编译器输出,使用的时候根据PC的基地址偏移,注意不是固定的
;;TopOfRom在steppingstone中单步调试的时候为0X000003b8,就像编译后list显示那
;;样;在SDRAM中调试时,显示0x300060cc..根据基地址偏移可变
;反汇编显示窗口中,后面有注释的行就为地址变更之后的值。。
;BaseOfROM DCD |Image$$RO$$Base|
;TopOfROM DCD |Image$$RO$$Limit| ;得到RW在程序存储区数据源的起始地址
;BaseOfBSS DCD |Image$$RW$$Base| ;RW区在RAM里的执行区起始地址
;BaseOfZero DCD |Image$$ZI$$Base| ;ZI区在RAM里面的起始地址
;EndOfBSS DCD |Image$$ZI$$Limit| ;ZI区在RAM里面的结束地址加一
copy_proc_beg ;用来初始化变量,程序实现了RW数据的拷贝和ZI区域的清零功能
adr r0, ResetEntry ;r0=ResetEntry,ResetEntry为复位地址,当
;JTAG时为0x30000000,当上电运行时为0x00000000,为bootstepping或者NOR Flashs首地址
ldr r2, BaseOfROM ;BaseOfROM根据TQ2440的对编译器的默认设置为0x30000000
cmp r0, r2
ldreq r0, TopOfROM ;如果r0 eq r2,就执行ldr r0, TopOfROM
beq InitRam ;如果r0 eq r2,就InitRam,开始执行一系列的初始化过程并启系统。
ldr r3, TopOfROM ;如果r0 no eq r2,就ldr r3, TopOfROM
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
sub r2, r2, r3
sub r0, r0, r2
InitRam
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
感觉TQ2440提供的数据拷贝程序有问题,不完善。。其实好多开发板都是一个版本,
相互改。。。
在CodeWarrior 的设置中,RW Base选项保留为空,那么在编译器编译工程所生成
的映像文件中,RO属性的输出段、RW属性的输出段以及Zi属性的输出段都包含在一个
域中,这些可以从List.txt文件中可以看出,三者定义的地址是顺序相连的,它们之
间的相对位置不用重新加载已经是正确的了。所以直接把这三个段整体拷贝到SDRAM,
就能运行,而不需要再按照各段的值进行加载,因为那样是重复的。。
先说JTAG的情况-----程序是下载到SDRAM中执行的,根据编译器的设置(Image
entry point被设置为0x30000000),PC从ResetEntry(0x30000000)开始执行。映像文件
中,即使有PC偏移,三个段间的相对位置也已经固定和设置好,不需要重新加载(因为
和映像文件是重复的)。
当上电从NAND FLASH启动时-----在4K steppingstone中,PC从ResetEntry
(0x00000000)处执行,在从FLAsh拷贝代码到SDRAM的之后(RdNF2SDRAM),程序执行
copy_proc_beg,但这些操作不对SDRAM有影响,因为PC的基地址是0x0。。。。
NorFlash的情况和上面同。。。
当然,如若RW设置某一固定值,这时就需要根据三个段的值进行加载了,以此来把
源程序和变量按照所编程序的设定放在该放的位置上,使它们的相对空间位置是正确
的。
但是,TQ2440开发板提供的源代码还是应做些改动:
当NAND启动的时候,要执行RdNF2SDRAM,在该函数中应该根据相应的RO、RW、ZI参
数进行拷贝,还要注意偏移量、基地址,以保证三者整体间的空间相对关系如程序所
设计的那样;当是NOR FLASN启动时,如若想把代码拷贝到SDRAM中执行,需要把
copy_proc_beg函数中的RO、RW、ZI、相对地址的偏移量根据情况加上SDRAM的首地址
(0x30000000);JTAG时,不需要改动copy_proc_beg。。。 |
|