看了那么多,该动手了。
编写一个模块,在其中加入tasklet。
-------------------------------------------------------------
/*
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 ;
struct tasklet_struct mytasklet ;
void tasklethandler(unsigned long data)
{
printk("I am the process for tasklet./n");
return;
}
//DECLARE_TASKLET(mytasklet,tasklethandler,0);
static int __init myinit(void)
{
//DECLARE_TASKLET(mytasklet,tasklethandler,data);
tasklet_init(&mytasklet,tasklethandler,data);
tasklet_schedule(&mytasklet);
printk("hello!/n");
return 0 ;
}
static void __exit myexit(void)
{
printk("bye!/n");
}
module_init(myinit);
module_exit(myexit);
---------------------------------------------------
上面例子的初始化为
struct tasklet_struct mytasklet ;
tasklet_init(&mytasklet,tasklethandler,data);
调度语句为
tasklet_schedule(&mytasklet);
初始化方式2
注释掉语句/*static unsigned long data = 0 ;*/,用0直接代替data
可更换初始化语句为
DECLARE_TASKLET(mytasklet,tasklethandler,0);
但是记得要写在结构块外面,
我写在myinit模块入口函数里面编译运行,在插入模块时居然死机。重启再试,再死,
/* o(∩_∩)o...,骗兔子,说,这是一个控制键盘灯闪的程序,看---CapsLock和ScrollLock两个键盘绿灯一直不停的闪(死机时候呈现的现象,也不知为什么),她居然将信将疑,哈哈~ */
而以这样的形式出现时,编译出现错误。
static unsigned long data = 0 ;
DECLARE_TASKLET(mytasklet,tasklethandler,data);
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也是很简单的,只是以前的自己把tasklet当成老虎不敢去摸它而已!准备在2.6下改写sharelist)