Merci pour ce super retour ! J’ai mis du temps a répondre, le temps de faire mes tests les soirs…
Les sleeps, dans Send_Pulse servent juste à générer un signal avec des T-ON, T-OFF déterminés.
J’ai également un « sleep() » dans la boucle while(1) du script. de 0.1s qui tourne en boucle, fait une mesure et déclenche un watchdog toutes les Xs. Celui-ci bloc aussi mon code et empire les résultats.
GPIO.callback → Count() & SendPulse()
while true :
try :
mesure_adc
cycle = cycle +1
if cycle == 50
print(debug)
watchdog()
cycle = 0
sleep(0.1)
except : print(« error »)
J’ai plus l’habitude de microcontrôleur type PIC ou ce genre de tâches est facile grâce à des bloc logique (conteurs physique notamment) et ou les sleep mode ne sont pas bloquant car les interruptions sortent le produit du sleep mode pour exécuter une fonction avant de reprendre le code la ou il l’a laisser. Mais je dois le faire avec un RPI et ne peux changer l’architecture hélas.
J’ai testé de diminuer le sleep de 0.5 à 0.1. les pertes sont divisées par 5. (Ca peut être une solution peut être acceptable, mais j’imagine que c’est pas très fiable)
1- Multithread : J’ai jamais cette notion en embarqué. Ca semble une très bonne solution pour éviter les conflits entre fonctions, mais j’ai pas d’experience la dessus, j’ai peur que cela me créer des problèmes plus gros que je ne saurai résoudre pour l’instant.
2- Séparer l’appel des fonctions count() & SendPulse() : Hélas on ne peut pas lancer 2 callbacks à partir du même event. Car il faudrait que cela soit déclenché par la réception de nouveaux pulses
3- remplacer sleep par comptage de temps : J’ai implémenté cette solution pour remplacer le sleep() de la boucle while → grosse amélioration d’un facteur 10 !!
from delay import NonBlockingDelay, delay_ms, millis
d0 = NonBlockingDelay()
if d0.timeout() :
etc…
Pour améliorer encore les performances :
a) il faudrait que j’implémente la solution (3) au temporisation utilisées pour généré les pulses…mais je que cela ne fonctionne pas de la même façon que pour la tempo de la boucle principale, car il va lancer plusieurs fois la fonction, et le comptage du temps posera problème.
b) Du coup, il faudrait que j’arrive à implémenter la solution (2) … je continue mes recherches…
Merci encore !!!