inside uboot (三) 异常向量表
1. 異常向量表概述
從上面的地址映射來(lái)看,中斷向量表的地址為0xD0037400,因此如果我們想在SRAM中,也就是BL1中處理異常的話,
就需要把我們的異常向量表拷貝到這個(gè)地址上。或者我們可以在鏈接腳本中直接指定代碼的地址。
如果在主內(nèi)存中,我們要使用異常向量表的話,我們需要配置CP15協(xié)處理器中的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后面就是異常向量表了,但是異常向量表的實(shí)際函數(shù)地址被通過(guò)一個(gè)CONFIG_SPL_BUILD的
宏分別定義。v210 的uboot被同過(guò)這個(gè)宏分別編譯成了兩個(gè)uboot,BL1和BL2,一個(gè)在SRAM中執(zhí)行,一個(gè)在主內(nèi)存中執(zhí)行。
從上面代碼可以看出,BL1中的異常函數(shù)什么也沒(méi)有做,BL2中是有真正的實(shí)際用途的異常函數(shù)。
3. 設(shè)置異常向量表,在BL1中的異常向量表地址應(yīng)該設(shè)置在0xD0037400這個(gè)地址上。但是搜索了整個(gè)uboot代碼,并沒(méi)有找
到。可以是因?yàn)锽L1中的異常函數(shù)本身沒(méi)有用處吧。下面說(shuō)一下,在BL2中的異常向量表的地址設(shè)置。
4. BL2中的異常向量表設(shè)置代碼。
/* 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,目的是將異常向量的基地址設(shè)置為0。
datasheet手冊(cè)的寄存器說(shuō)明見(jiàn)下圖。
?
/* Set vector address in CP15 VBAR register */ldr r0, =_startmcr p15, 0, r0, c12, c0, 0 @Set VBAR然后將異常向量表的地址設(shè)置到VBAR寄存器中,寄存器的地址說(shuō)明見(jiàn)下圖。
?
總結(jié)
以上是生活随笔為你收集整理的inside uboot (三) 异常向量表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 民生visa全币种信用卡怎么还款
- 下一篇: Package ‘*****‘ has