中断处理中tasklet与工作队列的使用

来源:互联网 发布:js修改div样式 编辑:程序博客网 时间:2024/05/16 12:01
#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/interrupt.h>//define a devidstatic int mydev=1119;static int irq;static char* devname=NULL;//define arguments for this modulemodule_param(irq,int,0644);module_param(devname,charp,0644);//define a argument of tasklet structstatic struct tasklet_struct mytasklet;static void mytasklet_handler(unsigned long data){printk("This is tasklet handler..\n");}static irqreturn_t myirq_handler(int irq,void* dev){    static int count=0;    if(count<10)    {        printk("-----------%d start--------------------------\n",count+1);printk("The interrupt handeler is working..\n");printk("The most of interrupt work will be done by following tasklet..\n");tasklet_init(&mytasklet,mytasklet_handler,0);tasklet_schedule(&mytasklet);printk("The top half has been done and bottom half will be processed..\n");    }    count++;return IRQ_HANDLED;}static int __init mytasklet_init(){    //request a irq    printk("My module is working..\n");    if(request_irq(irq,myirq_handler,IRQF_SHARED,devname,&irq)!=0)    {        printk("tasklet_init:can not request irq %d for %s.\n",irq,devname);        return -1;    }    printk("%s request irq:%d success..\n",devname,irq);    return 0;}static void __exit mytasklet_exit(){    printk("My module is leaving..\n");    free_irq(irq,&irq);    printk("Free the irq %d..\n",irq);}module_init(mytasklet_init);module_exit(mytasklet_exit);MODULE_LICENSE("GPL");


再来一个work queue例子:

#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>#include<linux/interrupt.h>#include<linux/workqueue.h> static int irq;static char *devname;static struct work_struct mywork;module_param(irq,int,0644);module_param(devname,charp,0644);struct myirq{    int devid;};struct myirq mydev={1119};static void mywork_handler(void *data){    printk("work is working\n");}static irqreturn_t myirq_handler(int irq,void *dev){    struct myirq mydev;    static int count =0 ;    mydev=*(struct myirq*)dev;    printk("key:%d\n",count+1);    printk("devid %d isr is working\n",mydev.devid);    printk("botoom half will be working\n");        schedule_work(&mywork);    printk("isr is leaving\n");    count++;    return IRQ_HANDLED;}static int __init myirq_init(){   printk(KERN_NOTICE "MODULE is working...\n");   if(request_irq(irq,myirq_handler,IRQF_SHARED,devname,&mydev)!=0)   {       printk("%s request irq %d faild\n",devname,irq);       return -1;   }   INIT_WORK(&mywork,mywork_handler);   printk("%s request irq %d success \n",devname,irq);   return 0;}static int __exit myirq_exit(){    printk("module is leaving\n");    free_irq(irq,&mydev);    return 0;}module_init(myirq_init);module_exit(myirq_exit);MODULE_LICENSE("GPL");



原创粉丝点击