Arm处理器之 中断处理
1)在arm处理器中有8种工作模式(及CPU处理不同任务的模式),一般有5中异常模式,而在这5中模式中有三种中断机制,分别是FIQ模式(高优先级中断模式);IRQ模式(低优先级中断模式);还有一种就是SVC模式(当复位或者软中断(SWI)指令执行时产生的模式)
2)首先了解什么是中断机制
在裸机arm中,SOC对硬件中断的支持(中断控制器),那么中断是怎么产生的,当CPU处理器正在执行一条指令的时,突然有外部中断请求或者内部中断的中断信号(中断信号源)
3)由于arm处理器支持硬件中断,对于上图的FIQ和IRQ中断,在arm内核中会引出两条中断线,当CPU在执行完每条指令后,会自动检测中断请求输入线,以确定是否有外部发来的中断请求信号。由于中断可屏蔽,所以一般arm中断初始为屏蔽状态,即IF为1.其实在这里中断请求寄存器不是直接连接到IR中断线的,而是要通过中断控制器来辨别区分以及判断某个时刻多个中断请求的优先级,最终通过中断控制器(控制比较器)传送传送中断请求,而且处理器还会暂停正在译码的指令,指针会跳转到相应的异常向量表。在RAM裸机没有操作系统的情况下,当进入异常处理函数是,内存中我们此时应该建立维护一个异常向量表,初始化栈的空间以便跳转运行的空间,另外还要做一件重要的事情,即是保存现场和处理完异常后的现场恢复,这里通过arm执行指令的流水线发现,当一个中断进入的时候,此时处理器会暂停正在译码的指令,①此时在保护现场的时候,我们应该把保存的LR寄存器的地址值减去4后保存sub lr, lr, #4 stmfd sp!, {r0-r12, lr};
③在出栈的时候只要恢复现场就可以了,一般的操作时 ldmfd sp!, {r0-r12, pc}^ @出栈时同时恢复cpsr
②其实在保护现场后,我们要做的就是怎么去处理相应的中断异常,在汇编中可以通过 B DO_IRQ_FUNC跳转C函数中去完成编写处理函数。
4)中断请求寄存器是于外部接口的中断请求线相连的寄存器,请求中断的外设分别通过IR0~ IR7向中断控制器请求中断服务,并把中断请求的状态保持在中断请求寄存器中,在arm处理器中有3个中断请求寄存器分别处理94个中断请求,当外部有中断请求的时候,会通过相应的逻辑电路的电平会发生变化,这里的中断激发方式有上升沿,下降沿,双边沿,高电平以及低电平,
外部中断管理模块,从 SOC 共有 32 个管脚引出来,
这些管脚是复用的,可以配置成通用输入/输出 IO,也可以配置成唤
醒中断的模式(及内部会连接到中断控制器电路)。 GPIO 模块内部有
三个寄存器对这 32 根管线的中断功能进行管理。
GPH0.GPH0CON = GPH0.GPH0CON & ~(0xf << 8) | (0x2 << 8);
这里通过GPIO 通用输出输入接口的引脚来把KEY的按键设置成中唤醒中断控制模式,这样就可以通过按键来实现IRQ的中断机制
(1)功能寄存器 如图,对管脚的电平激发方式进行管理,可以配
置成高电平激发中断,低电平 、上升沿 、下降沿、双边沿等。
WU_INT0_7_CON = WU_INT0_7_CON & ~(0x7 << 8) | (0x2 << 4);
(2)Mask 寄存器 外部管脚 EINT16 到 EINT31 共 16 根线共用一
根线 EINT(16-31)连接到中断控制器,也就是共用一个中断号(中断
号 16),可能需要在某一个时刻只能有一根管脚线的信号通过模块顺
利进入中断控制器,这个时候就需要将其余的管脚信号屏蔽起来,如
何屏蔽呢?就是设置 mask 里的对应位。
WU_INT0_7_MASK = WU_INT0_7_MASK & ~(1 << 2);
设置MASK寄存器可以使得在一个中断触发时,关闭之后的中断进入,因为处理器在一个特定时间之内只能处理单个中断
(3) Pend 寄存器 记录中断信号标志。如果信号通过了前面的关
口,送入了 VIC,就是将对应线上的 pend 寄存器的对应位值 1,如果
在某一时刻,中断控制器来不起处理当前信号线上的中断请求,那么
pend 位会一直保持着这个请求,哪怕硬件中断线上的中断激发状态
已经过去。同样,需要注意是,如果当前线上的中断已经处理,这个
pend 位也不会自动清零,需要人为的清零。
(4)当前面准备工作完成时,我们还应该做重要的事,即是打开中断控制器相应的中断源开关,此时中断请求信号就可以通过中断控制器从相应的IRQ或者FIQ中断线触发处理器去执行中断,在这里中断控制器还做了一件重要的事情就是把相应的中断处理函数注册到地址寄存器中去,接下来arm处理器就可以默认通过指向地址来实现中断函数,那么怎么通过一个地址来处理函数,就要涉及到函数指针的概念来引用地址(在这里一个函数的函数名就是函数的入口地址)从而去调用中断函数。形如void (* pfunc)(void); pfunc = (void *)address; ;pfunc ();
3)什么是IRQ中断
IRQ的全称是“Interupt ReQuest”,即“中断要求”。当电脑内的周边硬件需要处理 器去执行某些工作时,该硬件就会发出一个硬件信号,通知处理器工作,而这个信号就是IRQ。那为什么叫做“中断”呢?“中断”的意思是即使处理器正在执行 其他工作,当它收到周边设备传来的中断信号时,处理器也会停下来,优先处理这个信号代表的工作,完成后再继续处理之前未完成的工作。
4)什么是 IRQ冲突
IRQ的数目有限,一部电脑虽然一共有16个IRQ(从IRQ0至IRQ15),但是其中很多IRQ已经预先分配给特定的硬件,具体如 下: IRQ0:系统计时器 IRQ1:键盘 IRQ2:可设置中断控制卡 IRQ3:COM2(串行接口2) IRQ4:COM1(串行接口1) IRQ5:未预先配置 IRQ6:磁盘机 IRQ7:并行接口 IRQ8:CMOS/时钟 IRQ9:未预先配置 IRQ10:未预先配置 IRQ11:未预先配置 IRQ12:PS/2鼠标 IRQ13:算术处理器(Arithmetic Processor) IRQ14: Primary(主)IDE控制器 IRQ15:Secondary(从)IDE控制器 由上可见,IRQ5、IRQ9、IRQ10和IRQ11都是 空置的。但大家不要以为这就代表着有多余的IRQ可以使用。因为要使用IRQ的周边设备实在是太多了,例如声卡、网卡等PCI或ISA设备都需要配置一个 IRQ。如果有两个设备配置了同一个IRQ的话,就会出现IRQ冲突的问题,从而使两者都不能正常工作。
5)遇到IRQ冲突怎么办
般主板都有四根或更多PCI插槽。如果全都插上PCI扩展卡,那四个空置的IRQ又怎么够用呢? 其实,某些硬件是可以共用一个IRQ的,而 有些却又偏偏不行。例如PCI声卡需要独自享用一个IRQ,有时甚至需要两个,一个作MIDI(迷笛),一个作Wave(波表)。因此当系统自动分配 IRQ时,若声卡被分配与其他设备共用一个IRQ的话,发生IRQ冲突的可能性极大,而解决之道就是手动分配IRQ,在BIOS内进行设置。
6)软中断
编程异常通常叫做软中断
软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式。
中断源发中断请求或软中断信号后,CPU 或接收进程在适当的时机自动进行中断 处理或完成软中断信号对应的功能 软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。
1. 软中断发生的时间是由程序控制的, 而硬中断发生的时间是随机的
2. 软中断是由程序调用发生的, 而硬中断是由外设引发的
3. 硬件中断处理程序要确保它能快速地完成它的任务, 这样程序执行时才不会等待较长时间
SWI : 软件中断
(Soft ware Interrupt)
SWI{条件} <24 位编号>
指令格式 这是一个简单的设施,但可能是最常用的。多数操作系统设施是用 SWI 提供的。没有 SWI 的 RISC OS 是不可想象的。