Cortex-M3-建立向量表

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

你可能感兴趣的:(Cortex-M3,Cortex-M3,建立向量表)