mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf bringt nach Compilierung im Relaese Mode nur "?" als Wert


Autor: Sebastian W. (rufus857)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite mit AtmelStudio 6.2 und dem AVR Compiler. Bis zur 
Vertigstellung meines Programms arbeitete ich immer im Debug Modus. Da 
funktioniert alles wie gewollt. In meinem Programm arbeite ich mit allen 
Spannungen in Millivolt. Die Ergebnisse der Spannungen sende ich via 
GSM-Modul als SMS auf mein Smartphon. Dort sollen die Spannungsangaben 
in Volt erscheinen. Diese Wandlung und das Zuammensetzen des zu 
übertragenden String geschieht mit folgender Programsequenz.

#define LiIon  1
#define Text_buffer_size 160  
char Text[Text_buffer_size];    // Sendebuffer

  eeprom_read_block(Text, eeName, sizeof(eeName));
// LiIon Voltage 
  if(Flags116 & FMLiIon_alarm)
  {
    strcat_P(Text,PSTR("-> "));
  }
  sprintf(U_array_fl[LiIon],"%4.2f",((double)mVLiIon/1000));
  strcat_P(Text,PSTR("Backup battery: "));
  strcat(Text,U_array_fl[LiIon]);
  strcat_P(Text,PSTR("V\n"));

// Main Battery Voltage
  if(Flags116 & FMmb_alarm)
  {
    strcat_P(Text,PSTR("-> "));
  }
  strcat_P(Text,PSTR("Main battery: "));
  sprintf(U_array_fl[Akku],"%5.1f",((double)MainBatValue/1000));
  strcat(Text,U_array_fl[Akku]);
  strcat_P(Text,PSTR("V\n"));

  SMS_Send(TelNr,Text);


Jetzt habe ich in den Relaese Modus gewechselt und habe nun folgendes 
Problem. Auf meinem Smartphon erscheint statt der Spannungswerte nur ein 
"?". Ich vermute dass ich einen Fehler in der Konfiguration im 
AtmelStudio habe. Kann diesen jedoch nicht finden. Kennt jemand dieses 
Problem und kann mir weiterhelfen?

Gruß
Sebastian

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird im Release-Build auch die FP-Varianter der printf-Lib dazugelinkt?

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Makefile:

# Enable floating-point support in printf
LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nimmst du nicht sprintf_P und schreibst einmal in dein Array rein?

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das löst sein Problem ganz sicher nicht. Alle print Varianten nutzen 
intern den selben code.

Autor: Reinhard M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian W. schrieb:
> sprintf(U_array_fl[LiIon],"%4.2f",((double)mVLiIon/1000));

ohne mir absolut sicher zu sein
probier mal:
sprintf(U_array_fl[LiIon],"%4.2f",((double)mVLiIon/1000.0F));

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie bereits geschrieben, deuten die Fragezeichen auf fehlende 
Unterstützung der Floating-Point Operationen (in printf) hin. Das ist 
übrigens die Default-Vorgabe der Toolchain, solange man es nicht 
ausdrücklich aktiviert.

: Bearbeitet durch User
Autor: Axel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> solange man es nicht ausdrücklich aktiviert.

"Wie geht das?" wird sicher gleich gefragt werden ...


Nein - ich weis es auch nicht

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel R. schrieb:
> "Wie geht das?" wird sicher gleich gefragt werden ...
>
> Nein - ich weis es auch nicht

Hat Stefan doch schon geschrieben:

Stefan U. schrieb:
> Im Makefile:
>
> # Enable floating-point support in printf
> LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm

Und wenn man kein Makefile hat trägt man die entsprechenden Optionen 
halt in seiner IDE ein.

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guest schrieb:
> Axel R. schrieb:
> Stefan U. schrieb:
>> Im Makefile:
>>
>> # Enable floating-point support in printf
>> LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm
>
> Und wenn man kein Makefile hat trägt man die entsprechenden Optionen
> halt in seiner IDE ein.

Falls das make-File tatsächlich benutzt wird. Es ist einfach verdächtig, 
wenn eine Build-Version geht, die andere nicht.

Ich benutze immer Eclipse, daher bin ich kein guter Ratgeber für die 
AtmelStudio-Details, kenne aber das Problem aus meiner Welt.

Zum Test einfach mal aus dem make-File rausnehmen. Wenn Debug-Build dann 
immer noch funktioniert ...

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> Falls das make-File tatsächlich benutzt wird. Es ist einfach verdächtig,
> wenn eine Build-Version geht, die andere nicht.

Da er das Atmel Studio benutzt w

Carl D. schrieb:
> Falls das make-File tatsächlich benutzt wird. Es ist einfach verdächtig,
> wenn eine Build-Version geht, die andere nicht.
>
> Ich benutze immer Eclipse, daher bin ich kein guter Ratgeber für die
> AtmelStudio-Details, kenne aber das Problem aus meiner Welt.

Da er das Atmel Studion benutzt, wird wohl eher kein Makefile benutzt 
(bzw. es wird vom Studio dynamiych erzeugt).
Im Atmel Studio kann man in den Projekteigenschaften die meisten 
Parameter halt für jede Build-Konfiguration einzeln einstellen. Und wenn 
man da nicht aufpasst ist es eigentlich auch gar nicht mehr so 
verdächtig wenn nur eine davon geht.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops, da ist wohl mein Post etwas zerwürfelt. Also bitte die ersten vier 
Zeilen einfach ignorieren

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guest schrieb:
> Da er das Atmel Studion benutzt, wird wohl eher kein Makefile benutzt
> (bzw. es wird vom Studio dynamiych erzeugt).
> Im Atmel Studio kann man in den Projekteigenschaften die meisten
> Parameter halt für jede Build-Konfiguration einzeln einstellen. Und wenn
> man da nicht aufpasst ist es eigentlich auch gar nicht mehr so
> verdächtig wenn nur eine davon geht.

Meine Rede!
Ich hab auch hauptsächlich geschrieben wie man diese "Theorie" 
überprüfen kann.
Bei Eclipse-CDT kann man solche Settings auch "für alle Konfigurationen" 
machen, Default ist aber die aktuelle. Mangels Debug-Hardware mache ich 
in der Regel nur "Release"-Builds, damit immer nur eine Konfiguration, 
ergo dieses Problem nicht.

Autor: Sebastian W. (rufus857)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erstmal Entschuldigt, dass ich mich so lange nicht gemeldet habe. War 
bis heute Abend unterwegs. Und ein großes Danke für eure Hilfe.

Ja, der Fehler liegt meistens beim Programmierer. Ich arbeite nicht mit 
selbstgeschriebenen Makefiles sonder stelle im AtmelStudio im 
Projektmanager\Toolchain die Parameter ein. Und genau da habe ich nicht 
beachtet, dass im Release Modus das Häkchen in "Use vprintf 
Library(-WI,-u,vprintf) nicht gesetzt war.

Nochmals vielen Dank allen

Gruß
Sebastian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.