Répondre à : Installation 4.13d sur RaspBerry Pi

Accueil Forums Gestion d’un serveur WIMS Installation d’un serveur WIMS Installation 4.13d sur RaspBerry Pi Répondre à : Installation 4.13d sur RaspBerry Pi

#3740
Avatar photoOlivier
Maître des clés
Up
0
Down
::

Pour donner plus de précisions sur ce que j’appelais assez simplement plus haut un « probleme avec les floats » :
Il s’agit en fait d’un souci de transmission d’informations entre 2 programmes (wims et wimslogd)
L’un « envoie » à l’autre un ensemble de variable, dont des floats.
Et le problème survient sur ARM lorsque le second programme lit le float recu : cela déclenche un Bus error.

On peut tout à fait simuler ce comportement au sein d’un seul et même programme pour faire plus simple. voici un code C qui simule cela :

/* Test program, simulating communication between wims <-> Wimslogd*/

// Compilation :
//gcc -g -O2 -Wall   -DGNU_SOURCE -DVERSION_DATE=\"2014-05-22\" raspberry_wims.c -L../lib -lwims -lm -o raspberry_wims

// Compilation Raspberry :
//gcc -g -O2 -Wall -DGNU_SOURCE raspberry_wims-test.c -L../lib -lwims -lm -o raspberry_wims-test -march=armv6 -mfpu=vfp -mfloat-abi=hard

#include <stdio.h>
#include <memory.h>

typedef struct scoreresult {
    float require, weight, score, mean, last, try, best, level;
} scoreresult;

#define MAX_CLASSEXOS 256

#define exocnt 2
struct scoreresult tscore[MAX_CLASSEXOS];
struct scoreresult *rscore;
//int answerlen;

/* Simule l'écriture des données dans le fichier d'échange */
void writeBuffer(void)
{
    printf("écriture des données...\n");
    tscore[0].require = 1.23456;
}

/* Simule la lecture des données à partir du fichier d'échange */
void readBuffer(void)
{
  char *pp;

  printf("Lecture des données...\n");

  pp = tscore;
  rscore=(struct scoreresult *) pp;
}

/* Programme principal */
int main(void)
{
    printf("Début de la simulation...\n");

    writeBuffer();
    readBuffer();

    printf("Données envoyées : \n");
    printf("tscore[0].require = %f \n", tscore[0].require);
    printf("[HEX] tscore[0].require is %x\n", *(unsigned int*)&tscore[0].require);

    printf("Données Recues : \n");
    printf("[HEX] rscore[0] is %x\n", *(unsigned int*)&rscore[0]);
    /** C'est ici, à la lecture de "rscore[0].require" qu'on obtient un "BUS ERROR" sur un Raspberry Pi **/
    printf("[HEX] rscore[0].require is %x\n", *(unsigned int*)&rscore[0].require);
    printf("rscore[0].require = %f \n", rscore[0].require);

    return 0;
}

Olivier Bado-Faustin / Université Côte d’Azur