我正在編寫Linux用戶空間應用程序。我想從內核空間調用用戶空間區域的註冊回調函數。Linux內核:從內核空間調用用戶空間的回調函數
即到達GPIO引腳的中斷(開關按下事件)和在用戶空間中被調用的註冊功能。
是否有任何方法可以做到這一點。
感謝
我正在編寫Linux用戶空間應用程序。我想從內核空間調用用戶空間區域的註冊回調函數。Linux內核:從內核空間調用用戶空間的回調函數
即到達GPIO引腳的中斷(開關按下事件)和在用戶空間中被調用的註冊功能。
是否有任何方法可以做到這一點。
感謝
我發現下面的代碼很多挖後,完美對我的作品。
處理來自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;
}
必須實現在內核模式,處理程序觸發例如一個字符設備。從用戶空間可以通過輪詢訪問(例如ioctl()
調用)。看來這是目前唯一的方法。
我認爲通常的做法是讓設備驅動程序向進程發送SIGIO信號。該進程註冊一個執行回調的信號處理程序。 – Barmar
https://github.com/brgl/libgpiod。 @Barmar,看起來像你有主題的遺留知識:-) – 0andriy
還有一個名爲[python-sysfs-gpio](https://github.com/derekstavis/python-sysfs-gpio)的python模塊。 – Fl0v0