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
7 mars 2017 à 10:15
#3740

Maître des clés
::
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