发新话题
打印

tasklet学习实例

tasklet学习实例

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

static unsigned long data=0;
static struct tasklet_struct tasklet;

static void mylet(unsigned long data)
{
            printk(KERN_ALERT "tasklet running.\n");

            return;
}

static int __init mytasklet_init(void)
{
            printk(KERN_ALERT "init...\n");
            tasklet_init(&tasklet, mylet,data);
            tasklet_schedule(&tasklet);

            return 0;
}

static void __exit mytasklet_exit(void)
{
            tasklet_kill(&tasklet);
            printk(KERN_ALERT "exit...\n");

            return;
}

MODULE_LICENSE("GPL");

module_init(mytasklet_init);
module_exit(mytasklet_exit);
Zhenwen Xu - Open and Free
Home Page:    http://dim4.cn
OK,that's it

问题

以这样的初始化形式出现时,编译出现错误。

static unsigned long data = 0 ;
DECLARE_TASKLET(mytasklet,tasklethandler,data);

源程序
-------------------------------------------------------------
/*
tasklettest.c
*/

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

MODULE_LICENSE("GPL");

static unsigned long data = 0 ;

void tasklethandler(unsigned long data)
{
    printk("I am the process for tasklet.\n");
    return;   
}

DECLARE_TASKLET(mytasklet,tasklethandler,data);  /* line 19*/


static int __init myinit(void)
{   
         tasklet_schedule(&mytasklet);    printk("hello!\n");
   
    return 0 ;
}
static void __exit myexit(void)
{
    printk("bye!\n");
}
module_init(myinit);
module_exit(myexit);

----------------------------------------------

make: Entering directory `/usr/src/linux-headers-2.6.22-14-generic'

  CC [M]  /home/ganxiebin/tasklettest.o

/home/ganxiebin/tasklettest.c:19: 错误: 初始值设定元素不是常量

/home/ganxiebin/tasklettest.c:19: 错误: (在 ‘mytasklet.data’ 的初始化附近)

make[1]: *** [/home/ganxiebin/tasklettest.o] 错误 1

make: *** [_module_/home/ganxiebin] 错误 2

make: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic'

原因?

还有个问题:如果在退出时候不用tasklet_kill函数,会出现什么问题吗?
DECLARE_TASKLET(mytasklet,tasklethandler,data);  /* line 19*/
你吧这句话放到 tasklet_schedule(&mytasklet);之前试试 ,应该在退出的时候使用tasklet_kill,他会将后半部分终止执行。
DECLARE_TASKLET知是一个宏,并不是一个单独的函数,在内核源码中其实就是一句
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
这样的话但让不应该在代码的中间的,要么在文件的程序中使用,要么和全局变量方在一起,怎么能出现在函数中间呢?
上面说错了是 ,怎么能出现在函数之间
不知说了些什么东西,也不给程序做个说明

^^

谢谢师兄的耐心讲解~
这里的程序我都是在调试过后的,解答也是在调试之后的结果,我的文字描述不是很好,当是我会尽量的。
发新话题