ARM架构的中断机制详解(S5PV210芯片)

1、中断介绍

(1)中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行;
(2)中断是为了实现宏观上的并发。比如我们有一台单核CPU的电脑,我们可以在看视频的同时去操作键盘和鼠标,但是单核CPU在同一时刻是只能做一件事情。CPU在大部分时间都是在播放视频,只有在我们操作鼠标和键盘时才去处理鼠标的键盘,但是因为CPU运行特别快,我们感知不到CPU停止播放视频去处理了鼠标和键盘,当我们操作鼠标和键盘时会产生相应的中断,用中断的方式通知CPU要处理鼠标和键盘,这样CPU只在必要的时候去处理鼠标和键盘,处理时间很短,这样CPU在宏观上就可以同时处理多件事;

2、异常和中断的区别

(1)中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC常规业务,或者外部中断。针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常;
(2)异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;

3、异常向量表

3.1、iRAM的地址映射

ARM架构的中断机制详解(S5PV210芯片)_第1张图片

这是S5PV210芯片的iRAM的地址映射图,其中就标明了异常向量表的默认地址、SVC模式的栈空间、IRQ模式的栈空间;

3.2、异常向量表的位置

(1)启动初始阶段:在设备启动的初始阶段,DDR还没有初始化,只有内核的iRAM可以使用,三星对96KB的iRAM进行了规划,其中0xD003_7400–0xD003_7480的128字节存放异常向量表;
(2)内核启动结束:S5PV210的异常向量表的起始位置是可以改变(在CP15协处理器中设置),以适应操作系统的需求;
(3)虽然异常向量表的起始位置可以改变,但是各种异常之间的相对偏移量是不会变的;

3.2、异常向量表的实质

ARM架构的中断机制详解(S5PV210芯片)_第2张图片

(1)从上面可以看出,异常向量表的每一项只占4字节,而异常向量表是用于处理异常的。当异常发生时,CPU跳转到异常向量表处执行,显然4字节的空间是不能存放
下异常处理函数的;
(2)异常向量表的每一项都是函数指针,当异常发生时就调用异常向量表处的函数指针来处理异常;
(3)异常向量表这个机制是CPU决定的,也就是硬件决定的,硬件决定了发生异常时跳转到某个地址处(函数指针)去执行,但是这个地址存放的函数指针是软件开发人员去指定的。硬件决定了发生异常时跳转到异常向量表,但是怎么处理异常是软件开发人员决定的;
参考博客:《ARM的37个寄存器和异常处理机制详解》;

4、中断的保护现场和恢复现场

4.1、为什么要保护/恢复现场

(1)我们去处理中断时,因为CPU在同一时刻只能处理一件事,所以会打断当前正在处理的任务,当我们在处理完中断后要返回来继续处理之前的任务;
(2)我们处理完中断能继续处理之前的任务,前提是要记录下之前任务的状态,这样处理完中断才知道从哪里开始继续处理之前的任务;
(3)保护现场和恢复现场是互为逆过程,在进入中断前保存好正在处理任务的状态,处理完中断后恢复之前任务的状态;

4.2、保护现场

(1)中断从SVC模式来,则保存SVC模式下的必要寄存器的值;
(2)设置IRQ栈,这样才能在IRQ处理函数中使用C语言;
(3)保存LR,LR保存的中断返回地址;
(4)保存R0~R12寄存器,因为R0~R12寄存器是IRQ模式和其他模式共用的;
(5)保存cpsr寄存器到spsr寄存器;

4.3、恢复现场:

(1)把之前保存的SVC模式的R0~R12寄存器的内容恢复;
(2)把spsr寄存器的内容放到cpsr寄存器;
(3)把LR寄存器的内容放到PC寄存器中;

4.4、汇编实现保存现场和恢复现场

#define IRQ_STACK	0xd0037f80

IRQ_handle:
	// 设置IRQ模式下的栈
	ldr sp, =IRQ_STACK
	
	// 保存LR:因为ARM有流水线(默认是3级流水线),所以PC的值会比真正执行的代码+8
	//因为当中断发生时,当前这句指令会执行完,所以我们要保存的是当前指令的下一条指令,这里要将"lr-4"
	sub lr, lr, #4
	
	// 保存r0-r12和lr到irq模式下的栈上面
	stmfd sp!, {r0-r12, lr}
	
	// 在此调用真正的isr来处理中断
	bl irq_handler
	
	// 处理完成开始恢复现场,其实就是做中断返回,关键是将r0-r12,pc,cpsr一起回复
	ldmfd sp!, {r0-r12, pc}^

(1)上面汇编代码是irq中断的处理部分,其中在保存现场和恢复现场中,cpsr寄存器的处理是CPU硬件自动完成的;
(2)IRQ_STACK:这个是IRQ模式下的栈地址,具体信息参考3.1节;注意ARM是用的满减栈,所以栈地址要设置成高位的0xd0037f80地址;

5、异常处理的两个阶段

5.1、第一阶段:异常向量表的跳转

(1)第一个阶段:异常向量表的跳转,硬件自动完成,几乎所有CPU都是一样的;
(2)异常在ARM中是分为几类,比如复位中断(reset)、普通中断(IRQ)、快速中断(FIQ)、未定义指令中断(undefine instruction)等等;
(3)当发生中断时,硬件会判断发生的是哪种中断,并且跳转到对应异常向量表的位置去执行;
(4)前面介绍了异常向量表每个表项实质就是函数指针,这个异常处理函数是需要我们去编写;

5.2、第二阶段:区分出是哪个中断源

(1)异常分为几类,其中中断又分为多个(比如:S5PV210芯片支持上百个中断),在第一阶段中已经跳转到异常向量表的中断处理(IRQ);
(2)IRQ程序的工作逻辑:保存现场->区分出是哪一个中断->调用对应中断处理函数->恢复现场;
(3)芯片会提供机制来让程序员区分出当前发生的是哪一个中断,程序员阅读芯片数据手册中中断部分的说明,就知道如何操作相关寄存器;

6、S5PV210的异常处理机制

参考博客:《S5PV210的中断处理机制详解》;

你可能感兴趣的:(arm,单片机,嵌入式硬件)