yagarto und sprintf für float macht Probleme mit ARM

OP #2260894
Lesenswert?

Hallo zusammen,

die sprintf Funktion geht bei mir nur mit Integer, jedoch sobal dich 
einen float Wert in einen String einfügen will springt der Arm immer in 
den DAbortHandler.
Gelinkt sind lc lgcc lm. Hab ich noch was vergessen?
gcc Version ist 4.6.0

vielleicht kann mir jemand nen Tip geben.

Grus Stefan
Moderator Persönliche Seite #2261937
Lesenswert?

Zumindest bei älteren Versionen der newlib (den ganz aktuellen Quellcode 
noch nicht angeschaut) wird von der hinter sprintf arbeitenden 
libc-Funktion Speicher vom Heap angefordert. Wenn dem immer noch so ist: 
ist der sbrk-syscall erforderlich, die darin genutzte heap-Startadresse 
korrekt vorzugeben und es muss ab dieser Adresse auch Speicherplatz auf 
dem Heap verfügbar sein.
#2262054
Lesenswert?

Hallo Stefan,

>vielleicht kann mir jemand nen Tip geben.
Ja könnte ich versuchen, aber nur wenn ich weis was für eine
CPU Du benutzt.

Ich habe vor kurzen schon so eine Anfrage bekommen, und ich hatte
keine Probleme, bei mir ging alles. Bis ich auch eine ARM7 CPU zum
testen verwendet habe...

Ich will damit sagen, das es bei meinen Cortex-M3 Beispielen keine
Probleme gibt, und die ARM7 hier Probleme machen.

Bitte, bitte, bitte, gibt doch bei Problembeschreibungen mehr Infos
wie z.B. welche CPU benutzt wird mit an.

Hier nun ein Versuch der Lösung.

1. syscalls.c gibt es hier:
http://www.yagarto.de/download/yagarto/syscalls.c

2. Im Linker Script muss das Symbol "end" an der richtigen Stelle
eingefügt werden.

3. Ich habe die Info bekommen das der Stack 8 Byte aligned sein muss.

Viele Grüße,
Michael
PS: Es wurden ca. 2K vom Heap angefordert.
OP #2263509
Lesenswert?

Also der uC ist ein ARM7 von NXP und zwar genau der LPC2148. Habe 
eigentlich den Beispielcode von der yagarto Seite genommen und dort die 
zusätzlichen Librarys eingebunden, und die caddr_t _sbrk_r (struct 
_reent *r, int incr) aus der syscalls.c in mein Programm mit eingefügt.
Das programm ist eigentlich eine leere main Funktion in der nur sprintf 
aufgerufen wird. Ach ja das Symbol end ist im Linkerskript drinnen.

werde morgen mal probieren die syscalls.c komplett in das Program so 
einzubinden und mal schaun ob es damit geht.

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