一. 中断向量表
 中断向量表是存放中断向量的表。中断服务程序的入口地址或存放中
 断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。
 
 
当有中断事件发生时,处理器通过中断向量表进入相关的中断服务程序处理事件。
二. 添加中断向量表
1. start.S 文件添加中断向量表
通过正点原子提供的 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf 文档。该文档在参考资料目录下。
找到中断向量表如下:

我们根据以上的中断向量的顺序,在汇编文件 start.S 中添加中断向量表。
start.S 汇编文件中添加的中断向量表如下:
.global _start
.global _bss_start
_bss_start:
    .word _bss_start
.global _bss_end
_bss_end:
    .word _bss_end
_start:
	ldr pc, =Reset_Handler		/* 复位中断  */	
	ldr pc, =Undefined_Handler	/* 未定义中断 	*/
	ldr pc, =SVC_Handler		/* SVC(Supervisor)中断 */
	ldr pc, =PrefAbort_Handler	/* 预取终止中断 */
	ldr pc, =DataAbort_Handler	/* 数据终止中断 */
	ldr	pc, =NotUsed_Handler	/* 未使用中断 */
	ldr pc, =IRQ_Handler		/* IRQ中断 	*/
	ldr pc, =FIQ_Handler		/* FIQ(快速中断)未定义中断 */2. start.S 文件添加中断服务函数
这一篇文章暂时对中断服务函数不做实现。中断服务函数内部暂时都为循环执行。中断服务函数也是汇编实现,也是添加到 start.S 汇编文件中。
如下为添加到 start.S 文件的中断服务函数:
/* 复位中断服务函数 */	
Reset_Handler:     //暂时写为循环执行
    ldr r0, =Reset_Handler
    bx r0
/* 未定义中断服务函数 */
Undefined_Instruction_Handler:
    ldr r0, =Undefined_Instruction_Handler
    bx r0
/* SVC中断服务函数 */
SVC_Handler:
    ldr r0, =SVC_Handler
    bx r0
/* 预取终止中断服务函数 */
Prev_Abort_Handler:
    ldr r0, =Prev_Abort_Handler
    bx r0
/* 数据终止中断 */
Data_Abort_Handler:
    ldr r0, =Data_Abort_Handler
    bx r0
/* 未使用的中断 */
Not_Used_Handler:
    ldr r0, =Not_Used_Handler
    bx r0
/* IRQ中断!重点!!!!! */
IRQ_Handler:
    ldr r0, =IRQ_Handler
    bx r0
/* FIQ中断 */
FIQ_Handler:
    ldr r0, =FIQ_Handler
    bx r0以上写好了中断服务函数的框架。
重点是设置中断向量偏移操作,复位中断服务函数 和 IRQ中断服务函数的具体实现。
复位中断服务函数大体需要做的工作如下:
(1) 关闭 I-Cache,D-Cache 和 MMU。
关闭以上的模块需要用到 CP15 协处理器的一些指令操作。
(2) 设置处理器的 9 种工作模式下对应的SP指针。
(3) 清除 bss段。
(4) 跳到 C 函数,也就是 main() 函数。
接下来的博文说明设置中断向量偏移操作,复位中断服务函数 和 IRQ中断服务函数的具体实现。






![[STM32F103C8T6]看门狗](https://img-blog.csdnimg.cn/f427f1e9465d4d73bd06694e9bf81c8b.png)








![[Java]Cookie机制](https://img-blog.csdnimg.cn/img_convert/95a3396126b1e8d1a4e426a61b924cb7.webp?x-oss-process=image/format,png)


