【发布时间】: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