七度黑光--当感到一切都毫无头绪的时候,最好静下心来从基础开始.

tasklet学习实例

上一篇 / 下一篇  2008-05-07 03:42:08 / 个人分类:linux学习笔记

查看( 963 ) / 评论( 8 )
#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);


TAG:

InfoHunter infohunter 发布于2008-05-07 10:33:57
OK,that's it
xdd123www发布于2008-05-09 01:42:15
问题
以这样的初始化形式出现时,编译出现错误。

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函数,会出现什么问题吗?
七度黑光 helight 发布于2008-05-10 02:44:04
DECLARE_TASKLET(mytasklet,tasklethandler,data);  /* line 19*/
你吧这句话放到 tasklet_schedule(&mytasklet);之前试试 ,应该在退出的时候使用tasklet_kill,他会将后半部分终止执行。
七度黑光 helight 发布于2008-05-10 03:01:37
DECLARE_TASKLET知是一个宏,并不是一个单独的函数,在内核源码中其实就是一句
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
这样的话但让不应该在代码的中间的,要么在文件的程序中使用,要么和全局变量方在一起,怎么能出现在函数中间呢?
七度黑光 helight 发布于2008-05-10 03:02:49
上面说错了是 ,怎么能出现在函数之间
Imcomplete zhull1052 发布于2008-05-12 00:35:03
不知说了些什么东西,也不给程序做个说明
xdd123www发布于2008-05-13 06:20:02
^^
谢谢师兄的耐心讲解~
七度黑光 helight 发布于2008-05-13 12:03:57
这里的程序我都是在调试过后的,解答也是在调试之后的结果,我的文字描述不是很好,当是我会尽量的。
我来说两句

(可选)

日历

« 2008-09-08  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 6551
  • 日志数: 45
  • 图片数: 1
  • 文件数: 1
  • 书签数: 3
  • 建立时间: 2008-03-07
  • 更新时间: 2008-09-08

RSS订阅

Open Toolbar