linux中的中断处理框架

以中断产生的异常为例,产生中断异常以后,最终会调用asm_do_irq函数。

asm_do_irq函数是中断处理流程的入口。

内核里定义了一个irq_desc结构体数组,用来描述各个中断源的状态和行为:

 

 

 asm_do_irq函数会做这些事:

1、定义一个irq_desc结构体类型的指针,指向产生的中断对应的结构体

 

 

 2、调用desc_handle_irq函数

 

 

最终会调用irq_desc结构体成员中的handle_irq函数。

handle_irq成员被调用之前得先被注册一个函数,是哪个函数?

在arch/arm/plat-s3c24xx中的irq.c函数中,有s3c24xx_init_irq函数,根据不同的中断号,定义了irq_desc结构体数组中,各个irq_desc结构体中,各个元素的成员

以外部中断为例:

 

 

 

 

 

 也就是说,调用desc_handle_irq函数,最终会调用中断号对应的irq_desc结构体中,handle_irq成员被注册的函数。以外部中断为例就是handle_edge_irq。

 

handle_edge_irq函数又会做如下两件事(还有别的一些操作,先忽略):

1、调用irq_desc结构体的chip成员:

 

 

 chip主要是做硬件相关的操作,包括清中断,屏蔽中断等。

2、定义一个aciton指针:

 

调用handle_IRQ_event函数:

 

 

 

 

 在handle_IRQ_event函数中,会取出action链表中的成员,再执行aciton->handler :

 

 以上是linux中的中断框架,我们需要在框架中加入自己的中断处理函数,就是注册在aciton->handler上。

 

注册aciton->handler成员是通过request_irq()函数实现。

linux中断框架中,结构体调用关系如下:

 

 

posted @ 2021-05-29 23:32  Feiiiiii  阅读(245)  评论(0编辑  收藏  举报