1、异常向量表:
(1)所有的CPU都有异常向量表,是CPU设计是就设定好的,是硬件范畴。
(2)包括但不只是中断。中断只是其中的一种(isr和fiq)异常机制,还有其他的(数据异常、软件中断、未定义指令、重置)
(3)S5PV210 的异常向量表可以改变(在 CP15 协处理器中),以适应操作系统的需求。但是目前系
统刚启动时,此时 DRAM 尚未初始化,程序都在 SRAM 中运行。 210 在 iRAM 中设置了异常向量
表,供暂时性使用。(不懂)
2、中断
(1)关于中断的执行过程:首先,由用户产生一个中断;第一,异常向量表的跳转;第二,进入异常处理部分
(2)异常向量表跳转需要软件执行三个步骤:保存/恢复现场,跳转真正的异常处理程序处。保护现场关键是保存:中断处理程序的返回地址, r0-r12(cpsr 是自动保存的);恢复现场主要是恢复:r0-r12, pc, cpsr。
(3)异常处理分为两步。第一,找到具体的中断。在S5PV210中,一共有四个中断寄存器,每个中断都对应其中一个寄存器中的一个位;第二,找到这个中断对应的中断程序(isr_handler)。在S5PV210中,先由VICnVECTADDR0—31这些寄存器把中断程序的函数名(函数的首地址)保存在相对应的寄存器当中,当发生中断时,由硬件自动把VICnVECTADDR0—31寄存器中发生中断的那个寄存器里面的值(函数首地址)放入到VICnADDR寄存器当中,软件只需要读VICnADDR寄存器中的地址,到相应位置执行程序即可。第一步和第二步是两个寄存器,所以要分开来写。
(4)关于异常处理部分,以我现在的理解,异常处理程序isr_handler是一个大程序,大集合,所有的中断程序都写在这里面,所以才会有第二过程一说,要不然,在第一个过程中,在CPU发现中断,到异常向量表跳转,这时pc已经在isr寄存器中。补充:上面这么理解是正确的,但是在实际操作中,可以使用一种方法(指针函数),在知道是哪个VICnADDRESS寄存器发生中断后,使指针跳转到需要相应的函数当中。
3、中断各个寄存器的作用:
(1)VICnIRQSTATUS和VIC0FIQSTATUS:中断状态寄存器,只读,当发生中断时,由硬件自动置1。
(2)VICnINTSELECT:中断选择寄存器,0:IRQ interrupt;1:FIQ interrupt。
(3)VICnINTENABLE和VICnINTENCLEAR:中断使能/失能寄存器。
(4)VICnVECTADDR0~VICnVECTADDR31:这些寄存器用来保存每个中断源中的函数名(第二阶段的第二步)。
(5)VICnVECPRIORITY0~VICnVECPRIORITY31:中断优先级寄存器。
(6)VICnADDRESS:只读,当发生中断时,硬件自动把中断程序的首地址放在这里。
4、整个中断的流程分为两部分:
(1)初始化部分:
a、绑定第一阶段的异常向量表。
b、失能所有中断,选择中断方式为isq,清空VICnADDRESS寄存器。
c、打开需要使用的中断,并将函数名绑定VICnVECTADDRn寄存器。
(2)中断处理部分:
a、经过异常向量表跳转入 IRQ/FIQ 的入口。
b、做中断现场保护(在 start.S 中),然后跳入 isr_handler。
c、在 isr_handler 中先去搞清楚是哪个 VIC 中断了,然后直接去这个 VIC 的 ADDR寄存器中取 isr 来执行即可。
d、isr 执行完,中断现场恢复,直接返回继续做常规任务。
IRQ:中断请求
isr:中断处理程序