IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Problème avec gmtime_r() pour programme géré par FreeRTOS


Sujet :

Embarqué

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème avec gmtime_r() pour programme géré par FreeRTOS
    Bonjour à tous,
    J'ai un programme embarqué sur STM32 M4, où j'utilise des threads. Je voudrais faire une fonction qui stocke dans un int la date du jour, donc sous forme JJMMAAAA.
    Pour éviter la casse, j'utilise donc gmtime_r() (librairie time.h).
    J'ai un fichier date_heure.c qui contient la dite fonction, et j'appelle cette fonction dans un fichier datalog_application.c.
    Voici le contenu actuel de date_heure :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include "date_heure.h"
    #include <time.h>
    #include <stdio.h>
     
    int getDate(){
     
    	time_t timestamp;
    	struct tm *t;
    	int ret;
     
    	timestamp = time(NULL);
    	if(gmtime_r(&timestamp,&t) == NULL){  //fonction évitant les problèmes avec les threads
    		return 0;
    	}else{
    		ret = (t->tm_year) + (t->tm_mon)*10000 + (t->tm_mday)*1000000;
    		return ret;
    	}
     
    }

    Et l'endroit où j'appelle la fonction :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     static uint16_t sdcard_file_counter = 0;
      char file_name[40] = {0};
      int date = 1;
      date = getDate();
      char datechar[9];
      sprintf(datechar, "%d", date); //int vers char
      sprintf(file_name, "%s%s%.3d%s", datechar, "data", sdcard_file_counter, ".csv");
      sdcard_file_counter++;

    La fonction contenant le code ci-dessus est appelée dans un thread qui est dans mon main().

    Le problème est que dès l'appel de la fonction de date_heure.c dans datalog_application.c, le main ne fonctionne plus et reste bloqué sur le thread faisant appel à datalog_application.
    J'espère que c'est assez détaillé, toute aide est la bienvenue !
    Merci

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2011
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Octobre 2011
    Messages : 153
    Points : 591
    Points
    591
    Par défaut
    Bonjour,

    De ce que je vois, tu utilises sprintf pour copier les données dans tes chaînes de caractère mais il n'y a aucun contrôle de la taille des chaînes. Est-ce que tu as vérifié que ton programme n'est pas carrément bloqué à cause d'un hardfault, qui serait causé par un dépassement de tampon ?

    Plutôt que sprintf, essaye sprintf_s (qui oblige à indiquer la taille du buffer de destination) et vérifie s'il y a un mieux.

  3. #3
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Pointeur de pointeur ?
    Bonjour,

    La déclaration de t est struct tm *t;. C'est donc un pointeur sur tm. Le code qui suit est gmtime_r(&timestamp, &t). On passe donc l'adresse du pointeur.

    Pourtant le prototype est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct tm *gmtime_r( const time_t *timer, struct tm *buf );
    C'est à dire un simple pointeur sur une structure tm. Sauf erreur, je pense que * de struct tm *t; est de trop (de plus qui allouerait autrement l'espace nécessaire ?).

    Enfin l'écriture pourrait être simplifiée. Par ailleurs, transformer la date en champs hexa décalés, 0x0DDMYYYY, permet les mêmes opérations que la version décimale mais coûte beaucoup moins cher en temps:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "date_heure.h"
    #include <time.h>
    #include <stdio.h>
     
    int getDate(){
     
    	time_t timestamp;
    	struct tm t;
     
    	timestamp = time(NULL);
    	if(gmtime_r(&timestamp, &t)){  //fonction évitant les problèmes avec les threads
    		return  t->tm_year + ((t->tm_mon) + (t->tm_mday) <<  8) << 16; // en général on préfère YYYYMDD qui permet plus facilement des comparaisons
    	return 0;
     }

    Si je ne me trompe pas, il est possible que les problèmes viennent de là.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/02/2006, 18h31
  2. Petit problème avec GCC pour l'Unicode...
    Par Nico*3-3 dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 29/01/2006, 17h12
  3. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08
  4. Réponses: 5
    Dernier message: 27/08/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo