- Startup中断向量表
;*******************************************************************************
; Exception vectors
;*******************************************************************************
LDR PC, Reset_Addr ; 地址为0x8000 0000
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
; *******************************************************************************
; Exception handlers address table
;*******************************************************************************
Reset_Addr DCD __program_start ;地址为0x8000 0020
Undefined_Addr DCD UndefinedHandler
SWI_Addr DCD SWIHandler
Prefetch_Addr DCD PrefetchAbortHandler
Abort_Addr DCD DataAbortHandler
DCD 0 ; Reserved vector
IRQ_Addr DCD IRQHandler
FIQ_Addr DCD FIQHandler
;*******************************************************************************
; Peripherals IRQ handlers address table
;*******************************************************************************
PRCCUCMU_Addr DCD PRCCUCMUIRQHandler ;地址为0x8000 0040
对于嵌入式系统来说,一般将上面产生的代码放在flash中,地址0x8000 0000(该sector同时remap到0x0000 0000)。将__program_start,UndefinedHandler等地址放到指令缓冲池中。从而可以实现全局范围内跳转。根据ARM指令长度可知,上述__program_start的地址存放的物理地址是0x8000 0020,根据ARM流水线的情况,LDR PC, Reset_Addr产生汇编语言指令为LDR PC, [PC, #24]。
当IRQ中断发生时,程序跳转到IRQHandler处。
- IRQHandler
IRQHandler
SUB lr,lr,#4 ; Update the link register
SaveContext r0,r12 ; Save the workspace plus the current
; return address lr_ irq and spsr_irq.
LDR lr, =ReturnAddress; Read the return address.

本文介绍了在ARM嵌入式系统中,如何处理中断IRQ。启动时,中断向量表位于0x8000 0000地址,当IRQ中断发生时,程序跳转到IRQHandler,保存上下文,读取返回地址,然后根据EIC_base_addr和IVR_off_addr定位到中断服务程序并清除中断标志位,最后恢复上下文并返回执行。中断服务程序的地址通过安装中断向量服务程序时设置的IVR寄存器确定。
最低0.47元/天 解锁文章
1402

被折叠的 条评论
为什么被折叠?



