Voilà, j'ai un registre de n bits à l'adresse @.
je souhaite pouvoir acceder a des registres en C de maniere efficace par tranche de 4 bits sur un proc de 16bits.
exempe:
SR.A=1;
SR.B=2;
SR.C=3;
SR.D=4;
serait equivalent à:
SR=(1<<12) | (2<<8) | (3<<4) | (4);
La seule solution que j'ai trouvée etant de le faire à l'aide de macro. Je cherche neanmoins une solution à base d'enum; car la solution de macro est assez lourde (il faut definir 4*nbr(registres) qui revients a definir plus de 600 macros...). Le probleme intervenant etant aussi le pading du compilo (dont on ne m'a meme pas encore donné la ref, et qui est certainement proprietaire).
Link Le 11/07/2005 à 11:24 ben, il y a sans doute une solution avec les champs de bits (structures dont on spécifie la taille des champs au bit près, mais il y a qualques problèmes avec:
1- Ne pas oublier de déclarer en les champs unsigned (pas mal d'erreurs avec ça)
2- L'implémentation change d'un compilo à l'autre... Sur certains, le champ de bits sera mis dans un certain ordre, sur d'autres, dans l'ordre inverse... Bref, il faudra plonger au fin fond de la doc du compilo pour cela, et si tu ne l'as pas...

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
C'est quoi le pb avec les macros ?
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
en gros pas assez optimisé.
Bon j'ai des nouvelles, apparement il faut utiliser une specificité du compilateur qui permet comme l'a dit link d'utiliser un champ de bit sur un entier...
unsigned int XXX: 4;
je peux pas en donner plus...
typedef union Byte_ {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} Byte;
Et la ou l'ordre des bits a le plus de chance de changer, c'est lors d'un passage du code vers du low/high endianess

Proud to be CAKE©®™
GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.
ou d'un changement de compilo/d'ABI, souvent le choix de l'ordre des bits est complètement arbitraire (i.e. aucun ordre n'est plus efficace qu'un autre), et est donc déterminé par des raisons historiques...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Ce qui est en meme temps completement idiot :/
Ce genre de choses aurais du être fixé par le standard (tout au moins par le C-ANSI aka C89 vu qu'avant ct un bordel monstrueux))

Proud to be CAKE©®™
GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.
Link Le 21/09/2005 à 10:54 Oui, mais c'est justement cela qui est idiot, car la principale utilité potentielle des champs de bits aurait été justement le dialogue avec des périphériques, qui eux ont l'habitude d'utiliser des champs de bits qui sont toujours les mêmes ('suffit de voir le registre de contrôle d'un port Com).
Comme ceci est impossible du fait de l'absence de standard, les champs de bits ne sont pratiquement jamais utilisés (je suppose qu'ils le sont dans des systèmes embarqués où la mémoire est rare, et ce doit être pratiquement tout...)

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Link: de tte maniere, le pbm des champs de bits sont leur lenteur....

Proud to be CAKE©®™
GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.
Pollux>
"machin&0x4000"
Plutôt machin & (1<<14) non ? Tu citais l'exemple de machines à trois états logiques ^^
Ben un décalage de bits si chaque bit a trois états, ça multiplie par 3.
Et si ça multiplie pas par 3, alors << n'est pas un décalage de bit dans ce cas.
PpHd Le 10/11/2005 à 08:05 >Deux unsigned int s'effectue modulo une puissance de 2 (définie par l'implémentation).
T'es sûr ? Moi non. Je crois que c'est seulement modulo (UINT_MAX+1).
Oui j'en suis certain, mais flemme de chercher là tout de suite ^^
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
PpHd Le 10/11/2005 à 21:04 Moi aussi je suis persuade de ce que j'ai dit.
PpHd Le 11/11/2005 à 12:52 Je crois pas. Je parlais de C89.