这是Cortex-M3手册里面截取出来的中断向量表:
系统复位后中断向量表始终是在0x00000000地址。
系统启动后可以对中断向量表进行重定向:
SCB->VTOR = vector_addr;
中断向量表可以看做一个uint32_t类型的数组,数组长度取决于芯片厂商定义多少个中断。
从IRQ0开始属于芯片厂商自定义的中断。
Cortex-M0最多32个中断
Cortex-M3/M4/M7最多240个中断
系统上电时:
第1个成员用于初始化SP寄存器
第2个成员用于初始化PC寄存器
其余成员都指向对应的中断处理程序的地址。
当发生中断的时候,MCU从中断向量表中找到该中断服务程序的地址,跳转过去。
跳转之前,MCU会自动完成部分寄存器的入栈,入栈顺序如下图所示。
中断服务程序返回时,MCU自动完成这部分寄存器的出栈。
关于中断优先级:
中断最多可以用8bit来控制优先级,且数值越小优先级越高
有三个特殊值:HardFault = -1、NMI=-2、RESET=-3
这8个bit又可以分成2组:抢占优先级和子优先级。
下图是优先级的分组方式:
抢占优先级高的,可以打断正在执行的低优先级中断,先执行高优先级中断。
抢占优先级相同的情况下,子优先级之间不会发生抢占。
当多个中断同时发生时,按照以下顺序比较优先级:
抢占优先级 -> 子优先级 -> 中断号
中断向量表实例:
中断向量表是在start.s里面定义好的,编译器会把它放到BIN文件的起始位置。
随便打开一个编译出来的BIN文件进行查看:
因为Cortex-M一般是小端格式,所以每4个字节要倒过来。
前4个字节就是0x1000EA68,它表示上电后的SP值。
接下来4个字节是0x00000101,它表示ResetHandler,它表示上电后的PC值。
PC=0x00000101,所对应的第一条指令就是0x5088F64E。
备注:
PC最低位为1表示是Thumb模式,并不是真实的地址偏移。
指令0x5088F64E的第[15:11]位为11110B,表示这是一条32位Thumb指令。
从这个文件我们还能反向推断出其它的信息:
ROM起始地址是0x00000000
RAM起始地址(可能)是0x10000000
目标MCU肯定不是Cortex-M0
这段代码可能使用了RTOS