Forum: Compiler & IDEs GNUARM FP mit sprintf


von roty (Gast)


Lesenswert?

Bitte mich nicht gleich steinigen wenn ich nochmals das Thema
FP mit sprintf hier aufrolle. Aber alle Hinweise hier im Forum haben
mir nicht geholfen.

Ich habe das Problem, dass MANCHMAL bei sprintf mit %f ein Data Abort
Exception auftritt. Ich kann eindeutig nachvollziehen, dass diese
Exception aus der Library heraus passiert.

Als relativer GNU Anfänger wäre ich für sachdienliche Hinweise was ich
falsch mache sehr dankbar.


von Stefan (Gast)


Lesenswert?

D.h. Fortsetzung von
Beitrag "Data Abort Exception durch Library"

Nachdem ich dich damals leider aufs Glatteis geführt hatte, will ich was 
gut machen. Ich biete dir an, den Fehler soweit möglich zu debuggen. Ich 
habe nämlich seit neustem auch einen USB-JTAG-OCD und das muss laufen.

Kannst du dein Projekt so strippen, dass es schön klein ist, aber immer 
noch der Fehler kommt?

von roty (Gast)


Lesenswert?

Hallo Stefan,

war dir nie böse, ist schon ok! Danke für das Angebot.

Ich habe den betreffenden Code extrahiert und ein ganz kleines Programm 
erstellt. Leider tritt da das Problem nicht mehr auf. Ich kann hier auch
debuggen. Allerdings habe ich den Quellcode der Library nicht, kann also 
nur
Assembler Code sehen. Weisst du wo ich den Quelltext dazu finde kann ?
Das Programm schmiert in meinem gro0en Programm zuverlässig im Modul 
..\mprec\_d2b\+0x6C ab.

Grüsse

von Stefan (Gast)


Lesenswert?

Die Funktion d2b() befindet sich in mprec.c im libc Ast der newlib.

Die newlib Sourcen 1.12.0, 1.13.0 oder 1.14.0 für deine GNUARM Version 
3.3, 3.4, 4.0 oder 4.1 findest du bei http://www.gnuarm.com/files.html

von roty (Gast)


Lesenswert?

Dank sehr.

Habe es gefunden . Ich kann jetzt auch den Quellcode sehen und kann
sagen welcher Zugriff in den Flashbereich greift anstatt in den RAM
Bereich.
Leider verstehe ich nicht was dort in der Lib eigentlich gemacht wird.
Muss mal heute Abend weitersehen und vergleichen was im Fehlerfall und
im Nichtfehlerfall dort passiert.
Eventuell komme ich nochmals auf dich zurück, wenn man schon mal einen
Experten zur Hand hat!

Danke

von roty (Gast)


Lesenswert?

Hat mir jetzt doch keine Ruhe gelassen.

Manchmal hilft auch debuggen ohne dass man ganz genau versteht was 
abläuft!

Habe den Fehler gefunden. Es ist ein Problem mit der Memory Allocierung.
Durch die Verwendung eines sehr grossem RAM Buffers wurde der 
Stackbereich
durch neu hinzugekommende Variablen "angekratzt". Das hat also nur
zufälligerweise was mit der sprintf Funktion zu tun.

Danke nochmals für die anregende Hilfe.

von Hans (Gast)


Lesenswert?

Ich habe scheinbar das gleiche Problem. Wenn ich zusätzliche Variablen 
in meinem Projekt definiere, dann funktioniert die sprintf-Funktion 
nicht mehr, d.h. sie schreibt in einen anderen RAM-Bereich und 
überschreibt somit Variablen. Ohne die zusätzlichen Variablen 
funktioniert es jedoch tadellos.

Wie kann ich dieses Problem umgehen, bzw. welche Lösungsmöglichkeiten 
gibt es?

von Hans (Gast)


Lesenswert?

Ich hab nun die große Funktion mit den vielen Variablen in zwei Teile 
geteilt. Dadurch ist das Problem verschwunden.

Grüße Hans

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.