?这是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
|