2017-07-06 464 views
3

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

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

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

感谢

+3

我认为通常的做法是让设备驱动程序向进程发送SIGIO信号。该进程注册一个执行回调的信号处理程序。 – Barmar

+0

https://github.com/brgl/libgpiod。 @Barmar,看起来像你有主题的遗留知识:-) – 0andriy

+0

还有一个名为[python-sysfs-gpio](https://github.com/derekstavis/python-sysfs-gpio)的python模块。 – Fl0v0

回答

0

我发现下面的代码很多挖后,完美对我的作品。

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

#echo 48>/SYS /班/ GPIO /出口

#echo上升>/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; 
} 
0

必须实现在内核模式,处理程序触发例如一个字符设备。从用户空间可以通过轮询访问(例如ioctl()调用)。看来这是目前唯一的方法。