Archive 07/10/2020.

TP7. Erreur compilation avec le gyroscope l3g4200d

vmath54

Bonjour,

Je rencontre un problème avec le TP7, avec le sensor l3g4200d (gyroscope) ; je galère depuis 2 jours.

La compilation échoue sur la fonction l3g4200d_init(&l3g4200d, &l3g4200d[0]);

L’erreur est “subscripted value is neither array nor pointer nor vector”, et ca concerne le second paramètre : &l3g4200d[0]

Après avoir vainement cherché d’ou provenait l’erreur, j’ai essayé de compiler le code de test, dispo à https://github.com/RIOT-OS/RIOT/blob/master/tests/driver_l3g4200d/main.c

J’ai toujours la même erreur à la compile …
Voici mon main.c :
#include <stdio.h>

#include "xtimer.h"
#include "l3g4200d.h"
#include "l3g4200d_params.h"

#define SLEEP_USEC  (100 * 1000U)

int main(void)
{
    l3g4200d_t dev;
    l3g4200d_data_t acc_data;

    puts("L3G4200 gyroscope driver test application\n");
    puts("Initializing L3G4200 sensor");
    if (l3g4200d_init(&dev, &l3g4200d_params[0]) == 0) {
        puts("[OK]\n");
    }
    else {
        puts("[Failed]");
        return 1;
    }

    while (1) {
        l3g4200d_read(&dev, &acc_data);

        printf("Gyro data [dps] - X: %6i   Y: %6i   Z: %6i\n",
               acc_data.acc_x, acc_data.acc_y, acc_data.acc_z);

        xtimer_usleep(SLEEP_USEC);
    }

    return 0;
}

et mon Makefile :
APPLICATION = sensors

BOARD ?= iotlab-m3

USEMODULE += xtimer
USEMODULE += lps331ap
USEMODULE += lsm303dlhc
USEMODULE += isl29020
USEMODULE += l3g4200d

# Add the required modules here

RIOTBASE ?= $(CURDIR)/../../RIOT

include $(RIOTBASE)/Makefile.include

Je n’arrive pas à m’en sortir. Qui peut m’aider ?

aabadie2

Bonjour,

Je pense qu’il y a un problème avec le deuxième paramètre de la fonction d’initialisation du capteur l3g4200d: au lieu de l3g4200d_init(&l3g4200d, &l3g4200d[0]);, vous devriez avoir l3g4200d_init(&l3g4200d, &l3g4200d_params[0]);

Si vous avez copié exactement le code de l’applicaiton de test tests/driver_l3g4200d, ça devrait compiler sans problème pour le iotlab-m3. Par exemple, depuis un terminal:

make BOARD=iotlab-m3 -C riot/RIOT/tests/driver_l3g4200d/
make: Entering directory '/home/jovyan/work/iot-lab-training/riot/RIOT/tests/driver_l3g4200d'
Building application "tests_driver_l3g4200d" for "iotlab-m3" with MCU "stm32f1".

"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/boards/iotlab-m3
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/boards/common/iotlab
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/core
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32f1
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/cortexm_common
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/cortexm_common/periph
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32_common
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32_common/periph
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32f1/periph
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/drivers
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/drivers/l3g4200d
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/drivers/periph_common
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/auto_init
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/div
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/isrpipe
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/newlib_syscalls_default
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/pm_layered
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/stdio_uart
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/test_utils/interactive_sync
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/tsrb
"make" -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/xtimer
   text    data     bss     dec     hex filename
  12156     140    2664   14960    3a70 /home/jovyan/work/iot-lab-training/riot/RIOT/tests/driver_l3g4200d/bin/iotlab-m3/tests_driver_l3g4200d.elf
make: Leaving directory '/home/jovyan/work/iot-lab-training/riot/RIOT/tests/driver_l3g4200d'

Etes-vous sûr de compiler les bons fichiers (après avoir recopié l’application de test) ?

vmath54

Oups ! En effet ; je croyais exécuter le code que je vous ai transmis, qui est une copie du code de test du l3g4200d.

J’avais renommé mon ‘main.c’ en ‘main_sav.c’ ; et j’avais mis le code de test dans un nouveau ‘main.c’.
J’étais donc persuadé que le code exécuté lors du make était celui de main.c, … et bien non ; c’était toujours celui de ‘main_sav.c’, donc mon ancien code.

Je pensais que le Makefile prenais par défaut un fichier de nom ‘main.c’ ; ce n’est pas le cas. Je ne sais pas comment il procède.
J’ai ensuite renommé ‘main_sav.c’ en ‘main_sav.cop’ ; et là, le make a bien compilé mon nouveau ‘main.c’, et plus d’erreur de compilation.

Mon erreur initiale était bien ce second paramètre de la fonction l3g4200d_init ; il y avait ‘&l3g4200d[0]’ au lieu de ‘&l3g4200d_params[0]’.

Merci beaucoup du coup de main ; j’avais repris mon code plusieurs fois, sans voir l’erreur ; et ce fameux code de test que je croyais exécuter dnas le nouveau ‘main.c’ m’a bloqué dans ma recherche.

Tout va bien maintenant.