Linux内核:从内核空间调用用户空间中的回调函数

时间:2017-07-06 13:14:31

标签: linux linux-kernel linux-device-driver embedded-linux

我正在编写Linux用户空间应用程序。我想从内核空间调用用户空间区域中的已注册回调函数。

即。中断到达GPIO引脚(开关按下事件),并在用户空间中调用注册功能。

有没有任何方法可以做到这一点。

谢谢

2 个答案:

答案 0 :(得分:1)

我经过多次挖掘后发现了以下代码,对我来说非常适合。

处理来自GPIO的中断 在许多情况下,可以将GPIO输入配置为在产生中断时产生中断 更改状态,允许您等待中断而不是轮询 一个低效的软件循环。如果GPIO位可以产生中断,则文件边缘 存在。最初,它的值为none,这意味着它不会产生中断。 要启用中断,可以将其设置为以下值之一: •上升:上升沿中断 •下降:下降沿中断 •both:上升沿和下降沿均中断 •none:无中断(默认) 您可以使用poll()函数等待中断,并将POLLPRI作为事件。如果 如果要等待GPIO 48的上升沿,首先要启用中断:

#echo 48> / sys / class / gpio / export

#echo rising> / SYS /类/ GPIO / gpio48 /边缘

然后,使用poll()等待更改,如下面的代码示例所示:

 #include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <poll.h>>

 int main(void) {

         int f;
         struct pollfd poll_fds [1];
         int ret;
         char value[4];
         int n;

         f = open("/sys/class/gpio/gpio48", O_RDONLY);
         if (f == -1) {
              perror("Can't open gpio48");
              return 1;
         }

         poll_fds[0].fd = f;
         poll_fds[0].events = POLLPRI | POLLERR;

         while (1) {
              printf("Waiting\n");

              ret = poll(poll_fds, 1, -1);
              if (ret > 0) {
                  n = read(f, &value, sizeof(value));
                  printf("Button pressed: read %d bytes, value=%c\n", n, value[0]);
              }
         }     
      return 0; 
}

答案 1 :(得分:0)

必须在内核模块中实现一个处理程序,例如一个char设备。从用户空间可以通过轮询(例如ioctl()调用)来访问它。这似乎是目前唯一的方式。