Question

pour la embarquée plate-forme MIPS je suis mise en œuvre d'un petit programme au sondage GPIO, à savoir que je utilise le niveau de l'utilisateur du fournisseur de puce bibliothèque GPIO avec des fonctionnalités de base (ouvert / dev / GPIO, lire, écrire la broche, etc.). La conception est simple:

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 */
        }
    }
}

Mais je suis face à un problème sérieux - cette application quand RAN « et » à la fin, à savoir le mettre en arrière-plan, consomme CPU 99%, ce qui est évidemment en raison de boucle serrée, mais j'ai observé l'approche similaire de nombreux code réseau et il a bien fonctionné.

Suis-je manque quelque chose, peut-il être un défaut de la bibliothèque GPIO?

En fait, un seul « while (1), » fait le même effet. Peut-il être le comportement « naturel » du noyau?

Merci.

Était-ce utile?

La solution

L'appel select doit bloquer jusqu'à ce que le descripteur de fichier est lisible.

Ce qui peut se produire est que le pilote de périphérique ne prend pas en charge l'appel select, et il sort immédiatement plutôt que de bloquer.

Une autre possibilité est que l'appel à gpio_open ne vous donne pas vraiment un vrai descripteur de fichier Unix. Si j'étaient open("/dev/gpio", O_RDWR) ou quelque chose comme ça aurais beaucoup plus confiance en elle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top