wie man einen Pin-Wechsel eines GPIO auf einem Linux-Board erkennt

Ich verwende 3.12-Kernel auf einer ARM-basierten Linux-Karte (imx233-CPU). Mein Ziel ist es, den Pin-Wechsel eines GPIO (1 zu 0) zu erkennen.

Ich kann den Pin-Wert ständig lesen, indem ich die folgende Funktion aufrufe (in einer while (1) -Schleife)

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;
}

Aber es belastet die CPU zu stark. Ich benutze keinusleep odernanosleep, weil der PIN-Wechsel nur für eine sehr kurze Zeit stattfindet, die dazu führen würde, dass ich das Event verpasse.

Soweit ich weiß, ist es nicht möglich, @ zu verwendpoll(). Gibt es irgendwelchepoll() like-Funktion, mit der ich einen Pin-Wechsel eines GPIO erkennen kann?

EDIT: Nur für den Fall, dass ich etwas falsch mache, hier ist meinpoll() Verwendung, die den Pinwechsel nicht erkennt

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: der Code aufhttps: //developer.ridgerun.com/wiki/index.php/Gpio-int-test. funktioniert gut mitpoll() Ich musste die steigende / fallende Flanke für den Interrupt definieren und ein wenig an der Definition festhalten. Es löst mein Problem, aber es könnte gut für mich und einige andere Leute sein, die alternativen Methoden zu hören / kennen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage