arm中断疑惑:
当中断产生时,通过中断向量表
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b . ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
调转到handlerIRQ,handlerIRQ根据INTOFFSET判断具体是哪个中断,然后进入相应的中断服务程序,
我的疑惑是中断服务程序执行完后,它怎么样回到被打断的地方继续运行,这是一个IRQ的主体程序
IsrIRQ
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
注册一个时钟中断程序:
pISR_TIMER0=(unsigned)timer0Handler;
IsrIRQ注册到了0x18的地方
当时钟time0中断产生时,pc先指向IsrIRQ,然后跳转到pISR_TIMER0这个地址执行具体的中断服务程序,运行完了后,该怎么回来?
我查了一下__irq中断程序关键字,但这个只是会保存中断函数的进入现场,和恢复退出现场,它怎么回到user状态下被打断的地方继续运行? |