2.中断处理程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.中断处理程序相关的知识,希望对你有一定的参考价值。
-
回顾裸机的流程。在裸机下学期,通过按键玩中断。
裸机中断的过程:
-
中断会有统一的入口:当我们的程序产生中断的时候,无论是哪种中断。都会跳到中断向量表里的_irq这里。这是统一的入口。
2.用户要先注册中断处理程序。
3.根据中断源编号,调用中断处理程序。
接下来我们来看linux的中断,是不是也是这种模式的呢?
我们打开内核工程的entry-armv.S这个文件,在这个文件里有这样的代码:
这就是linux统一的入口:__irq svc.
进入了统一的入口之后,程序会去调用irq_handler:
而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面。
在这个中断处理程序中。最重要的是get_irqnr_and_base获取产生中断的中断源。我们搜一下这个宏,会处理很多。这里我们以24XX的为例:
从上面的程序看到。他主要是获取产生中断的中断号。获得中断号后,会跳转到:arch_irq_handler_defualt里的asm_do_IRQ去处理中断:
跳转到这个函数之后,又会去调用generic_handle_irq(irq)这个函数。
这个函数又会去调用generic_handle_irq_desc这个函数:
在这个函数里又会去调用desc这个结构。
总结:在linux里:当产生中断的时候,会有一个统一的入口,irq_svc.进来之后,第一步是拿到产生中断源的编号,然后根据这个中断号去找到irq_desc这个结构。然后在这个结构里取出事先准备好的注册处理函数。
图1
我们的驱动要支持中断处理,首先必须去实现中断处理程序。第二是要注册中断处理函数。
共享中断号,如我们的图1的0号中断,在结构irq_desc里有多个处理程序。当中断产生的时候,所以的函数会去执行一遍。这样就要求我们在写程序的时候有一个判断,判断是否产生中断了。产生了就执行这函数,没产生就退出该函数。
流程:
Dev_id是指中断里的第几个函数,要注销的。
以上是关于2.中断处理程序的主要内容,如果未能解决你的问题,请参考以下文章