Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1951434
  • 博文数量: 383
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 4061
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-24 18:53
文章分类

全部博文(383)

文章存档

2011年(1)

2010年(9)

2009年(276)

2008年(97)

我的朋友

分类: LINUX

2008-12-13 16:34:50

#include
#include
#include
#include

static int irq;
static char *interface;

module_param(interface,charp,0644);
module_param(irq,int,0644);

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

static unsigned long data=0;
static struct tasklet_struct mytasklet;//定义小任务
//小任务函数
static void mylet(unsigned long data)
{
printk(”tasklet running.\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 mytasklet_init(void)
{
printk(”init…\n”);
tasklet_init(&mytasklet, mylet,data);//初始化小任务
tasklet_schedule(&mytasklet);

if (request_irq(irq,&myinterrupt,IRQF_SHARED,interface,&irq))
{
printk(KERN_ERR “myirqtest: cannot register IRQ %d\n”, irq);
tasklet_kill(&mytasklet);//删除小任务
free_irq(irq,&irq);//释放中断
return -EIO;
}
printk(”%s Request on IRQ %d succeeded\n”,interface,irq);

return 0;
}

static void __exit mytasklet_exit(void)
{
tasklet_kill(&mytasklet);//删除小任务
free_irq(irq,&irq);//释放中断
printk(”Freeing IRQ %d\n”, irq);

printk(”exit…\n”);

return;
}

MODULE_LICENSE(”GPL”);

module_init(mytasklet_init);
module_exit(mytasklet_exit);

阅读(849) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~