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中断框架中,结构体调用关系如下:

     

  • 相关阅读:
    各大代码托管服务器的分析比较
    《构建之法》读后
    【转】简单的程序诠释C++ STL算法系列之十五:swap
    【转】error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
    C++大会感悟
    一次DDOS攻击引起的安全漫谈
    为npm设置代理,解决网络问题
    Rust 中的类型转换
    Rust 智能指针(二)
    软件设计原则
  • 原文地址:https://www.cnblogs.com/physworld/p/14826778.html
Copyright © 2011-2022 走看看