Archive 07/10/2020.

RIOT kernel panic: HARD FAULT HANDLER

bertrlu

Bonjour,
Depuis hier, quelque soit le code genere j’obtiens le résultat RIOT kernel panic HARD FAULT HANDLER.
Ci-dessous un code tout simple, tous les appels au thread sont supprimés.
Où est l’erreur ?
Merci
Luc

cd work/iot-lab-training/
iotlab-experiment submit -d 60 -l 1,archi=m3:at86rf231+site=grenoble
iotlab-experiment wait --timeout 30 --cancel-on-timeout
iotlab-experiment get --nodes

make IOTLAB_NODE=m3-102.grenoble.iot-lab.info -C riot/basics/sensors/ flash termp
make IOTLAB_NODE=m3-102.grenoble.iot-lab.info -C riot/basics/sensors/ term

*** rebooting...

main(): This is RIOT! (Version: 2020.01)
*** RIOT kernel panic:
HARD FAULT HANDLER

*** rebooting...

Very simple code !!!!

#include <stdio.h>

#include "thread.h"
#include "xtimer.h"

/* Add lps331ap related include here */
#include "lpsxxx.h"
#include "lpsxxx_params.h"
/* Declare the lps331ap device variable here */
static  lpsxxx_t lpsxxx;


int main(void)
{
    /* Initialize the lps331ap sensor here */
    printf("Test application for %s temperature and atmospheric pressure sensor\n\n", LPSXXX_SAUL_NAME);
    printf("Initializing %s sensor\n", LPSXXX_SAUL_NAME);
    if (lpsxxx_init(&lpsxxx, &lpsxxx_params[0]) != LPSXXX_OK) {
        puts("Initialization of lpsxxx failed");
        return 1;
    }
    
    /* Add the lps331ap sensor polling endless loop here */

       while (1) {
        uint16_t pres;
        int16_t temp;
    /*    lpsxxx_enable(&dev);*/
        xtimer_sleep(1); /* wait a bit for the measurements to complete */

        lpsxxx_read_temp(&lpsxxx, &temp);
        lpsxxx_read_pres(&lpsxxx, &pres);

        int temp_abs = temp / 100;
        temp -= temp_abs * 100;

        printf("Pressure value: %ihPa - Temperature: %2i.%02i°C\n",
               pres, temp_abs, temp);
    }

    return 0;
}

aabadie2

Bonjour,

Je viens de tester votre exemple tel quel et je n’arrive pas à reproduire votre problème. Le code est correcte et tout fonctionne parfaitement.

Alexandre

EnockElie

Bonsoir moi j’ai à peu près le même problème quand je compile voici ce que j’obtiens! et cela se repète

main(): This is RIOT! (Version: 2020.01)
Accelerometer x: 176 y: 664 z: -204
Magnetometer x: 115 y: -312 z: -116
Pressure: 1009hPa, Temperature: 50.30°C
*** RIOT kernel panic:
HARD FAULT HANDLER

*** rebooting…

aabadie2

Bonjour @EnockElie,

Est-ce que vous pouvez poster le code de votre application dans ce thread ? Il y a peut-être une erreur de recopie qui s’y est glissée ?

EnockElie

#include <stdio.h>

#include “thread.h”
#include “xtimer.h”

/* Add lps331ap related include here /
#include “lpsxxx.h”
#include “lpsxxx_params.h”
/
Add lsm303dlhc related include here /
#include “lsm303dlhc.h”
#include “lsm303dlhc_params.h”
/
Add isl29020 related include here /
#include “isl29020.h”
#include “isl29020_params.h”
/
Add isl29020 related include here /
#include “l3g4200d.h”
#include “l3g4200d_params.h”
/
Declare the isl29020 device variable here /
static isl29020_t isl29020;
/
Declare the l3g4200d device variable here /
static l3g4200d_t l3g4200d;
/
Declare the lps331ap device variable here /
static lpsxxx_t lpsxxx;
/
Declare the lsm303dlhc device variable here */
static lsm303dlhc_t lsm303dlhc;
static char stack[THREAD_STACKSIZE_MAIN];

static void *thread_handler(void *arg)
{
(void)arg;

/* Add the lsm303dlhc sensor polling endless loop here */
 while (1) {
    lsm303dlhc_3d_data_t mag_value;
    lsm303dlhc_3d_data_t acc_value;
    lsm303dlhc_read_acc(&lsm303dlhc, &acc_value);
    printf("Accelerometer x: %i y: %i z: %i\n",
           acc_value.x_axis, acc_value.y_axis, acc_value.z_axis);
    lsm303dlhc_read_mag(&lsm303dlhc, &mag_value);
    printf("Magnetometer x: %i y: %i z: %i\n",
           mag_value.x_axis, mag_value.y_axis, mag_value.z_axis);
    xtimer_usleep(500 * US_PER_MS);
}
return 0;

}

int main(void)
{
/* Initialize the isl29020 sensor here /
isl29020_init(&isl29020, &isl29020_params[0]);
/
Initialize the l3g4200d sensor here /
l3g4200d_init(&l3g4200d, &l3g4200d_params[0]);
/
Initialize the lps331ap sensor here /
lpsxxx_init(&lpsxxx, &lpsxxx_params[0]);
/
Initialize the lsm303dlhc sensor here */
lsm303dlhc_init(&lsm303dlhc, lsm303dlhc_params);
thread_create(stack, sizeof(stack), THREAD_PRIORITY_MAIN - 1,
0, thread_handler, NULL, “lsm303dlhc”);

/* Add the lps331ap sensor polling endless loop here */
 while (1) {
    uint16_t pres = 0;
    int16_t temp = 0;
    lpsxxx_read_temp(&lpsxxx, &temp);
    lpsxxx_read_pres(&lpsxxx, &pres);
    printf("Pressure: %uhPa, Temperature: %u.%u°C\n",
           pres, (temp / 100), (temp % 100));
     
    isl29020_t dev;
    printf("Light value: %5i LUX\n", isl29020_read(&dev));
    l3g4200d_t dev_t;
    l3g4200d_data_t acc_data;
    l3g4200d_read(&dev_t, &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_sleep(2);
}
return 0;

}

aabadie2

Merci pour le code.

Le problème vient de la boucle while dans le main:

  • il faut enlever la ligne isl29020_t dev;
  • il faut remplacer printf("Light value: %5i LUX\n", isl29020_read(&dev)); par printf("Light value: %5i LUX\n", isl29020_read(&isl29020));
  • il faut enlever la ligne l3g4200d_t dev_t;
  • il faut remplacer l3g4200d_read(&dev_t, &acc_data); par l3g4200d_read(&l3g4200d, &acc_data);

Les variables dev et dev_t ne sont pas celles qui sont initializées par les fonctions isl29020_init et l3g4200d_init, respectivement.
Du coup, vous essayez de lire avec un driver non initializé, et ça plante, c’est normal.

EnockElie

merci infiniment ça marche mais un autre problème se pose: toutes les valeurs affichées sont 0

aabadie2

Pour les valeurs affichées, il ne faut pas vous inquiéter:

  • le gyroscope mesure la variation de vitesse angulaire et comme les capteurs sont fixes, cette vitesse quasi nulle suivant les 3 directions x, y et z
  • les boitiers sur le site de grenoble sont fixés sous un faux plancher et sont donc dans le noir, c’est pour ça que l’isl2090 renvoie une valeur nulle. Vous pouvez essayer sur le site de Lille où les capteurs sont dans un couloir et vous aurez des valeurs de luminosité non nulles.
EnockElie

Merci ça fonctionne très bien