嵌入式linux中断浅解

        本文简单理一下嵌入式linux对于ARM系列SoC的中断管理。

        我将嵌入式linux的中断分为了3个级别,分别是:

       1. CPU级:

      嵌入式linux只使用了ARM的IRQ中断,当发生一个IRQ时,CPU会自动执行0x00000018(低端向量模式)或0xffff0018(高端向量模式)处的指令,此处一般放置了一条跳转指令b  addr1,linux对异常向量表的填充是在初始化阶段完成的,调用early_trap_init()函数。

       2.linux内核级:

       当CPU跳转到addr1处后,此处的指令属于linux内核,它会去读取CPU中断寄存器的中断号,然后执行一些其他的指令,最后跳转到用request_irq()注册的函数。

       3.linux用户级:

      用户级就是request_irq()注册的函数,它是驱动开发者自己写的函数,在这个函数里面,可以执行任何想要的操作,比如最简单的是调用printk()打印一段文字到终端。

补充:对于裸机程序,在用到CPU的中断资源时,可以直接:b  EventIRQ,然后在EventIRQ里面执行需要的操作,图1简单描述了中断在硬件上的过程:

                                   

                                                                                 图1:ARM中断的硬件过程

       IRQ进入到irq源寄存器,经过优先级判断,进入irqpend寄存器,只要irqpend里面有中断,就会不断向CPU发出中断信号,CPU在处理中断时,不会理会这些请求,但是,若CPU已经处理完当前的中断,就会接受这些请求,再次中断,所以,每当处理完一个中断时,都应该立即清除IRQPND的中断位和SRCPND的中断位,顺序是先清SRCPND,再清IRQPND。

总结:linux内核对ARM中断的管理,其实就是在ARM的基本中断原理上,添加了抽象,使得中断成为了linux所管理的一种系统级资源,驱动开发人员无需关注ARM本身的中断细节,只需要关心在中断时应该做什么事情,像多线程编程一样,调用request_irq()去注册一个执行流就可以了。

猜你喜欢

转载自blog.csdn.net/huibian1234/article/details/81481307