[résolu] calculs avant la compilation, avec le pré-processeur

calculs avant la compilation, avec le pré-processeur [résolu] - C - Programmation

Marsh Posté le 20-03-2010 à 20:30:24    

Hello,
 
voilà, je suis entrain d'écrire un petit programme en C et j'aimerai bien réaliser des calculs avec le préprocesseur. J'explique par mon cas :
 
Je suis entrain d'écrire une routine de temporisation qui attend un certain nombre de microsecondes. La durée minimale est 16 us et la résolution est de 6 us. Ma fonction d'attente est une boucle qui attend qu'un compteur ait parcouru un cycle de comptage complet. Son argument actuellement est le nombre d'itération à faire.
 
prototype actuel de ma fonction :

Code :
  1. void waitUS(uint32_t numberOfIterations);


 
1 itération prend 16 us. 2 itérations 22 us. 3 itérations 28 us etc... Je l'ai bien mesuré à l'oscilloscope.
 
Simplement appeler la fonction avec le nombre d'itérations n'a pas beaucoup de sens et il serait plus compréhensible de passer comme argument la durée à attendre en microsecondes.
 
Ainsi, mon prototype désiré pour ma fonction serait :

Code :
  1. void waitUS(uint32_t timeInUs);


Aussi, est-ce possible de créer une macro WAIT_US(x) et dans mon code j'appelle cette macro qui calcule le nombre d'itération correspondant à la durée x (en us) afin que le compilateur compile un appel de la fonction avec le nombre d'itérations et ainsi le temps sera correctement respecté ?
 
Le nombre d'itérations est 1 si l'argument est inférieur ou égal à 16 et (l'argument - 16 ) / 6 dans tous les autres cas.
 
Sauf que si je fais ce calcul dans mon code... ça prend du temps processeur... et donc ça fausse la durée de la temporisation (surtout qu'une division c'est lent).
 
Alors voilà, comment faire cela ?
 
Je sais pas si je suis clair... Enfin demandez-moi d'expliquer mieux si vous ne comprenez pas tout...
 
merci beaucoup pour votre aide.
 
EDIT: je précise que j'aimerai une fonction qui n'admette que des valeurs immédiates (donc mon prototype doit être faux mais je sais pas comment on précise ça en C)


Message édité par abaddon2002 le 23-03-2010 à 23:19:29
Reply

Marsh Posté le 20-03-2010 à 20:30:24   

Reply

Marsh Posté le 20-03-2010 à 20:56:56    

euh...
tu peux pas utiliser ce qui existe déjà ??
 
http://linux.die.net/man/2/nanosleep


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-03-2010 à 21:17:15    

Ahah, j'ai oublié de dire... je cross-compile sur une autre architecture.. donc nanosleep et compagnie n'existent pas...

Reply

Marsh Posté le 21-03-2010 à 09:26:59    

Dans boost il y a une bibliothèque de méta programmation avec le préprocesseur qui a peut-être ce qu'il te faut.  Je sais que boost c'est du C++ mais cette bibliothèque ne devrait pas taper dans les différences.  Au pire, tu pourrais t'inspirer de leur technique.  Mais il n'est pas impossible que tu considères que le jeu n'en vaille pas la chandelle -- le préprocesseur n'est pas fait pour cela, même si ça me semble possible.
 
En passant, un compilateur C doit avoir tout ce qu'il faut pour évaluer des expressions entières constantes à la compilation -- c'est obligatoire pour les tailles de tableau, ça me semblerait stupide de ne pas l'utiliser ailleurs.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-03-2010 à 12:16:19    

merci, je vais y jeter un coup d'oeil.

Reply

Marsh Posté le 21-03-2010 à 21:46:03    

Un Programmeur a écrit :

En passant, un compilateur C doit avoir tout ce qu'il faut pour évaluer des expressions entières constantes à la compilation -- c'est obligatoire pour les tailles de tableau, ça me semblerait stupide de ne pas l'utiliser ailleurs.

Oui j'ai bien constaté en définissant une macro qu'elle était totalement évaluée et que dans le code assemblé j'avais directement la valeur immédiate. Donc j'ai bien ce que je veux si je passe une valeur immédiate.
 
Maintenant, est-ce possible de faire en sorte que le compilateur génère une erreur si on passe une valeur à la fonction qui ne puisse être évaluée (i.e. connue) à la compilation ?
 
Sinon je n'ai pas réussi à utiliser boost sur mon architecture..

Reply

Marsh Posté le 22-03-2010 à 09:21:40    

Code :
  1. #define CAT2(a, b) a ## b
  2. #define CAT(a, b) CAT2(a, b)
  3. #define mySleep(x) typedef char CAT(mySleepType, __LINE__)[(x-16)/6]; mySleepFn(sizeof(CAT(mySleepType, __LINE__)))


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 23-03-2010 à 23:19:07    

parfait, tordu comme solution, mais ça marche bien ;-)
 
merci beaucoup!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed