ARM裸机程序开发——中断系统

来源:互联网 发布:vb集成开发环境 编辑:程序博客网 时间:2024/06/08 17:13

★中断控制机制

CPU在运行过程中,怎样知道外部设备需要进行一些事件的处理呢?比如在一个按键程序设计中,按下某个按键,蜂鸣器会发出响声。当按下按键的时候,CPU怎样知道按键已经被按下,并且调用相应的蜂鸣器处理函数呢?在这里有两种方式,一种是轮询,另一种是中断。

◇轮询

轮询就是让CPU不同的循环检测有没有按键被按下,如果检测到按键被按下了,就马上执行其他的操作。但是这种方式会降低CPU的效率,因为当CPU在轮询的时候会浪费大量的时间,而这些时间本可以处理很多其他的事情。

◇中断

中断就是当CPU在处理其他事情的时候,按键被按下,然后通过某种方式通知到CPU,CPU会保存并停止目前做的事情,跳转到一个固定的地址,去处理这个按键中断,处理完之后再回过头来处理前面做的事情。中断的好处就解决了轮询方式产生的缺点,可以大大的提高CPU的效率。

★中断处理流程相关寄存器

中断能提高CPU的效率,那么中断从中断源的产生到时间被CPU处理这个过程中,它的流程是怎样的?有哪些寄存器?分别有什么作用?

◇中断源

中断源有外部中断源与内部中断源之分。内部中断源是指在CPU内部产生的中断信号,例如时钟中断源,串口中断等等。外部中断是指在CPU以外,嵌入式系统中的产生的中断信号,例如:各种传感器等等。

◇中断处理流程

▲S3C2440中断处理流程


(本图来源:http://unicornx.github.io/2016/01/23/20160123-s3c2440-interrupt/)

▲按照中断源进行分类,S3C2440中断处理流程如下


(本图来源:http://blog.csdn.net/lnf_2373837248/article/details/50202005)


◇中断相关寄存器

寄存器编号功能描述SUBSRCPND标明内部复用子中断(如:INT_RXD0)是否发生。S3c2440有15个内部复用子中断,SUBSRCPND中每一位对应一个内部子中断,当这些子中断发生时,相应的位被置为1。清除子中断只需向SUBSRCPND寄存器中相应位写入1。INTSUBMSK用来屏蔽SUBSRCPND寄存器所标示的子中断。某位被设为1时,相应的子中断被屏蔽。设为0时,表示子中断被允许。EINTPEND标明外部复用子中断(如:EINT23)是否发生。S3c2440有20个外部复用子中断,EINTPEND中每一位对应一个外部子中断,当这些子中断发生时,相应的位被置为1。清除子中断只需向EINTPEND寄存器中相应位写入1。EINTMASK用来屏蔽EINTPEND寄存器所标示的子中断。某位被设为1时,相应的子中断被屏蔽。设为0时,表示子中断被允许。SRCPND标识32路中断信号输入上哪些中断发生了。在IRQ中断服务程序中需要清理;在FIQ中断服务程序中也需要清理。INTMASK屏蔽SRCPND,如果一个中断的屏蔽位为1,在该中断发出请求时挂起位还是会被设置为1,但中断请求都不被受理。INTMOD设置哪些中断请求信号为FIQ,哪些为IRQ,但只有一个中断信号输入可以被设置为FIQ模式。PRIORITY配置IRQ的优先级INTPND标识32路中断信号经过屏蔽过滤和仲裁,最后剩下的FIQ和IRQ。在IRQ中断服务程序中需要清理,但在FIQ中断服务程序中不需要清理INTPND。INTOFFSET用于检测INTPND中具体哪个中断端口上有IRQ中断请求发生,直接读取该寄存器的值就对应中断端口号。有关FIQ的信息不用该寄存器检测。EXTINT0~EXTINT224个外部中断分为三组,用这三个寄存器分别用于配置外部中断的触发方式(高电平,低电平,上升沿,下降沿,上升下降均可)。

★中断处理流程是如何工作的

◇如果某个中断源A是独立的中断源,如果发生,则直接经过寄存器SRCPND

◇如果某个中断源B含有子中断,如果发生,则会先经过寄存器SUBSRCPND(用来表明子中断是否发生),然后经过寄存器INTSUBMSK(用来屏蔽SUBSRCPND所标示的中断

◇如果中断源B没有被屏蔽则会经过SRCPND。SRCPND寄存器中的每一位用来标示一个或者一类中断是否已经发生。例如SUBSRCPND寄存器中的子中断INT_RXD0发生了,且没有被INTSUBMSK屏蔽掉则寄存器SRCPND中的INT_UART0位被置1。

◇无论A或者B讲过SRCPND后可能会经过INTMSK寄存器,这个寄存器是用来屏蔽SRCPND所标示的中断。INTMSK某位设置为1时,对应的中断被屏蔽,设置为0时,相应的中断被允许。INTMSK只能屏蔽设为IRQ的中断,不能屏蔽设为FIQ的中断。

◇也有可能会经过INTMOD寄存器。INTMOD寄存器中某位被置1时,它所对应的中断源会被设置为FIQ模式,即此中断发生时,CPU将进入快锁中断模式,这通常用于处理特别紧急的中断。当该位被置位0时,表示IRQ模式

◇当确认的中断为IRQ中断后,就会进行优先级排序。与优先级相关的寄存器是INTPND寄存器。经过优先级仲裁器选出优先级高的中断后,这个中断在INTPND寄存器中的相应位被置1,随后,CPU将进入中断模式处理它。同一时间内,此寄存器只有一位被置1;在ISR中可以根据这个位确定中断类型。清除该中断时,往这个位写入0。

★关于优先级仲裁

S3C2440支持60种中断,如果其中有几种中断源同时产生中断请求,中断控制器该怎么进行处理呢?

 中断控制器采用优先级仲裁比较的方式进行选择,找出优先级最高的中断源。中断控制器将60种中断源分成7组,如下图所示,它类似体育赛事里的比赛方式,所有参赛选手在小组赛PK,选择出小组赛最优秀选手,然后进入决赛阶段和其它小组最优先选择再PK,最后优胜者就是总冠军。其中ARBITER0~ARBITER5为“小组赛”阶段,中断源信号在各自小组里进行优先级仲裁,选择出最高优先级中断信号,每小组选出的中断信号送到ARBITER6,也就是决赛阶段,选择出最高优先级中断信号,交给ARM内核。


1 0