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


von Sebastian W. (rufus857)


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.

1
#define LiIon  1
2
#define Text_buffer_size 160  
3
char Text[Text_buffer_size];    // Sendebuffer
4
5
  eeprom_read_block(Text, eeName, sizeof(eeName));
6
// LiIon Voltage 
7
  if(Flags116 & FMLiIon_alarm)
8
  {
9
    strcat_P(Text,PSTR("-> "));
10
  }
11
  sprintf(U_array_fl[LiIon],"%4.2f",((double)mVLiIon/1000));
12
  strcat_P(Text,PSTR("Backup battery: "));
13
  strcat(Text,U_array_fl[LiIon]);
14
  strcat_P(Text,PSTR("V\n"));
15
16
// Main Battery Voltage
17
  if(Flags116 & FMmb_alarm)
18
  {
19
    strcat_P(Text,PSTR("-> "));
20
  }
21
  strcat_P(Text,PSTR("Main battery: "));
22
  sprintf(U_array_fl[Akku],"%5.1f",((double)MainBatValue/1000));
23
  strcat(Text,U_array_fl[Akku]);
24
  strcat_P(Text,PSTR("V\n"));
25
26
  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

von Carl D. (jcw2)


Lesenswert?

Wird im Release-Build auch die FP-Varianter der printf-Lib dazugelinkt?

von Stefan F. (Gast)


Lesenswert?

Im Makefile:

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

von Dirk B. (dirkb2)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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

von Reinhard M. (Gast)


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));

von Stefan F. (Gast)


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.

von Axel R. (Gast)


Lesenswert?

> solange man es nicht ausdrücklich aktiviert.

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


Nein - ich weis es auch nicht

von guest (Gast)


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.

von Carl D. (jcw2)


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 ...

von guest (Gast)


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.

von guest (Gast)


Lesenswert?

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

von Carl D. (jcw2)


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.

von Sebastian W. (rufus857)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.