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

  FORUM HardWare.fr
  Programmation
  C

  Pointeur vers bit-field

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pointeur vers bit-field

n°1990717
esox_ch
Posté le 06-05-2010 à 10:29:06  profilanswer
 

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
mood
Publicité
Posté le 06-05-2010 à 10:29:06  profilanswer
 

n°1990721
olivthill
Posté le 06-05-2010 à 10:31:19  profilanswer
 

Masquer avec les puissances de deux.

n°1990726
esox_ch
Posté le 06-05-2010 à 10:35:19  profilanswer
 

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
n°1990732
olivthill
Posté le 06-05-2010 à 10:41:02  profilanswer
 

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
n°1990733
esox_ch
Posté le 06-05-2010 à 10:44:42  profilanswer
 

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
n°1990746
olivthill
Posté le 06-05-2010 à 10:53:37  profilanswer
 

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

n°1990748
esox_ch
Posté le 06-05-2010 à 10:55:06  profilanswer
 

Merci :jap:


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

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

  Pointeur vers bit-field

 

Sujets relatifs
Site flash, décalage vers le bas sur serveurLien Word 2007 vers ancre HTML
Probleme avec un pointeurEcrire sur le terminal sans avancer le pointeur
Transformation d'un tableau (fichier xml vers html)Casse-tête... Class Library C++/CLI vers C#?
Extraire une ligne d'une page web vers un fichier texteExporter un tableau Excel 2007 vers Access
Transfert de données d'une feuille excel vers un tableau VBA[Oracle 10G] Données vers fichier Excel
Plus de sujets relatifs à : Pointeur vers bit-field


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