Je suis à la recherche dans un fichier pilote de microcontrôleur et avait du mal à comprendre l'utilisation correcte des syndicats et les champs de bitsS'il vous plaît clarifier ma compréhension sur les champs de bits et des syndicats en C
typedef union
{
uint8 U; //Unsigned
sint8 I; //signed
Register_x_Bits B; //Bit field access
}u1;
typedef struct _Register_x_Bits //8 bit register size
{
uint8 Field1:1; //endianness is maintained for all registers
uint8 Field2:1;
uint8 Field3:1;
uint8 Field4:1;
uint8 Field5:4;
}Register_x_Bits;
u1 reg;
reg.U = ReadRegister(); // data is initially being read from the register
//based on the previous data a bit value needs to be changed in particular location of the data
reg.B.Field3 = 0;
WriteRegister(reg.U);
Et voici où j'ai du mal à comprendre
1) en changeant simplement la valeur du champ de bits reg.B.Field3
, serait-il changer un seul bit particulier (champ 3 dans ce cas) ou faut-il effacer toutes les données précédentes dans le registre et le remplir avec de nouveaux reg.B.Field3
De nombreux didacticiels indiquent qu'il n'y aurait qu'un seul membre actif dans Unions
2) Puis-je modifier plusieurs champs binaires dans le même registre? Puis-je les changer par la même méthode ci-dessus et en gardant intact restant
reg.B.Field1 =0;
reg.B.Field3 =1;
reg.B.Field4 =1100;
Que toute la valeur de registre pour être 1111 0 1 0 1
et maintenant si je change Fields 1,3,4
serait-il affecter la valeur dans Fields 0,2
?
Vous devez définir 'Register_x_Bits' avant de l'utiliser dans une définition de l'union. Le code affiché ne doit pas être compilé. (Mais vous pouvez facilement inverser l'ordre de l'union et de la structure pour qu'elle compile.) –
Vous ne pouvez pas insérer tout le décimal 1100 dans un champ de 4 bits. Aviez-vous en tête 6 la valeur? (1100% 16 est 12, ce que vous obtiendriez avec le code tel qu'il est écrit.) –
Affecter à 'reg.B.Field3' ne changerait pas les autres bits de la structure' reg.B'. Cela affecterait les valeurs de 'reg.I' et' reg.U' - en pratique, un bit serait réinitialisé, mais quel bit est défini par l'implémentation (la plupart du comportement du champ de bits est défini par l'implémentation, donc vous devez regarder le le manuel de mise en œuvre - et demandez l'information si elle n'est pas déjà documentée dans les manuels que vous avez). –