键盘中断处理程序给出null值

时间:2013-10-02 22:01:38

标签: c linux linux-kernel kernel-module kernel

我正在学习Linux内核模块编程(中断处理程序)并使用教程(http://tldp.org/LDP/lkmpg/2.6/html/)精确模块链接(http://tldp.org/LDP/lkmpg/2.6/html/x1256.html)。

在教程中,当我使用

时出现错误
INIT_WORK(&task, got_char, &scancode);

错误是“错误:宏”INIT_WORK“传递3个参数,但只需2”

所以我找到了一个解决方案并使用以下行

INIT_WORK(&task, got_char);

它工作正常,但我得到的输出是null。我期待键盘上的键号。

任何团体都有任何想法吗?

如果不清楚,请告诉我,我会尝试解释更多。

由于

1 个答案:

答案 0 :(得分:4)

添加如下结构

struct getchar_info {
    /* Other info ... */
    struct work_struct work;
    unsigned int scancode;
    /* Other info ... */
};
static struct getchar_info gci; /* Statically declare or use kmalloc() */

got_char()更改为

static void got_char(struct work_struct *work)
{
    struct getchar_info *info = container_of(work, struct getchar_info, work);
    info->scancode = my_val;
    /* ... */

将其初始化为INIT_WORK(&gci.work, got_char);

这是一个常见的 Linux内核范例或design pattern工作队列代码需要管理此结构指针,以便于向got_char例程提供。您的驱动程序必须将其作为更大结构的一部分进行分配(在OO术语中它是 inheritence ;它看起来像composition,因为'C'只支持它)。 container_of就像一个C ++ dynamic_cast<>(在任何C ++ gurus 正在寻找的情况下具有单一继承)。它允许您从子结构获取组合结构。