什么是arm中断向量表
发布网友
发布时间:2022-04-05 13:40
我来回答
共4个回答
热心网友
时间:2022-04-05 15:09
发生一个中断时,一般都要执行一段中断处理程序。在ARM中预先定义了许多芯片支持的中断类型,但是中断处理程序需要用户自己去写,这样ARM只对不同的中断类型提供了一个预定义的地址,但是这些预定义的地址里面是不够存放用户编写的中断处理程序的。
用户自己写了中断处理程序,然后把中断处理程序的入口放在系统预定义的中断地址处,这样在发生中断后就会跳转到用户编写的中断处理程序处。
中断很多,形成了一个跳转表,成为中断向量表
热心网友
时间:2022-04-05 16:27
arm中断向量表是指 arm在指令执行期间发生异常时,PC自动指向某一地址取指令执行中断响应程序,而PC指向的地址不唯一,这些地址与不同的异常一一对应,这些地址固定的映射到物理内存的低地址,这一段专门用来处理中断响应的地址就构成中断向量表。
热心网友
时间:2022-04-05 18:02
初看ARM中断系统觉得有点乱,写点东西希望对大家有点帮助
中断详细建立过程(1)
首先我们先来看两个东西.
;/* EXCEPTION HANDLER VECTOR TABLE */
^ DRAM_BASE
HandleReset # 4
HandleUndef # 4
HandleSwi # 4
HandlePrefetch # 4
HandleAbort # 4
HandleReserv # 4
HandleIrq # 4
HandleFiq # 4
小注: 这里的^是MAP,#是FIELD
也就是在DARM的BANK0里面开始的地方定义了一个中断向量表,用于存放中断程序的入口地址。
ExceptionHandlerTable
DCD UserCodeArea
DCD SystemUndefinedHandler
DCD SystemSwiHandler
DCD SystemPrefetchHandler
DCD SystemAbortHandler
DCD SystemReserv
DCD SystemIrqHandler
DCD SystemFiqHandler
这个表中存放的是汇编程序中中断处理函数的入口地址,每一项对应一个中断函数。
下面我们从程序的开始处分析:
AREA Init, CODE, READONLY
ENTRY
B Reset_Handler
B Undefined_Handler
B SWI_Handler
B Prefetch_Handler
B Abort_Handler
NOP Reserved vector
B IRQ_Handler
B FIQ_Handler
FIQ_Handler
SUB sp, sp, #4
STMFD sp!, {r0} FD满递减堆栈 执行寄存器压栈操作.
LDR r0, =HandleFiq 汇编里的处理函数地址,然后跳到C中,在DRAM。
LDR r0, [r0] 中断向量地址给R0.
STR r0, [sp, #4] 中断向量地址给
LDMFD sp!, {r0, pc}
在程序的开始处,首先建立了默认的中断调用函数.这个过程大家一定非常熟悉,
首先执行了压栈,然后给出了中断入口地址.这个HandleFiq就是我们前面提到的在DRAM中建立的中断向量其中一个的地址。
在HandleFiq开始的四个字节中,放着汇编中断处理函数的入口地址。
汇编中断处理函数的地址是如何放到DRAM中断向量表里的呢?
我们上面提到的另一个表就发挥作用了。看下面这段程序:
EXCEPTION_VECTOR_TABLE_SETUP
LDR r0, =HandleReset
LDR r1, =ExceptionHandlerTable
MOV r2, #8
ExceptLoop
LDR r3, [r1], #4
STR r3, [r0], #4
SUBS r2, r2, #1 Down Count
BNE ExceptLoop ;; 从表里取出来给了HandleReset后面的空间
这一段把ExceptionHandlerTable里的中断处理函数的地址拷贝给了DRAM里的中断向量表。这样两者就联系起来
在执行程序开始的跳转之后就自然跳到了*******Handler.真正的处理函数之一如下所示:
它实际上只调用了C语言的中断处理函数,其他什么也没做。
SystemFiqHandler
IMPORT ISR_FiqHandler
STMFD sp!, {r0-r7, lr}
BL ISR_FiqHandler
LDMFD sp!, {r0-r7, lr}
SUBS pc, lr, #4
它实际上只调用了C语言的中断处理函数,其他什么也没做。
void ISR_FiqHandler(void)
{
IntOffSet = (U32)INTOFFSET;
(IntOffSet>>2)
(*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine
}
热心网友
时间:2022-04-05 19:53
就是什么情况下会终端