Cortex-M3-建立向量表 如果在程序执行的从头到尾,都只给每个中断提供固定的中断服务程序(这也是目前单片机开发的绝大多数情况),则可以把向量表放到 ROM 中。在这种情况下不需要运行时重建向量表。然而,如果想让自己的设备能随机应变地对付各种复杂情况,就常常需要动态地改变中断服务例程,更新向量表就是必需的了。此时,向量表必须被转移到可读写存储器中(如内存)。 在把向量表重定位之前,往往要把现有的向量表往新的位置复制一份。需要拷贝的向量主要是系统异常的服务例程,如各种 fault 的、NMI 的以及 SVC 的等等。如果没有建立好这些向量就启用了新的向量表,就可能会在响应异常时把不可预料的地址取出,程序极有可能跑飞。 当我们把所有必要的向量都填好,就可以启用了新的向量表了。然而继续往里面加入新的中断向量,例如: ; 该子程序根据异常类型建立相应的异常向量 ; 对于IRQ,异常号=中断号+16 ; 入口条件:R0=异常类型编号 ; 入口条件:R1=向量地址 PUSH {R2, LR} LDR R2, =0xE000ED08 ; 向量表偏移量寄存器的地址 LDR R2, [R2] ; 获取向量表的首地址 STR R1, [R2, R0, LSL #2] ; 在VectTblOffset+ExcpType*4处写入向量 ; ExcpType*4 POP {R2, PC} ; Return