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 :

Conversion float to string


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut Conversion float to string
    Bonjour,

    Je suis en train de créer un programme qui tourne sur microcontrôleur PIC32MZ avec FreeRTOS.

    Le microcontrôleur redémarre de manière aléatoire : le reboot est effectué après une exception levée sur un pointeur ayant une mauvaise adresse dans du code appartenant aux libraries standards fournis avec le compilateur (je ne sais donc pas quelle fonction plante).
    => L’hypothèse qui me semble la plus probable est que les fonctions sprintf/snprintf ne sont pas "thread safety" et/ou qu'elles utilisent les fonctions malloc/free des libraries standard, ce qui interfère avec l'utilisation de FreeRTOS.

    Je suis donc partie dans l'idée de créer mes fonctions de conversion pour être certain de leur comportement.

    Actuellement, j'ai déjà fait mes fonctions de conversion entier vers string et maintenant j'aimerai faire ma fonction de conversion float to string (et double to string).
    J'aimerai pouvoir passer en paramètre le nombre de chiffre après la virgule et la taille minimale de la chaine afin d'insérer des caractères espace ou '0' (paramètre configurable) en début de chaine si celle-ci est trop petite

    PS : j'ai compris comment était codé en binaire un float... c'est déja un début.

    Quelle méthode me conseillez-vous d’utiliser ?

    Merci d'avance,

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Et (sn)printf ne fait pas l'affaire ? printf("%0.*f", nbDecimals, floatValue); ?
    http://www.cplusplus.com/reference/cstdio/printf/
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par boboss123 Voir le message
    => L’hypothèse qui me semble la plus probable est que les fonctions sprintf/snprintf ... et/ou qu'elles utilisent les fonctions malloc/free des libraries standard
    Garanti que non
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    C'est en effet très peu probable un problème de réentrance dans de genre de code. Par contre ces bibliothèques sont consommatrices de données sur la pile. N'es-tu pas dans un cas de débordement de pile?
    Quand à coder soit même une conversion flottante, c'est loin d'être simple. C'est d'ailleurs dans ces traitements qu'il peut y avoir des erreurs (erreur sur les dernières décimales, mauvaise gestion des nombres dénormés)
    Regarde si ta bibliothèque dispose de ftoa() ou de fcvt() qui sont capables d'effectuer la conversion.

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Merci pour vos réponses.

    Ce que je remarque, c'est que depuis que j'ai implémenté mes fonctions custom pour remplacer (sn)print, mon µControleur reboot beaucoup moins souvent. Je n'ai pas encore fait la modification de partout dans mon code (seulement dans les endroits ou (sn)print sont appelés le plus souvant), ce qui expliquerait les reboots restants.

    J'avais aussi des problèmes sur la gestion des float (des variables de type float avait leur valeur modifiée de manière aléatoire) qui a été résolu avec cette méthode : https://www.microchip.com/forums/m1066871.aspx



    Citation Envoyé par dalfab Voir le message
    Par contre ces bibliothèques sont consommatrices de données sur la pile. N'es-tu pas dans un cas de débordement de pile?
    J'ai configuré le "minium stack size" du compilo à 10000, ce qui semble largement suffisant pour initialiser FreeRTOS (dans freeRTOS, j'utilise heap_1.c : https://docs.aws.amazon.com/fr_fr/fr...anagement.html). Je n'ai pas détecté d'erreur avec les fonctions de debug FreeRTOS : vApplicationStackOverflowHook(), xPortGetFreeHeapSize() et uxTaskGetStackHighWaterMark().
    En configurant à 0 la heap du compilateur (pas celle de FreeRTOS), les fonctions (sn)printf fonctionnent encore même avant appel de osStartKernel() : ce qui laisse supposer qu'elles utilisent uniquement la stack (et pas de heap).

    Citation Envoyé par dalfab Voir le message
    Regarde si ta bibliothèque dispose de ftoa() ou de fcvt() qui sont capables d'effectuer la conversion.
    Je veux bien mais qu'est-ce qui me garanti que ces fonctions sont thread safety ? je n'arrive pas à trouver l'information... et je n'ai pas d'autres pistes d'où pourrait venir le problème.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    J'ai configuré le "minium stack size" du compilo à 10000, ce qui semble largement suffisant pour initialiser FreeRTOS (dans freeRTOS, j'utilise heap_1.c : https://docs.aws.amazon.com/fr_fr/fr...anagement.html). Je n'ai pas détecté d'erreur avec les fonctions de debug FreeRTOS : vApplicationStackOverflowHook(), xPortGetFreeHeapSize() et uxTaskGetStackHighWaterMark().
    Je ne sais pas à quoi correspond la 'minimum stacke size' du compilo. Mais ici il y a un noyau temps réel embarqué, et chaque thread doit avoir une pile, et chaque pile foit avoir une taille attribuée. Et ce qui est important c'est le maximum accessible.
    Citation Envoyé par boboss123 Voir le message
    En configurant à 0 la heap du compilateur (pas celle de FreeRTOS), les fonctions (sn)printf fonctionnent encore même avant appel de osStartKernel() : ce qui laisse supposer qu'elles utilisent uniquement la stack (et pas de heap).
    Heureusement qu'il n'y a pas heap utilisée. C'est justement pourquoi il peut pas y avoir de problème de data race dans ce genre de fonction.
    Citation Envoyé par boboss123 Voir le message
    Je veux bien mais qu'est-ce qui me garanti que ces fonctions sont thread safety ? je n'arrive pas à trouver l'information... et je n'ai pas d'autres pistes d'où pourrait venir le problème.
    Il faudrait voir comment créer une fonction qui ne serait pas 'thread safe': seule cause : mauvaise gestion d'une ressource partagée, mais quel type de ressource :
    - la heap est une ressource partagée, aucune raison de faire une allocation dynamique ici un buffer en dur gère tous les flottants, et tu as toi même fourni la preuve qu'aucune allocation dynamique n'est effectuée.
    - sinon quelle ressource système pourrait être nécessaire ? un coprocesseur pour les calcul flottant ? Ça serait un conflit entre les interruptions et les threads, mais l"erreur sera sur toutes les fonctions utilisant du calcul flottant. Je ne vois rien d'autre et je crois peu à cela.
    Sincèrement comment une fonction purement calculatoire pourrait être suffisamment mal écrite pour avoir un conflit de ressource?(il y a bien un moyen simple mais aucun débutant ne ferait cette erreur!) La probabilité d'avoir un 'data race' dans ton code me parait infiniment plus probable.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Pour info, malloc() et free() n'ont aucun effet sur FreeRTOS qui a son propre tas avec son propre allocateur.

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Je ne sais pas à quoi correspond la 'minimum stacke size' du compilo. Mais ici il y a un noyau temps réel embarqué, et chaque thread doit avoir une pile, et chaque pile foit avoir une taille attribuée. Et ce qui est important c'est le maximum accessible.
    Oui j'ai bien défini une taille de pile pour chaque tache, le 'minimum stacke size', c'est la taille mémoire minimale que est alloué aux fonctions appelée en dehors des taches FreeRTOS.

    Citation Envoyé par dalfab Voir le message
    - sinon quelle ressource système pourrait être nécessaire ? un coprocesseur pour les calcul flottant ?
    Je n'ai pas l'impression que le problème vienne de là car mes calculs sont bons


    ... Je continue de chercher...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Conversion float en string
    Par davelop dans le forum C#
    Réponses: 7
    Dernier message: 09/11/2016, 13h48
  2. conversion float-string, probleme de precision.
    Par KINENVEU dans le forum Général Python
    Réponses: 2
    Dernier message: 18/01/2008, 08h47
  3. conversion de float en string
    Par Spont dans le forum C
    Réponses: 4
    Dernier message: 15/05/2007, 16h27
  4. [conversions] float to std::string
    Par poukill dans le forum SL & STL
    Réponses: 4
    Dernier message: 08/03/2007, 11h46
  5. [Java]Conversion de float en String et inversement
    Par djoukit dans le forum Langage
    Réponses: 7
    Dernier message: 13/10/2005, 11h55

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