Ce n'est pas forcément un non respect du standard, j'ai eu le cas d'une fifo hardware indexée avec un 16 bits.
Je récupérais la valeur du pointeur comme suis :
uint16val=*(uint16*)adresse_registre;
l'adresse du registre étant volatile, etc.
Mais le CPU sur lequel j'étais, faisait des accès 8 bits. Compilé de cette façon :
uint8tmp;uint16tmp16;uint16val;tmp=*(uint8*)adresse_registre;val=tmp;// <---- Changement de valeur du registre.tmp=*(uint8*)adresse_registre;tmp16=tmp;// Pour pouvoir décaler sans avoir 0.val=val+(tmp16<<8);
Au début, le registre contient 0180 donc on lit d'abord la partie basse (little endian) ==> val == 80
Le registre devient 0210 car le hard à reçu un message, donc on extrait 02 pour obtenir val == 0280. Ca n'arrivais pas souvent, mais aléatoirement entre 5 minutes et 1h30.
C'était pourtant un CPU 32bits, mais configuré avec des accès mémoire 8bits. Grrrr. Sur ce genre de problème, je ne suis pas certain que Rust ou Go apporte quelque chose. Ai-je tort ?
[^] # Re: Aucun !
Posté par Anthony Jaguenaud . En réponse au journal Go et Rust, lequel est le remplaçant du C ?. Évalué à 5.
Ce n'est pas forcément un non respect du standard, j'ai eu le cas d'une fifo hardware indexée avec un 16 bits.
Je récupérais la valeur du pointeur comme suis :
l'adresse du registre étant
volatile, etc.Mais le CPU sur lequel j'étais, faisait des accès 8 bits. Compilé de cette façon :
Au début, le registre contient
0180donc on lit d'abord la partie basse (little endian) ==>val == 80Le registre devient
0210car le hard à reçu un message, donc on extrait02pour obtenirval == 0280. Ca n'arrivais pas souvent, mais aléatoirement entre 5 minutes et 1h30.J'ai fini par écrire ça :
C'était pourtant un CPU 32bits, mais configuré avec des accès mémoire 8bits. Grrrr. Sur ce genre de problème, je ne suis pas certain que Rust ou Go apporte quelque chose. Ai-je tort ?