標籤:ar art res ad ef 程式 on sp
一個DataAbort異常的觸發過程:
///////////////////////////
///xxxx.inc
_STACK_BASEADDRESSEQU 0x33ff8000
_MMUTT_STARTADDRESSEQU 0x33ff8000
_ISR_STARTADDRESSEQU 0x33ffff00
///xxx.s
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
subsp,sp,#4 ;decrement sp(to store jump address)
stmfdsp!,{r0} ;PUSH the work register to stack(lr does‘‘t push because it
return to original address)
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
HandlerPabort HANDLER HandlePabort
///xxx.s
/* ^ 其實就是 MAP ,這段程式的意思是,從 _ISR_STARTADDRESS
開始,預留一個變數,每個變數一個標號,預留的空間為 4個位元組,也就是 32BIT
,其實這裡放的是真正的C寫的處理函數的地址,說白了,就是函數指標*/
^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
///////////////////////////
xxxx.c
#define _ISR_STARTADDRESS 0x33ffff00
#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))
pISR_PABORT=(unsigned)HaltPabort; //給PABORT中斷入口函數指標賦值。
【 *PABORTFUNC = HaltPabort 】
/////////////////////
中斷觸發時:
1 -- ldr r0,=HandlePabort
2 -- (*(unsigned *)HandlePabort) 即是pISR_PABORT
3 -- pISR_PABORT 即是異常處理函數HaltPabort
4 -- POP 出棧時彈出的是HandlePabort 到PC