zoukankan      html  css  js  c++  java
  • 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中断框架中,结构体调用关系如下:

     

  • 相关阅读:
    linux 和 ubuntu 修改主机名
    Linux删除用户
    ubuntu更新源
    python连接mysql
    用于迭代器的yield return
    Tuple类型
    Action 和 Func
    用iDSDT制作声显卡DSDT
    C#“同步调用”、“异步调用”、“异步回调”
    读懂IL代码就这么简单
  • 原文地址:https://www.cnblogs.com/physworld/p/14826778.html
Copyright © 2011-2022 走看看