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

C Discussion :

Redéfinition des fonctions snprintf et sprintf


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut Redéfinition des fonctions snprintf et sprintf
    Bonjour,

    En installant FreeRTOS sur un PIC32MZ je me suis aperçu que ces fonctions deviennent buguées (impossible de savoir pourquoi alors que la fonction printf semble fonctionner correctement, j'ai pourtant vérifier à plusieurs reprises la configuration de mon projet) : seul %s est reconnu (%u, %f, ... ne sont pas reconnus).
    J'ai demandé sur le forum de microchip et FreeRTOS mais aucune réponse pour en connaitre la cause.

    La seule solution que j'ai trouvé est d'intégré à mon projet des fichiers .c/.h contenant les fonctions snprintf et sprintf.
    Pour que ça fonctionne, les fonctions de nomment fixup_snprintf et fixup_sprintf et dans mon fichier fixup_snprintf.h je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define snprintf    fixup_snprintf
    #define sprintf     fixup_sprintf
    Il suffit donc d'inclure dans mon projet ce fichier .h dans tous les fichiers .c qui utilisent les fonctions snprintf et sprintf pour modifier leur fonctionnement.

    N'existe t-il pas une solution pour le pas avoir à inclure le fichier fixup_snprintf.h ?

    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Cela vient sans douter de la toolchain et du linker en particulier. Certains toolchains demandent qu'on rajoute des options particulières. Par exemple, avec GCC pour ARM Cortex-M, j'ai rajouté l'option -u _printf_float pour pouvoir utiliser le formateur %f.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Le problème est que j'ai vérifié la configuration d'un projet sans FreeRTOS où snprintf et sprintf fonctionnent et je ne vois pas de différence avec mon projet FreeRTOS (dans les deux cas, j'ai le même compilateur et avec les mêmes options).
    J'avais vu que le %f pouvait poser des problèmes au cause d'activation/désactivation de la FPU et des libraires associées mais j'ai aussi des problèmes sur le gestion de %u, ce qui est bizarre.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai souvent utilisé FreeRTOS dans des projets et j'ai souvent eu des problèmes de printf(), mais je n'ai jamais eu de lien entre les deux. Je serai étonné si c'était ton cas.

    As-tu exactement le même code d'essai entre les 2 projets ? J'ai déjà eu des cas où printf() n'affiche rien ou affiche n'importe quoi si tu mets un formateur mais que tu ne lui passes pas le bon type en variable. Genre afficher un long avec %d au lieu de %ld.

    Tu utilises quelle toolchain / IDE ? Tu as moyen de faire une comparaison texte de tes projets et options ? C'est tellement facile de rater une checkbox dans une IHM....

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par Bktero Voir le message
    As-tu exactement le même code d'essai entre les 2 projets ? J'ai déjà eu des cas où printf() n'affiche rien ou affiche n'importe quoi si tu mets un formateur mais que tu ne lui passes pas le bon type en variable. Genre afficher un long avec %d au lieu de %ld.

    Tu utilises quelle toolchain / IDE ? Tu as moyen de faire une comparaison texte de tes projets et options ? C'est tellement facile de rater une checkbox dans une IHM....
    Le projet testé sous FreeRTOS est celui qui est fournis par FreeRTOS et que j'ai un tout petit peu modifié pour que ça fonctionne sur PIC32MZ2048EFM064. J'utilise MPLABX et j'ai testé avec compilateurs xc32 2.10 et 1.44 avec et sans legacy libc)
    Pour tester les fonctions snprint et sprintf, j'ai juste mis ce code en début de programme (et j'ai même mis un while(1); avant la partie création de tache pour être certain que ce n'est pas le fonctionnement des taches qui faisaient buguer) :
    Code : 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
        char dgb_buf[30];
        snprintf(dgb_buf, sizeof(dgb_buf), "%u", 123);
        printf("dgb_buf1 : %s\r\n", dgb_buf);
        snprintf(dgb_buf, sizeof(dgb_buf), "%f", 1.23);
        printf("dgb_buf2 : %s\r\n", dgb_buf);
        snprintf(dgb_buf, sizeof(dgb_buf), "%s", "yolo");
        printf("dgb_buf3 : %s\r\n", dgb_buf);
     
        printf("dgb_buf1b : %u\r\n", 123);
        printf("dgb_buf2b : %f\r\n", 1.23);
     
        sprintf(dgb_buf, "%u", 123);
        printf("dgb_buf1c : %s\r\n", dgb_buf);
        sprintf(dgb_buf, "%f", 1.23);
        printf("dgb_buf2c : %s\r\n", dgb_buf);
        sprintf(dgb_buf, "%s", "yolo");
        printf("dgb_buf3c : %s\r\n", dgb_buf);
    ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     
    dgb_buf1 :
    dgb_buf2 :
    dgb_buf3 : yolo
    dgb_buf1b : 123
    dgb_buf2b : 1.230000
    dgb_buf1c :
    dgb_buf2c :
    dgb_buf3c : yolo
    Le sujet que j'ai ouvert sur le forum de Microchip : https://www.microchip.com/forums/m1073229.aspx

    ça me semble difficile de pouvoir faire une comparaison de texte sur les configurations mais j'ai bien regardé chaque section de configuration une à une.
    Dans les options de compilation du projet FreeRTOS, il y a juste ces options en plus (obligatoires pour que ça compile) :
    - dans xc32-as : -I../../../Source/portable/MPLAB/PIC32MZ -I../ -DconfigUSE_TASK_FPU_SUPPORT=1
    - dans xc32-gcc : -Wall -Wextra -DconfigUSE_TASK_FPU_SUPPORT=1

    J'ai testé de mettre configUSE_TASK_FPU_SUPPORT à 0 mais ça ne change rien.

Discussions similaires

  1. Il manque des fonctions?
    Par Gruik dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/10/2003, 23h44
  2. Liste des fonctions
    Par Mookie dans le forum C
    Réponses: 2
    Dernier message: 22/09/2003, 16h42
  3. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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