以51单片机中断例程为例为例,如下图:
首先,MCU的启动文件(*.S)里面会定义异常向量表,当中断来临时,CPU触发异常跳转到异常向量表地址.而该地址存储的是跳转到中断处理程序指令:
如下图,异常向量表里面以及定义了串行口中断 异常地址0x0023H,而0x0023里面具体内容是LJMP UART0_ISP
当串口0产生中断后,触发CPU跳转到0x0023,在执行跳转函数,进而执行uart0的中断处理函数UART0_ISR(void)函数
2.ARM的异常有哪些:
ARMV7上:ARM异常有RESET,swi(系统调用),undef,prefetch,data abort,irq,fiq.其中RESET,swi是同步异常,其余是异步异常.
ARMV8上:ARM异常有serror,irq,fiq,synchronous,其中Synchronous是同步异常,seoor,irq,fiq是异步异常.
同步异常:软件触发行为,知道什么时候发生,
异步异常:软硬件行为,不知道什么时候发送,发生时间是随机的.
当异常发生时,ARM CORE跳转到异常向量地址(异常基地址+偏移地址)
3.Linux kernel下的arm32如何设置像量表基地址(VBAR)的?
在entry-armv.S中,软件中定义了像量表,_vectors_start是像量表基地址,vector_irq/vector_fiq是像量表中的offset
需要:1.将_vectors_start基地址写入到VBAR寄存器, 2.向量表中的offset要和arm文档中定义的一致.
在vmlinux.lds.S描述了_vectors_start的起始地址位置,从0xff0000开始
在nommu.c中,setup_vectors_base函数通过操作cp15协处理器j将定义在cp15.h中的CR_V(0xffff0000)来写入VBAR.
(其实就是地址开始处,空出64Kb地址给vector使用)
setup_vectors_base会在开机的时候被调用,从而实现VBAR的写入