sprintf(my_str,".%f",Temp);

Gast #1553921
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
Gast #1553965
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
Gast #1553987
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
Gast #1554023
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...
Gast #1554065
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!!!
Gast #1554084
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.>>>>>?
Gast #1554187
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren