как обнаружить смену выводов GPIO на плате Linux

Я использую ядро ​​3.12 на плате Linux на основе ARM (процессор imx233). Моя цель - обнаружить смену контактов GPIO (от 1 до 0).

Я могу прочитать значение вывода, постоянно вызывая функцию ниже (в цикле while (1))

int GPIO_read_value(int pin){
    int gpio_value = 0;
    char path[35] = {'\0'};
    FILE *fp;
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
    if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
         //error
    }

    fscanf(fp, "%d", &gpio_value);
    fclose(fp);
    return gpio_value;
}

Но это вызывает слишком большую нагрузку на процессор. Я не пользуюсьusleep или жеnanosleepпотому что замена булавки происходит в течение очень короткого времени, которое заставило бы меня пропустить событие.

Насколько я узнаю, невозможно использоватьpoll(), Есть лиpoll() Как функция, которую я могу использовать для обнаружения смены контактов GPIO?

РЕДАКТИРОВАТЬ: на всякий случай, если я делаю что-то не так, вот мойpoll() использование, которое не обнаруживает смену штифта

struct pollfd pollfds;
    int fd;
    int nread, result;
    pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
    int timeout = 20000;           /* Timeout in msec. */
    char buffer[128];

    if( pollfds.fd < 0 ){
        printf(" failed to open gpio \n");
        exit (1);
    }

    pollfds.events = POLLIN;
    printf("fd opens..\n");
    while (1)
    {
            result = poll (&pollfds, 0, timeout);
            switch (result)
            {
                  case 0:
                    printf ("timeout\n");
                    break;
                  case -1:
                    printf ("poll error \n");
                    exit (1);

                   default:
                printf("something is happening..\n");
                    if (pollfds.revents & POLLIN)
                    {
                        nread = read (pollfds.fd, buffer, 8);
                        if (nread == 0) {
                            printf ("result:%d\n", nread);
                            exit (0);
                         } else {
                            buffer[nread] = 0;
                            printf ("read %d from gpio: %s", nread, buffer);
                         }
                     }
              }
     }
     close(fd);

EDIT2: код наhttps://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c отлично работает сpoll() Мне нужно было определить нарастающий / падающий фронт для прерывания и немного исправить это определение. Это решает мою проблему, однако, для меня и некоторых других людей было бы хорошо услышать / узнать альтернативные методы.

Ответы на вопрос(1)

Ваш ответ на вопрос