10
votes

Boucles / minuteries en c

Comment créer une minuterie en C?

Je veux un morceau de code pour récupérer en permanence des données d'une sortie d'analyseurs GPS.

Y a-t-il de bonnes bibliothèques pour cela ou devrait-il être écrit auto-écrit?


3 commentaires

Pouvez-vous être un peu plus précis? Comment allez-vous l'analyse de la sortie? Il est vraiment difficile de comprendre ce que vous demandez.


Ne vous inquiétez pas de l'analyse. J'aimerais juste savoir comment créer une fonction de minuterie en C qui boucle et exécute ses déclarations.


Basé sur des commentaires ultérieurs, ajouté Linux aux balises


7 Réponses :


0
votes

Si votre utilisation de Windows, vous pouvez utiliser SETTIMER , sinon vous pouvez créer une minuterie de TimegeTime et _breginthreadex avec une file d'attente de minuteries avec des rappels


0 commentaires

4
votes

On ne "crée pas de minuterie en C". Il n'y a rien sur le calendrier ou la planification dans la norme C, alors comment cela est accompli est laissé jusqu'au système d'exploitation.

Ceci est probablement une question raisonnable pour un c noob, autant de langues les appuient des choses comme celle-ci. Ada fait, et je crois que la prochaine version de C ++ le fera probablement (Boost en apporte-t-elle maintenant). Je suis à peu près sûr que Java peut le faire aussi.

sur Linux, probablement le meilleur moyen d'utiliser pthread art. En particulier, vous devez appeler pthread_create () et transmettre l'adresse de votre routine, qui contient probablement une boucle avec un Sleep () (ou USLEeP () ) Appelez en bas.

Notez que si vous voulez faire quelque chose qui se rapproche de la planification en temps réel, juste faire un butier uleep () n'est pas assez bon car il ne tiendra pas compte du temps d'exécution de la boucle lui-même. Pour ces applications, vous devrez configurer un minuterie périodique et attendre cela.


5 commentaires

Comment puis-je exécuter une fonction dans une boucle dans son propre fil?


@ Helium3 - Utilisez les appels OS (qui dépendent de quels systèmes d'exploitation que vous utilisez, que vous devez encore nous dire) ou utilisez une meilleure langue.


Il sera exécuté sur Ubuntu sur un pandaboard.


[Pedantic] Une langue «meilleure» est définie par un support de synchronisation? drôle.


@ssijn - Pour ce but particulier, oui une langue qui a un soutien réel pour le filetage (même dans une bibliothèque portable comme Boost) serait mieux. C a aussi ses stripts, mais ce n'est pas l'un d'entre eux.



0
votes

La question à propos d'une minuterie est assez non spécifique, bien qu'il y ait deux fonctions qui me viennent à l'esprit qui vous aideront:

  • Sleep () Cette fonction provoquera l'exécution de s'arrêter pour un nombre de secondes spécifié. Vous pouvez également utiliser uleep et nanosleep si vous souhaitez spécifier la durée de veille plus exactement
  • GetTimeOdday () Utilisation de cette fonction que vous pouvez arrêter entre TIMESTPS.

    Voir Mangages pour plus d'explication :)


0 commentaires


7
votes

sur les systèmes POSIX Vous pouvez créer (et attraper) un Alarme . L'alarme est simple mais réglée en quelques secondes. Si vous avez besoin de résolution plus fine que des secondes, utilisez SETTITIMER .

struct itimerval tv;
tv.it_interval.tv_sec = 0;
tv.it_interval.tv_usec = 100000;  // when timer expires, reset to 100ms
tv.it_value.tv_sec = 0;
tv.it_value.tv_usec = 100000;   // 100 ms == 100000 us
setitimer(ITIMER_REAL, &tv, NULL);


0 commentaires

18
votes

Méthode la plus simple disponible:

#include <pthread.h>

void *do_smth_periodically(void *data)
{
  int interval = *(int *)data;
  for (;;) {
    do_smth();
    usleep(interval);
  }
}

int main()
{
  pthread_t thread;
  int interval = 5000;

  pthread_create(&thread, NULL, do_smth_periodically, &interval)

  ...
}


2 commentaires

Ne pas descendre, mais il a également mentionné qu'il l'ait voulu être exécuté dans un fil séparé, le code pour créer un thread et exécuter do_smth_periodifier () de manière aussi utile. De plus, cette méthode entraînera la variation de l'ensemble du temps de "mur" de la boucle en fonction du temps qu'il faut pour faire do_smth () chaque itération. Très probablement, c'est bien pour sa candidature.


Condition de course AVERTISSEMENT: veillez à garder intervalle variable en mémoire lorsque vous appelez pthread_create d'une autre fonction au lieu de Main () , car intervalle peut devenir hors de portée avant l'affectation du thread de * Données argument dans la première ligne.



0
votes

Si les données GPS provenaient d'un périphérique matériel, comme sur un port série, une chose que vous pouvez envisager de changer l'architecture autour de sorte que l'analyseur commence le code que vous essayez de courir lorsque plus de données sont disponible.

Cela pourrait faire cela à travers une fonction de rappel ou peut envoyer un événement - la mise en œuvre effective dépendrait de ce que vous avez disponible.


0 commentaires