• [^] # Re: Aucun !

    Posté par . 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 :

    uint16 val = *(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 :

    uint8 tmp;
    uint16 tmp16;
    uint16 val;
    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.

    J'ai fini par écrire ça :

    uint16 val1;
    uint16 val2;
    uint16 val;
    do
    {
     val1 = *(uint16*)adresse_registre;
     val2 = *(uint16*)adresse_registre;
    } while (val1 != val2);
    val = val1;

    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 ?