小任务机制实例

2008年11月10日 | 由 helight0 | 400字 | 阅读大约需要1分钟 | 归档于 新手上路 |

在调试该程序的时候请保证调试了带参数的中断程序实例内的程序,并且对中断有了一定的学习。

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

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_AUTHOR("Helight.Xu");
MODULE_LICENSE("GPL"); 
module_init(mytasklet_init); 
module_exit(mytasklet_exit);