Archive 07/10/2020.

TP avec double thread

DLRprod

Bonjour ,
j’ai essayé de refaire le TP en écrivant ce qui concernait le capteur lpsxxx dans un deuxième tread. J’ai modifié les priorités de chaque thread à mian -2 et main-1;
J’obtiens bien les mesures à l’affichage mais l’appareil s’emballe. Avez-vous une explication? Faut-il définir un message IPC pour les 2 threads ?priorit%C3%A9s_chang%C3%A9es

aabadie2

Bonjour,

Est-ce que vous avez déclaré les stack des thread dans 2 tableaux static différents ?

Si vous pouviez mettre tout le contenu de votre main.c, il me sera plus simple de vous aider :slightly_smiling_face:

Alexandre

DLRprod

ci-joint mon fichier main.c :

#include <stdio.h>

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

/* Add lps331ap (baromètre) related include here */
#include “lpsxxx.h”
#include “lpsxxx_params.h”

/* Add lsm303dlhc (accéléromètre) related include here */
#include “lsm303dlhc.h”
#include “lsm303dlhc_params.h”

/* 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_am(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;

}

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

/* Add the lpsxxx 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("Pression : %u hPa, Température : %u.%u °C\n",pres,(temp/100),(temp%100));
    xtimer_sleep(2);
}

return 0;

}

int main(void)
{
/* 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 - 2,
           0, thread_handler_am, NULL, "lsm303dlhc");

thread_create(stack, sizeof(stack), THREAD_PRIORITY_MAIN - 1,
           0, thread_handler_tp, NULL, "lpsxxx");

....
DLRprod

Cela venait effectivement du fait que je n’avais pas créé deux stacks différents.
Merci beaucoup.