Frage

für den Embedded-MIPS-basierte Plattform ich ein kleines Programm bin Umsetzung GPIO abzufragen, das heißt ich bin mit Benutzerebene GPIO Bibliothek Chip Herstellers mit Basisfunktionalität (offen / dev / gpio, lesen, schreiben Stift etc.). Das Design ist einfach:

int gpio_fd;
fd_set rfds;

gpio_fd = gpio_open(...);

while (1) {
    FD_ZERO(&rfds);
    FD_SET(gpio_fd, &rfds);

    if (select(gpio_fd + 1, &rfds, NULL, NULL, NULL) > 0) {
        if (FD_ISSET(gpio_fd, &rfds)) {
            /* read pins and similar */
        }
    }
}

Aber ich bin ein ernstes Problem konfrontiert - diese Anwendung, wenn RAN mit ‚&‘ am Ende, das heißt es im Hintergrund setzen, verbraucht 99% CPU, dies offensichtlich wegen der engen Schleife, aber ich beobachtete den ähnlichen Ansatz in viele Netzwerk-Code und es hat gut funktioniert.

Bin ich etwas fehlt, kann es ein Defekt der gpio Bibliothek sein?

Eigentlich nur ein einziger „while (1);“ hat die gleiche Wirkung. Kann es das „natürliche“ Verhalten des Kernels sein?

Danke.

War es hilfreich?

Lösung

Der select Aufruf sollte blockieren, bis der Dateideskriptor lesbar ist.

Was passiert werden kann, ist, dass der Gerätetreiber nicht den select Anruf nicht unterstützt, und so verlässt er sofort und nicht blockiert wird.

Eine weitere Möglichkeit besteht darin, dass der Aufruf von gpio_open eigentlich nicht geben Ihnen einen echten Unix Dateideskriptor. Wäre das open("/dev/gpio", O_RDWR) oder so ähnlich, dass ich viel mehr Vertrauen in sie haben würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top