Forum: Compiler & IDEs yagarto und sprintf für float macht Probleme mit ARM


von Stefan O. (avrstefan)


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

von stefe (Gast)


Lesenswert?

Schau mal da mit Augenmerk auf syscalls.c

Beitrag "printf bei armgcc"

von Oliver (Gast)


Lesenswert?

Solange nichts ausgegeben wird, braucht es auch keine angepasste 
syscall.c.

sprintf benötigt sehr viel Stack und Programmspeicher, vielleicht gibt 
es da Probleme.

Oliver

von Martin T. (mthomas) (Moderator) Benutzerseite


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.

von Michael F. (mifi)


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.

von Stefan O. (avrstefan)


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.

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.