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

Gast #1553921
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
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
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
> 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
>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
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
> 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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.