pour la plate-forme MIPS embarquée J'implémente un petit programme pour interroger GPIO, c'est-à-dire que j'utilise la bibliothèque GPIO au niveau utilisateur avec les fonctionnalités de base (ouvrir/dev/gpio, lire, écrire etc. .). La conception est simple:descripteur de fichier d'interrogation
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 lorsqu'il est lancé avec « & » à la fin, à savoir le mettre en arrière-plan, consomme CPU 99%, ce qui est évidemment à cause de serré boucle, mais j'ai observé la même approche dans de nombreux codes de réseau et cela a bien fonctionné. Est-ce que je manque quelque chose, peut-il être un défaut de la bibliothèque gpio?
En fait, un seul "while (1);" a le même effet. Peut-il s'agir du comportement "naturel" du noyau?
Merci.
Je viens de survoler le pilote de périphérique gpio et n'ai pas trouvé les implémentations 'poll/select'. Je pense que votre hypothèse est correcte, merci pour l'indice! – Mark
@Mark - Il se peut qu'il n'y ait pas d'implémentation spécifique, juste une sorte de moyen pour le pilote de périphérique de signaler au système d'exploitation qu'il est lisible. Si j'en savais plus sur les pilotes de périphériques Linux, je pourrais donner des conseils plus précis que cela. Je sais cependant qu'il existe des types de descripteurs de fichiers qui ne sont pas implémentés de manière à ce que poll/select fonctionne sur eux. Par exemple, des descripteurs de fichiers faisant référence à des fichiers sur disque réels. – Omnifarious
Je viens de penser que 'select' pourrait être intentionnellement non implémenté dans la bibliothèque GPIO, le handle de fichier IMHO gpio est toujours prêt, contrairement à socket par exemple. Que dirais-tu ? – Mark