这里有必要澄清一下,呵呵
我发现在OALTimerInit中将要调用AT91SAM926x_InitSystemTimer,这个函数就是按照设定的时间(我设为5ms)来产生系统所需的tick,利用cpu内部的周期性定时器到时间就要产生一个tick中断,现在发现定时器已经可以工作,但是无法进入armtrap.s里的IRQHandler,也就是说并没有跳到指定的0xFFFF0000.所以就研究起中断向量地址来了,事情就是这样的.
多谢paul_chao 兄指教!你所说的那个决定位我明白,应该就是下面的0x3200地方吧,呵呵
mfc15 r1, c1
orr r1, r1, #0x007F ; changed to read-mod-write for ARM920 Enable: MMU, Align, DCache, WriteBuffer
orr r1, r1, #0x3200 ; vector adjust , ICache, ROM protection
ldr r0, VirtualStart
cmp r0, #0 ; make sure no stall on "mov pc,r0" below
mtc15 r1, c1 ; enable the MMU & Caches
mov pc, r0 ; & jump to new virtual address
我以前就是按照书上所说的认为wince在异常时选择跳转到高向量地址0xFFFF0000处,此处放了VectorInstructions,然后在0xFFFF03E0处放置了VectorTable,但昨天特意在armtrap.s中kernelStart开头的PTs地址转换后面如下:
convert base of PTs to Physical address
ldr r4, =PTs ; (r4) = virtual address of FirstPT
mov r0, r4 ; (r0) = virtual address of FirstPT
mov r1, r11 ; (r1) = &MemoryMap (2nd argument to PaFromVa)
bl PaFromVa
mov r10, r0 ; (r10) = ptr to FirstPT (physical)
加入了一段指令如下:
LDR r4,=0x300000
STR r10,[r4]
LDR r4,=0x300004
add r7, r10, #ExceptionVectors-PTs ; (r8) = ptr to vector page
STR r7,[r4]
loop2
B loop2
就是为了看看r10的值是否就是FirstPT虚拟地址(0xFFFD0000)的对应物理地址,因为这个将影响到
后来的在0xFFFF0000处放置VectorInstructions,但是发现并不是它的物理地址(我将它的值暂存进RAM观察到的),同时
r7也不是希望的0xFFFF0000对应的物理地址.就是不明白既然是放在高向量地址,它怎样和0xFFFF0000建立联系??
建立exception vectors的过程如下:下面的r8就是通过 add r8, r10, #ExceptionVectors-PTs来得到的.
add r7, pc, #VectorInstructions - (.+8)
ldmia r7!, {r0-r3} ; load 4 instructions
stmia r8!, {r0-r3} ; store the 4 vector instructions
ldmia r7!, {r0-r3} ; load 4 instructions
stmia r8!, {r0-r3} ; store the 4 vector instructions
IF {FALSE}
sub r0, r8, #8*4
mov r1, #8 ; dump 8 words
CALL WriteHex
ENDIF
; convert VectorTable to Physical Address
ldr r0, =VectorTable ; (r0) = VA of VectorTable
mov r1, r11 ; (r1) = &OEMAddressTable[0]
bl PaFromVa
mov r7, r0 ; (r7) = PA of VectorTable
add r8, r8, #0x3E0-(8*4) ; (r8) = target location of the vector table
ldmia r7!, {r0-r3}
stmia r8!, {r0-r3}
ldmia r7!, {r0-r3}
stmia r8!, {r0-r3}