我正在学习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。我期待键盘上的键号。
任何团体都有任何想法吗?
如果不清楚,请告诉我,我会尝试解释更多。
由于
答案 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 正在寻找的情况下具有单一继承)。它允许您从子结构获取组合结构。