un #define un peu compliqué pour gérer un time out

J-M-L:
Et pourquoi pas une fonction?

C'est justement le dilème : dans timeOut(temps, condition), condition est une expression de test. Codée telle-qu'elle, condition sera évaluée avant l'appel de la fonction timeOut, alors que je voudrais que l'expression soit conservée et reportée dans le if() interne à timeOut()..

Si je prends l'exemple des boucles for() et while(), la condition passée en paramètre est conservée et évaluée à chaque itération. Je voudrais donc créer une boucle du même genre, mais qui dépend de deux conditions (la mienne, et la variable msB).

Ma question est comment passer cette expression en paramètre dans une macro #define sans qu'elle soit évaluée lors de l'appel? Puis-je faire confiance au préproc pour qu'il comprenne à coup sûr la manip? (je sais bien que timeOut() disparaîtra avant la compilation, et sera remplacée par le code que j'aurai réussi à faire)

En fait, je maitrise vraiment pas les multiples façons de jouer avec le préproc, bien qu'il ait l'air hyper puissant...

pepe:
Bonsoir

Si l'on a la garantie que les interruptions sont autorisées avant l'accès à la variable, alors on peut simplifier l'opération comme suit :

La remarque est judicieuse, je n'en étais pas encore arrivé là :wink: . Dans mon cas, on a plutôt intérêt à ce que les INT soient autorisées, puisque msB est décrémentée par une INT (toutes les millisecondes). le sei() trouve tout naturellement sa place ici.

Pour justifier de la complexité de mon affaire, ma fonction timeOut(temps, condition) servira à beaucoup de choses (attente d'un appui sur BP, attente d'un retour sur port série...), et condition peut être n'importe quelle expression booléenne, voire même des imbrications (condition1 || condition2 && condition3) par exemple. Avec ce genre de fonction magique, je m'affranchis d'un bon nombre de plantages dus à des boucles infinies...