тип функции обработчика прерывания ядра (ошибка компиляции)

avatar
Yaron Shragai
9 августа 2021 в 04:35
125
1
-1

Я настраиваю обработчик прерываний ядра с помощью:

        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;

Спасибо!

Источник
Ian Abbott
9 августа 2021 в 09:09
1

Третий параметр обработчика (struct pt_regs *regs) был удален в версии ядра 2.6.19 более 14 лет назад.

0andriy
10 августа 2021 в 20:27
0

Примечание: 53 — это не то, что вы думаете.

Yaron Shragai
11 августа 2021 в 01:56
0

Да, номер отключен. (Ортогонально запросу, но да.)

Ответы (1)

avatar
KMG
9 августа 2021 в 05:19
3

Вы должны определить свой обработчик следующим образом и передать обработчик request_irq().

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

Вторая ваша ошибка заключается в том, что вы говорите, что обработчик получает 3 параметра, хотя должен был получить только два.

Первая ошибка связана с тем, что определения неверны, вы говорите, что обработчик возвращает irq_handler_t, в то время как он должен возвращать irqreturn_t, который является typedef для перечисления. в то время как irq_handler_t является typedef для указателя функции.

Yaron Shragai
9 августа 2021 в 20:40
0

Спасибо, я думаю, что синтаксис указателя на функцию typedef меня несколько сбил.