2010-08-31 7 views
0

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.

Répondre

1

L'appel select doit être bloqué jusqu'à ce que le descripteur de fichier soit lisible.

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

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

+0

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

+0

@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

+0

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

Questions connexes