Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2899 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1975542
abaddon200​2
Posté le 20-03-2010 à 20:30:24  profilanswer
 

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
mood
Publicité
Posté le 20-03-2010 à 20:30:24  profilanswer
 

n°1975551
KangOl
Profil : pointeur
Posté le 20-03-2010 à 20:56:56  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°1975558
abaddon200​2
Posté le 20-03-2010 à 21:17:15  profilanswer
 

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

n°1975614
Un Program​meur
Posté le 21-03-2010 à 09:26:59  profilanswer
 

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)
n°1975644
abaddon200​2
Posté le 21-03-2010 à 12:16:19  profilanswer
 

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

n°1975802
abaddon200​2
Posté le 21-03-2010 à 21:46:03  profilanswer
 

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..

n°1975859
Un Program​meur
Posté le 22-03-2010 à 09:21:40  profilanswer
 

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)
n°1976564
abaddon200​2
Posté le 23-03-2010 à 23:19:07  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Fonction globale: symbole externe non résolu[Résolu][Socket] connaitre l'IP de connexion
[Résolu] IE et erreurs JS incompréhensibles[Résolu][SQL/ACCESS] Problème COUNT / GROUP BY
[Résolu] Création d'une page html pour email, largeur zone texte ?[Résolu]Création d'une page html pour email, léger soucis avec outlook
[résolu] C#/ process cmd.exe et sequence ALT + <020>ou CTRL+T[Résolu] Erreur avec ereg_replace
[RESOLU] [JS] Echanger deux images 
Plus de sujets relatifs à : [résolu] calculs avant la compilation, avec le pré-processeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR