1

我正在学习 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);

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

任何机构有任何想法?

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

谢谢

4

1 回答 1

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 内核范式或设计模式工作队列代码需要管理这个结构指针,因此很容易提供给您的got_char例程。您的驱动程序必须将其分配为更大结构的一部分(它在 OO 术语中是继承;它看起来像组合,因为“C”只支持它)。这container_of就像一个 C++ (在任何 C++专家正在寻找dynamic_cast<>的情况下具有单一继承)。它使您可以从子结构中获取组合结构。

于 2013-10-04T18:00:30.273 回答