【问题标题】:kernel interrupt handler function type (compile error)内核中断处理函数类型(编译错误)
【发布时间】:2021-08-09 04:35:56
【问题描述】:

我正在设置一个内核中断处理程序:

        irq_result = request_irq(53, gpeds_hdlr, 0, "gpeds_hdlr", NULL);

然后,我定义我的中断处理程序:

irq_handler_t gpeds_hdlr(int irq, void *dev_id)

编译器抱怨:

/home/pi/module/mod_gpio.c: In function ‘init_function’:
/home/pi/module/mod_gpio.c:86:31: error: passing argument 2 of ‘request_irq’ from incompatible pointer type [-Werror=incompatible-pointer-types]
  irq_result = request_irq(53, gpeds_hdlr, 0, "gpeds_hdlr", NULL);
                               ^~~~~~~~~~
In file included from /home/pi/module/mod_gpio.c:1:
./include/linux/interrupt.h:157:45: note: expected ‘irq_handler_t’ {aka ‘enum irqreturn (*)(int,  void *)’} but argument is of type ‘irqreturn_t (* (*)(int,  void *))(int,  void *)’ {aka ‘enum irqreturn (* (*)(int,  void *))(int,  void *)’}
 request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
                               ~~~~~~~~~~~~~~^~~~~~~

如果我按照一些在线资源的建议这样定义我的中断处理程序:

irqreturn_t gpeds_hdlr(int irq, void *dev_id, struct pt_regs *regs) {

然后我得到一个非常相似的编译错误:

/home/pi/module/mod_gpio.c: In function ‘init_function’:
/home/pi/module/mod_gpio.c:85:31: error: passing argument 2 of ‘request_irq’ from incompatible pointer type [-Werror=incompatible-pointer-types]
  irq_result = request_irq(53, gpeds_hdlr, 0, "gpeds_hdlr", NULL);
                               ^~~~~~~~~~
In file included from /home/pi/module/mod_gpio.c:1:
./include/linux/interrupt.h:157:45: note: expected ‘irq_handler_t’ {aka ‘enum irqreturn (*)(int,  void *)’} but argument is of type ‘irqreturn_t (*)(int,  void *, struct pt_regs *)’ {aka ‘enum irqreturn (*)(int,  void *, struct pt_regs *)’}
 request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
                               ~~~~~~~~~~~~~~^~~~~~~

我该如何克服这个问题?

注意:linux/interrupt.h 包含:

typedef irqreturn_t (*irq_handler_t)(int, void *);

linux/irqreturn.h,包括从linux/interrupt.h,包含:

typedef enum irqreturn irqreturn_t;

谢谢!

【问题讨论】:

  • 处理程序的第三个参数 (struct pt_regs *regs) 在 14 年前的内核版本 2.6.19 中被删除。
  • 旁注:53 不是你想的那样。
  • 是的,号码已关闭。 (与查询正交,但是是的。)

标签: linux linux-kernel linux-device-driver interrupt-handling irq


【解决方案1】:

您应该将您的处理程序定义如下并将处理程序传递给request_irq()

irqreturn_t handler(int irq, void *data){ }

您的第二个错误是因为您说处理程序接收 3 个参数而它应该只接收两个。

第一个错误是因为定义错误你说处理程序返回irq_handler_t,而它应该返回irqreturn_t,这是一个枚举的typedef。而irq_handler_t 是函数指针的类型定义。

【讨论】:

  • 谢谢,我认为函数指针 typedef 的语法让我有些失望。
猜你喜欢
  • 2017-07-30
  • 2010-12-06
  • 2015-10-14
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多