第1步:设置异常向量表
AREA INIT, CODE, READONLY
ENTRY
_start
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
注意:
异常向量表的地址、向量个数及顺序必须与ARM规定的一致,
详细情况请参阅博文“ 关于ARM处理器的7种异常模式”
第2步:设计复位异常处理例程
第2.1步:设置处理器模式为管理模式(Supervisor,svc)
通过设置CPSR中的模式位
第2.2步:关闭中断
可通过清零PXA270中断控制器中的ICMR或置位CPSR中的I和F位来实现
第2.3步:设置CPU运行频率
通过设置cpu clock寄存器
第2.4步:配置内存
通过设置内存相关的GPIO及时序参数(需要参考具体内存和CPU的
datasheet中的具体说明)
第2.5步:Disable MMU and enable I-cache
通过操作协处理器cp15的指令实现(清空Write Buffer,I-cache,D-cache,BTB,TLB)
第2.6步:代码重定位
;/*************调试时不要在asm预编译中定义此项,Release版要定义*************/
IF :DEF: CONFIG_SKIP_RELOCATE_BOOTLOADER
relocate ;/* relocate U-Boot to RAM */
adr r0, _start ;/* r0 <- current position of code ,把标号_start所代表的内存地址存入r0 */
ldr r1, _TEXT_BASE ;/* test if we run from flash or RAM ,把标号 _TEXT_BASE所代表的内存地址处的字内容存入r1 */
cmp r0, r1 ;/* don't reloc during debug */
beq stack_setup
LDR r2, _TEXT_BASE
ldr r3, _bss_start
sub r2, r3, r2 ;/* r2 <- size of armboot */
add r2, r0, r2 ;/* r2 <- source end address */
copy_loop
ldmia r0!, {r3-r10} ;/* copy from source address [r0] */
stmia r1!, {r3-r10} ;/* copy to target address [r1] */
cmp r0, r2 ;/* until source end addreee [r2] */
ble copy_loop
ENDIF ;/* CONFIG_SKIP_RELOCATE_UBOOT */
说明:
(1)标号_TEXT_BASE在源码中被定义为:_TEXT_BASE DCD |Image$$RO$$Base|
而符号Image$$RO$$Base是链接器定义的符号,表示bootloader中RO输出节的起
始地址。这个地址值是你在ads 工程设置面板中的:ARM Linker --> Output -->
RO Base中设置的值。
(2) 当bootloader运行于调试模式时,调试器会把bootloader下载到你在RO Base
中设置的地址处,此时r0 和r1的值相等,不需要重定位。而当bootloader
是被烧写到Flash中时,r0中的值就是Flash地址了,此时就和r1中的值不
想等,于是就需要把代码搬移到内存中的RO Base的地址处。
第2.7步:设置管理模式堆栈
如果需要还可以设置其他异常模式的堆栈,也就是给sp赋值
第2.8步:清零ZI段(section)
第2.9步:跳转到C代码