Я нашел приведенный ниже код после долгих копаний, и он отлично работает для меня.
Обработка прерываний от GPIO Во многих случаях вход GPIO можно настроить для генерации прерывания при изменении состояния, что позволяет вам ждать прерывания, а не опрашивать его в неэффективном программном цикле. Если бит GPIO может генерировать прерывания, граница файла существует. Изначально он имеет значение none, что означает, что прерывания не генерируются. Чтобы разрешить прерывания, вы можете установить одно из следующих значений: • нарастание: прерывание по переднему фронту • падение: прерывание по заднему фронту • оба: прерывание как по нарастающему, так и по заднему фронту • нет: нет прерываний (по умолчанию) Вы можете подождать прерывание с использованием функции poll() с POLLPRI в качестве события. Если вы хотите дождаться переднего фронта на GPIO 48, вы сначала разрешаете прерывания:
#echo 48 > /sys/class/gpio/export
#echo растет > /sys/class/gpio/gpio48/edge
Затем вы используете 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;
}
person
Akash Gajjar
schedule
11.10.2017
SIGIO
процессу. Процесс регистрирует обработчик сигнала, который выполняет обратный вызов. - person Barmar   schedule 06.07.2017