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
floatRtemp,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
> 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...
>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 ;)
> 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