read_16 et write_16

read_16 et write_16

by Emmanuelle Adelina Virginie Denove -
Number of replies: 2

Bonjour,

nous rencontrons un problème dans les fonctions bus_read_16 et bus_write_16 : nous ne comprenons pas comment séparer et ensuite recombiner addr_t data_16 en deux data_t pour pouvoir l'utiliser dans bus_read et bus_write. Pouvez-vous nous aider sur le sujet ?

Merci d'avance !

In reply to Emmanuelle Adelina Virginie Denove

Re: read_16 et write_16

by Deleted user -

Bonjour,

Les opérations de bit que vous avez développé en semaine 2 - disponible dans bit.h - sont là pour ça, à moins que je n'ai pas compris la question.

In reply to Deleted user

Re: read_16 et write_16

by Jean-Cédric Chappelier -

Oui, on peut en effet (c'est donc un chemin possible)

Mais, en fait il y a aussi plus simple ici car on parle ici du bus : on lit des données continues en mémoire (voir aussi la réponse de Cédric (au milieu) : https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=27776#p55029).

Le code est fait assez simple ici ; mais je réalise par vos questions que ce n'est certainement pas encore très naturel  pour vous (car c'est « très C »). Je fais donc un petit complément de cours (voir à ce sujet l'exercice 3 de la série de cette semaine (série 5)) :
le type d'un pointeur sert juste à décoder la séquence de bits en mémoire. En C on peut tout à fait faire cela :
double x = 3.4;
int* ptr = &x;
Au travers de ptr on interprétera la séquence de bits de la représentation mémoire de 3.4 comme un entier (ce qui va donner « n'importe quoi » ; en fait ce sont les 32 premiers bits (si on a des int sur 32 bits) de l'écriture virgule flottante de 3.4)
Et si donc on voudrait (pour des raisons étranges) avoir exactement ces bits interprétés et stockés (copiés) comme un entier, on pourrait faire :
int i = *ptr;
Pour éviter que le compilateur ne râle, on pourrait explicitement dire que l'on force le changement d'interprétation de la mémoire (c'est optionnel) :
int* ptr = (int *) &x;

Et si je simplifie tout ça sans passer explicitement par ptr, cela donnerait :
int i = *((int *) &x);

Joli, non ?....
Heu non pas joli du tout, en fait, mais parfois très pratique lorsque justement la mémoire est correctement organisée (certainement pas le cas dans mon cas d'école présenté plus haut, mais certainement le cas sur votre bus de Game Boy ;-) ).
Voilà, ça c'est très « style C » . Si vous n'aimez pas, vous pouvez toujours faire comme suggéré par Yassin (merci !).