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

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>

//define a devid

static int mydev=1119;
static int irq;
static char* devname=NULL;

//define arguments for this module

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

//define a argument of tasklet struct

static 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");



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值