ARM異常---一個DataAbort的觸發過程:

來源:互聯網
上載者:User

標籤: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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.