Forum: Compiler & IDEs sprintf(my_str,".%f",Temp);


von Daniel (Gast)


Lesenswert?

Hallo zusammen,

gleich vornweg - ich bin newbee im Bereich ARM und arbeite mich gerade
ein mit Hilfe des Buch "C Programming for Embedded Microcontrollers".
Ich nutze das Olimex-DevBoard At91SAM7x256 mit Eclipse und
Yagarto-Toolchain.

Er kompiliert zwar alles aber mein System gibt nichts aus und bleibt 
beim sprintf bzw DBGUTxMSG hängen
1
    float Rtemp, Temp;
2
    INIT_ADC();
3
    ADC5=0;
4
    for(i=0;i<128;i++)
5
    {
6
      ADC_CR = 0x00000002;        //Starten der Wandlung
7
      while(!(ADC_SR & 0x00000020));
8
      ADC5 += ADC_CDR5;
9
    }
10
    ADC5 /= 128;
11
    Rtemp = ( (1024-ADC5) * 1800 ) /ADC5;
12
13
    Temp = log(Rtemp/2595.2) / (-0.0431);
14
15
    sprintf(my_str,"Aktuelle Temp = %f", Temp);
16
    DBGUTxMsg(my_str);

Wenn ich den sprintf durch
1
sprintf(my_str,"Aktuelle Temp = 0,00");
ersetze, erhalte ich diesen String zurück.

Gruß Daniel

von Stefan B. (Gast)


Lesenswert?

my_str ist wie deklariert?
Mathelibrary ist dazugelinkt?

von Daniel (Gast)


Lesenswert?

1
...
2
#inlude <math.h>
3
...
4
//globale Variablen
5
char my_str[40];
6
...


und wenn ich den sprintf durch folgendes ersetze
1
    i=13;              //unsigned int
2
    sprintf(my_str,"\r\n1: %u", i);

bleibt mein System nicht hängen.

sprintf hat ein Problem mit %f

von Daniel (Gast)


Lesenswert?

Bleibt hängen
1
    Temp = 45;                      //float
2
    sprintf(my_str,"Aktuelle Temp = %f", Temp);
3
    DBGUTxMsg(my_str);


und das gibt "Mist" aus
1
    Temp = 45;                      //float
2
    sprintf(my_str,"Aktuelle Temp = %f", 10);
3
    DBGUTxMsg(my_str);
Ausgabe:
1
Aktuelle Temp = 189AA@=<><.@@A8=0

von Stefan E. (sternst)


Lesenswert?

"%f" ist der Platzhalter für double.

von Stefan B. (Gast)


Lesenswert?

> sprintf hat ein Problem mit %f
Die Ganzzahlversion von sprintf vielleicht. Die Fliesskommazahlversion 
von sprintf bestimmt nicht.

>> Mathelibrary ist dazugelinkt?

Die Fliesskommaversion von sprintf steckt in der Mathelibrary...

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

>Mathelibrary ist dazugelinkt?
-lm dem Linker gesagt oder nur Header eingebuden?

>      ADC_CR = 0x00000002;        //Starten der Wandlung
>      while(!(ADC_SR & 0x00000020));
Warum denn so umständlich? 0x2 und 0x20 tun das selbe ;)

von Daniel (Gast)


Lesenswert?

>Mathelibrary ist dazugelinkt?
steht im makefile
1
LDFLAGS_R+=-lm

und in der Makeausgabe:
1
make all 
2
arm-elf-gcc -c -g -mcpu=arm7tdmi -O0 -Wall -I./Drivers -DAT91SAM7X256 Code/main.c -o main.o
3
arm-elf-gcc startup.o main.o dbgu.o syscalls.o -nostartfiles -Wl,-Map,out.map,--cref -T Startup/RAM.ld -lm  -n -o Tempsens2.elf
4
arm-elf-objcopy --strip-debug --strip-unneeded Tempsens2.elf -O binary Tempsens2.bin

Bei
1
float Temp = 10.4;
zeigt er den Wert nicht korrekt an und bei
1
double Temp = 10.4;

bleibt mein µC an der Augabe hängen!!!

von Daniel (Gast)


Lesenswert?

1
    float Temp;
2
    double Rtemp;
3
    Temp = 10.4;
4
    sprintf(my_str,"\n\rTemp(float) = %f", Temp);
5
    DBGUTxMsg(my_str);
6
    Rtemp = 10.4;
7
    sprintf(my_str,"\n\rTemp(double) = %f", Rtemp);
8
    DBGUTxMsg(my_str);

Ergebnis
1
Temp(float) = -0.000ñ',                                                         
2
Temp(double) = -A;C>ABC<@@><C;BB@@;AB=?A@DB?D@AB<?BDC@@ACBD?BCA;>>BA=<=D=>B.>>>>>?

von Stefan B. (Gast)


Lesenswert?

> Temp(float) = -0.000ñ',
> Temp(double) = -A;C>ABC<@@><C;BB@@;AB=?A@DB?D

Sieht nach einem Stackoverflow aus. sprintf benötigt VIEL Stack!

Wieviel gibst du deinem Programm? Typischerweise wird das in dem 
Startfile definiert. Das heisst je nach Toolchain anders z.B. startup.s 
oder boot.s. Bei deiner Toolchain heisst es wohl Startup.S. Die 
entscheidende Konstante dürfte USR_Stack_Size sein.

Ggf kannst du den Stack während der Laufzeit überwachen:
http://www.embeddedrelated.com/groups/AT91SAM/show/1899.php

> arm-elf-gcc startup.o main.o dbgu.o syscalls.o -nostartfiles
                                                 ^^^^^^^^^^^^^
> -Wl,-Map,out.map,--cref -T Startup/RAM.ld -lm  -n -o Tempsens2.elf

Und: Schau dir mal das Posting von Freddie Chopin an
http://www.codesourcery.com/archives/arm-gnu/msg03119.html

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.