发新话题
打印

tasklet实验(加中断后的)

tasklet实验(加中断后的)

#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/sched.h>

static int mycount = 0;
static long mytime = 0;

static int irq;
static char *interface;

module_param(interface,charp,0644);
module_param(irq,int,0644);
          static struct tasklet_struct mytasklet;
        static void mylet(unsigned long data)
{                printk("mylet begin\n");

   if(mycount==0)
   mytime=jiffies;
       if (mycount < 10)
   {
       mytime=jiffies-mytime;
       printk("Interrupt number %d --time %ld \n",irq,mytime);
       mytime=jiffies;
   }
   mycount++;

   return;
}

static irqreturn_t myinterrupt(int intno,void *dev_id)
{
   tasklet_schedule(&mytasklet);
   return IRQ_NONE;
}

static int __init myirqtest_init(void)
{
   static unsigned data=0;
   printk ("My module worked!\n");

   tasklet_init(&mytasklet, mylet, data);


   //if (request_irq(irq,&myinterrupt,SA_SHIRQ,interface,&irq))   //for  2.6.22
   if (request_irq(irq,&myinterrupt,IRQF_SHARED,interface,&irq)) //for  2.2.24
   {
       printk(KERN_ERR "myirqtest: cannot register IRQ %d\n", irq);
       free_irq(irq,&irq);
       return -EIO;
   }
   printk("%s Request on IRQ %d succeeded\n",interface,irq);

   return 0;
}

static void __exit myirqtest_exit(void)
{
   printk ("Unloading my module.\n");

   tasklet_kill(&mytasklet);
   free_irq(irq,&irq);
   printk("Freeing IRQ %d\n", irq);

   return;
}

module_init(myirqtest_init);
module_exit(myirqtest_exit);

MODULE_LICENSE("GPL");
Zhenwen Xu - Open and Free
Home Page:    http://dim4.cn
发新话题