Image$$RO$$Limit|等常量的问题
|Image$$RO$$Limit|是不是指数据段,在flash中的起始地址阿(如果代码烧在flash中的话)!
|Image$$RW$$Base|是不是flash中的数据段的在sdram的执行起始地址阿![!21ki@][@21ki!]
|Image$$ZI$$Base|是不是sdram中0地址区起始阿!
|Image$$ZI$$Limit|是不是sdram中0地址区的结束地址阿 !
如果照我理解的没有错的话,下面那段代码把flash中的数据段复制到了sdram中的某个位置,[!21ki@][@21ki!]
然后再sdram中初始化了一个0区域,这个0区域的作用我不是很清楚,猜测是为c程序的变量做准备的,不知对不对!
那么还有一个问题,能不能把代码段也搬到sdram中运行,这样代码的运行速度不是更快了么?我看了好几个版本的启动代码,为什么大家都不这么做!谢谢
启动代码里面有这样一段:
LDR r0, =|Image$$RO$$Limit| ;Get pointer to ROM data[!21ki@][@21ki!]
LDR r1, =|Image$$RW$$Base| ;and RAM copy[!21ki@][@21ki!]
LDR r3, =|Image$$ZI$$Base| [!21ki@][@21ki!] ;Zero init base => top of initialised data[!21ki@][@21ki!]
CMP r0, r1 ;Check that they are different[!21ki@][@21ki!]
BEQ %F1 ;若相等则跳转到1,相同,则不拷贝该区间,初始化零数据区0
CMP r1, r3 ; 如果r0不等于r1,r1和r3比较,Copy init data[!21ki@][@21ki!]
LDRCC r2, [r0], #4 ; --> LDRCC r2, [r0] + ADD r0, r0, #4 [!21ki@][@21ki!]
STRCC r2, [r1], #4 ; --> STRCC r2, [r1] + ADD r1, r1, #4[!21ki@][@21ki!]
BCC %B0 ;当无符号数r1<r3时,跳转到0,也就是说如果r0不等于r1那么就要把r0开始处的数据全部移到r1开始处!r3得值,应该正好是r1的结尾处[!21ki@][@21ki!]
1 [!21ki@][@21ki!]
LDR r1, =|Image$$ZI$$Limit| ;Top of zero init segment, MOV r2, #0 ;r2=0[!21ki@][@21ki!]
2 [!21ki@][@21ki!]
CMP r3, r1 ;比较r3和r1,注意这个时候r1是|Image$$ZI$$Limit|,Zero init[!21ki@][@21ki!]
STRCC r2, [r3], #4 ;当无符号数r3<r1时,把r2的值放到r3的地址处,然后r3=r3+4 --> STRCC r2, [r3] + ADD r3, r3, #4[!21ki@][@21ki!]
BCC %B2 ;当无符号数r3<r1时,跳转到2处,这样做就完成了zi区的初始化清0