Bonjour à tous,
Je programme en C++ sur Raspberry et j'essaie de rajouter une fonctionnalité qui me permet de compter le temps qu'une GPIO reste à l'état haut, grâce aux interruptions. (Je veux savoir combien de temps mon tube fluo reste allumé)
Lorsque l'interruption détecte un front montant, je lance un chrono que j'arrête dès au prochain front descendant.
Cependant, je rencontre plusieurs problèmes que vous pourrez peut-être m'aider à résoudre.
Dans la phase de fonctionnement normal du programme, lorsqu'il y a une interruption, le programme gère ça comme il faut.
Par contre, dès que je force le programme à s'arrêter (CTRL+C), j'appelle mes différents destructeurs pour que le programme s'arrête proprement.
Dans un des destructeurs, je change l'état de la pin que je surveille à l'état bas. Et là, ma fonction d'interruption se déclenche 2 fois ! Mais pas deux fois de suite non non ! Il rappelle la fonction qui avait été appelée la dernière fois !
Admettons qu'il y ai eu une interruption il y a 20 minutes et une autre à l'instant même. C'est la fonction d'interruption avec le code et l'état actuel des variables qui est appelé une première fois et une seconde fois avec l'état des variables qui correspondait il y a 20 minutes.
Par contre, si je rappelle la fonction wiringPiISR() pour reconfigurer l'interruption de telle sorte à diriger les interruptions vers une fonction qui fait rien (j'ai pas trouvé d'autre façon de désactiver l'interruption), je retrouve un comportement normal et l'interruption est appelé qu'une seule fois. Pourtant, on pourrait se dire que plus aucune interruption ne devrait être détecté puisque je lui ai demandé de ne rien exécuter à chaque nouvelle interruption !
Je ne sais pas si c'est un problème lié à la compréhension des µc ou si c'est un problème logiciel. Donc je ne sais pas si je suis dans le bon forum.Code:Eclairage::~Eclairage() { wiringPiISR(PIN_ECLAIRAGE, INT_EDGE_BOTH, [](void* param){return;}, 0); //on redirige les interruptions vers une fonction qui fait rien digitalWrite(PIN_ECLAIRAGE, LOW); }
Bref, comportement incompréhensible pour moi. Mais peut-être que vous avez quelque chose à m'apporter ?
Merci pour votre aide
-----