Linux中断机制内核API函数request_threaded_irq( )

Linux中断机制内核API函数request_threaded_irq( )

 在内核源码中的位置:linux-2.6.30/kernel/irq/manage.c  函数定义格式:int  __must_check  request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long flags, const char *name , void *dev)

    函数request_threaded_irq( )首先对传入的参数进行正确性检查,根据传入的irq号获得数组irq_desc中以irq为下标的元素,然后动态的创建一个irqaction描述符,根据传入的参数初始化新生成的irqaction描述符,最后调用函数__setup_irq( )把该描述符加入到IRQ链表中,完成中断的动态申请及注册。

如果返回值是0则说明申请成功,如果申请不成功,则返回的值非零,一般为负数,可能的取值-16、-38。例如,如果返回值是-16,则说明申请的中断号在内核中已被占用。

实例解析:

编写测试文件:request_threaded_irq.c

头文件引用及全局变量定义

#include <linux/interrupt.h>

#include<linux/irq.h>

#include <linux/module.h>

MODULE_LICENSE("GPL");   

static int irq=10;       //中段号定义  

static irqreturn_t irq_handler(int data,void *dev_id)

{

       printk("<0>the data is :%d\n",data);   //data是对应中断的中断号

      printk("<0>in the interrupt handler function\n");

     return IRQ_WAKE_THREAD;     //触发中断线程函数执行

}

 

//自定义中断线程处理函数

static irqreturn_t irq_thread_fn(int data,void *dev_id)

{

       printk("<0>the data is :%d\n",data); //data是对应中断的中断号

      printk("<0>in the interrupt thread function\n");

     return IRQ_HANDLED;

}

static int __init request_threaded_irq_init(void) 

{

       int result=0;

       printk("<0>into request_threaded_irq_init\n");

       /* 调用request_threaded_irq( )函数,irq是对应的中断编号,irq_handler是定义的中断处理函数,

         irq_thread_fn是对应的中断线程处理函数,IRQF_DISABLED中断的类型*/

       result=request_threaded_irq(irq,irq_handler,irq_thread_fn,IRQF_DISABLED,"A_New_Device",NULL);

       printk("<0>the result of the request_threaded_irq is: %d\n",result);   //显示函数调用结果

       disable_irq(irq);  //中断不可用

       enable_irq(irq);  //使能中断,触发中断处理函数的执行

       printk("<0>out request_threaded_irq_init\n");

       return 0; 

}

static void __exit request_threaded_irq_exit(void)

       free_irq(irq,NULL);    //释放申请的中断

       printk("<0>Goodbye request_threaded_irq\n");

      return;

}

module_init(request_threaded_irq_init);

module_exit(request_threaded_irq_exit);

编译模块,执行命令insmod request_threaded_irq.ko插入内核模块,然后输入命令dmesg –c查看内核输出信息,出现如图


在模块卸载之前输入命令cat /proc/interrupts查看文件/proc/interrupts的内容,出现如图


在没有加载模块之前,输入命令cat /proc/interrupts查看文件/proc/interrupts的内容

  具体分析请参考文献:《Linux内核API完全参考手册》邱铁,周玉,邓莹莹 编著,机械工业出版社 2011年1月1日出版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值