Pointeur vers bit-field

Pointeur vers bit-field - C - Programmation

Marsh Posté le 06-05-2010 à 10:29:06    

Bonjour,
 
Je programme actuellement sur un MCU qui a plusieurs bit-fields représentant ses IOs. Je souhaiterai avec une structure qui regroupe certains bits de chaque bit-field. En lisant la doc j'ai constaté qu'il n'est pas possible de créer un pointeur vers un de ces bit car ils représentent une partie d'un word, et non pas le word lui même, et de ce fait n'ont pas d'adresse.
 
Le problème c'est que pour moi c'est vraiment pas très simple de me les trimbaler "dans l'état" (ça m'arrive par exemple souvent de devoir mettre à 1/0 une longue suite de bits), le top serait pour moi de pouvoir avoir quelque chose comme un array sur lequel je bouclerais en affectant la valeur voulue à chaque bit.
 
Il y a une manière de feinter ça ou bien je suis condamné à devoir faire de gros switch/chaines de if-else if à chaque fois?
 
Merci


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-05-2010 à 10:29:06   

Reply

Marsh Posté le 06-05-2010 à 10:31:19    

Masquer avec les puissances de deux.

Reply

Marsh Posté le 06-05-2010 à 10:35:19    

Je comprend pas vraiment en quoi le fait de les masquer va m'aider.
J'ai plusieurs bit-fields, et les bit qui m'intéresse sont pas toujours au même endroit dans chaque bit-field (et vu que ça map du hardware, je peux pas le changer)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-05-2010 à 10:41:02    

Oui, il ne sont pas toujours au même endroit, mais on connait leur emplacement, donc on peut calculer un masque avec une puissance de deux (ou avec un décalage, ce qui revient au même).
 
Pour mettre un bit à un on fait un OR avec le masque, et pour le mettre à zéro, on fait un AND avec le masque.
 
Par exemple, voici deux fonctions qui proviennent d'un programme de décompression de fichiers :

/* ======================================================= */
static unsigned long readBitFromStream(size_t *bitpointer,
                                       const unsigned char* bitstream)
{
   // *bitpointer is a pointer on bits in bitstream.
   // It is divided by 8 (shifted to the right 3 times)
   // in order to have a pointer on bytes.
   // A byte is extracted from bitstream.
   // It is shifted 0 or 1 or ... 7 times
   // It is masked in order to get only one bit.
   // *bitpointer is incremented.
   return (bitstream[(*bitpointer) >> 3] >> ((*bitpointer)++ & 0x7)) & 1;
}
 
/* ======================================================= */
static unsigned long readBitsFromStream(size_t *bitpointer,
                                const unsigned char* bitstream, size_t nbits)
{
   unsigned long result; size_t i;
   result = 0;
   for (i = 0; i < nbits; i++)
      result += (readBitFromStream(bitpointer, bitstream)) << i;
   return result;
}
 


Message édité par olivthill le 06-05-2010 à 10:41:40
Reply

Marsh Posté le 06-05-2010 à 10:44:42    

Ok donc la seule possibilité c'est de faire 2 tableaux :
 
l'un avec avec le nom du bit comme clé et un pointeur vers le bit-field en valeur. L'autre avec le nom du bit comme clé et son indice dans le bit-field comme valeur. Et après faire une fonction qui écrit/lit le bit en utilisant un masque calculé sur la base de ces 2 tableaux?
 
Zut, moi qui espérais quelque chose de simple (comme un tableau)...
 
Merci à toi pour ta réponse rapide!


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-05-2010 à 10:53:37    

Oui, le tableau est peut-être nécessaire.
 
Pour infos, voici des liens qui me paraissent intéressants :
http://en.wikipedia.org/wiki/Bit_field
http://msdn.microsoft.com/en-us/li [...] S.80).aspx
http://bytes.com/topic/c/answers/6 [...] -bitfields

Reply

Marsh Posté le 06-05-2010 à 10:55:06    

Merci :jap:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

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