|
发表于 2013-5-21 09:44:47
|
显示全部楼层
//中断向量,不是绝对地址,是相对偏移
_start:
b reset
@ 0x04: undefined_instruction
HandleUndef:
b HandleUndef
@ 0x08: swi
HandleSwi:
b HandleSwi
@ 0x0c: prefetchAbort
HandlePrefetchAbort:
b HandlePrefetchAbort
@ 0x10: dataabort
HandleDataAbort:
b HandleDataAbort
@ 0x14: reserved
HandleNotUsed:
b HandleNotUsed
@ 0x18: irq
b HandleIrq //注意,这里跳到中断入口!
@ 0x1c: fiq
HandleFiq:
b HandleFiq
reset:
ldr sp, = 0x33000000
bl disable_watchdog
msr cpsr_c, #0xd2 @ irq
ldr sp, = 0x32008000
msr cpsr_c, #0xdf @ svc
ldr sp, = 0x33000000
bl timer0_init
bl irq_init
msr cpsr_c, #0x5f @ I-bit
ldr lr, = halt_loop
ldr pc, = main
halt_loop:
ldr pc, = 0x33f80000 @ reboot //退出时跳到u-boot,以便使用tftp再次下载
@ interrupt subroutine
HandleIrq:
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
ldr lr, = int_return
ldr pc, = Irq_Handle
int_return:
ldmfd sp!, {r0-r12, pc}^
那么如何将中断向量定位到SDRAM起始的地址0x30000000呢? 答案是:在链接时使用-Ttext 0x30000000这个参数。 |
|