1. 异常向量表概述
从上面的地址映射来看,中断向量表的地址为0xD0037400,因此如果我们想在SRAM中,也就是BL1中处理异常的话,
就需要把我们的异常向量表拷贝到这个地址上。或者我们可以在链接脚本中直接指定代码的地址。
如果在主内存中,我们要使用异常向量表的话,我们需要配置CP15协处理器中的VBAR寄存器。
2. 中断向量表代码
_start: b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq
#ifdef CONFIG_SPL_BUILD
_undefined_instruction: .word _undefined_instruction
_software_interrupt: .word _software_interrupt
_prefetch_abort: .word _prefetch_abort
_data_abort: .word _data_abort
_not_used: .word _not_used
_irq: .word _irq
_fiq: .word _fiq
_pad: .word 0x12345678 /* now 16*4=64 */
#else
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_pad: .word 0x12345678 /* now 16*4=64 */
#endif /* CONFIG_SPL_BUILD */
从上面代码可以看出,b reset后面就是异常向量表了,但是异常向量表的实际函数地址被通过一个CONFIG_SPL_BUILD的
宏分别定义。v210 的uboot被同过这个宏分别编译成了两个uboot,BL1和BL2,一个在SRAM中执行,一个在主内存中执行。
从上面代码可以看出,BL1中的异常函数什么也没有做,BL2中是有真正的实际用途的异常函数。
3. 设置异常向量表,在BL1中的异常向量表地址应该设置在0xD0037400这个地址上。但是搜索了整个uboot代码,并没有找
到。可以是因为BL1中的异常函数本身没有用处吧。下面说一下,在BL2中的异常向量表的地址设置。
4. BL2中的异常向量表设置代码。
/* Set V=0 in CP15 SCTRL register - for VBAR to point to vector */mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTRL Registerbic r0, #CR_V @ V = 0mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTRL Register
首先操作CP15的SCTLR寄存的的第13位为0,目的是将异常向量的基地址设置为0。
datasheet手册的寄存器说明见下图。
/* Set vector address in CP15 VBAR register */ldr r0, =_startmcr p15, 0, r0, c12, c0, 0 @Set VBAR
然后将异常向量表的地址设置到VBAR寄存器中,寄存器的地址说明见下图。