最近学习了Cortex A7内核的中断,发现A7的中断向量表和M3的向量表不太一样。
第一点:
A7的中断向量表内容很少,只有8个中断向量。而M3的中断向量表内容很多,存放了每个外部中断。这其实是因为A7有FIQ或IRQ,当某一外设产生中断时首先进入FIQ或IRQ中断服务函数,然后软件再来识别具体是哪一个中断发生了。A7需要软件进一步识别才能执行具体中断服务函数,而M3硬件直接识别到了具体的中断服务函数。
第二点:
在以前接触的M3,M0,M4等内核单片机中,中断向量表都是通过汇编一个数据段,然后使用DCD指令把各个中断服务函数的入口地址填充到这个数据段。
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
而现在接触的A7中断向量表是通过跳转指令填充的。如下。
_start:
ldr pc, =Reset_Handler
ldr pc, =Undefined_Handler
ldr pc, =SVC_Handler
ldr pc, =PrefAbort_Handler
ldr pc, =DataAbort_Handler
ldr pc, =NotUsed_Handler
ldr pc, =IRQ_Handler
ldr pc, =FIQ_Handler
此时我产生了一个疑问,M3的向量表能不能用跳转指令取而代之呢?亦或是A7的向量表能不能用中断服务函数的入口地址填充呢?经过一番折腾,是不行的。其实这在M3权威指南和A7编程参考手册有明确说明,如下。
M3的中断向量表:存放的是各个中断服务函数的入口地址。
A7的中断向量表:存放的是当中断发生时,响应对应中断服务函数的跳转指令。
虽然都是来自ARM家庭的,但是这一点有本质的区别。