printf für microblaze Softcore

OP #4899857
Derzeit compiliere ich C-Programm mit dem gcc Compiler für
den microblaze softcore. Den Code führe ich dann in
einer microblaze-emulation aus. Diverse Programme laufen einwandfrei,
inkl. floating point (z.B. sin(x) aus libm.a). Die printf Funktion
arbeitet auch für die Optionen %d %s %X einwandfrei, aber
Anzeige von Fließpunktwerten (%e %f) geht nicht, es werden Leerstrings 
ausgegeben. Der Code von printf ist so riesig, dass da eigentlich
die Fließpunktoptionen drin sein müssten

Welche Ideen zur Fehlersuche habt ihr ?
Wieviel Stackspeicher würdet ihr für printf vorsehen ?
Benutzt printf evtl. malloc?
#4900097
Martin O. schrieb:
> Derzeit compiliere ich C-Programm mit dem gcc Compiler für
> den microblaze softcore. Den Code führe ich dann in
> einer microblaze-emulation aus. Diverse Programme laufen einwandfrei,
> inkl. floating point (z.B. sin(x) aus libm.a). Die printf Funktion
> arbeitet auch für die Optionen %d %s %X einwandfrei, aber
> Anzeige von Fließpunktwerten (%e %f) geht nicht, es werden Leerstrings
> ausgegeben. Der Code von printf ist so riesig, dass da eigentlich
> die Fließpunktoptionen drin sein müssten
>
> Welche Ideen zur Fehlersuche habt ihr ?

gdb, RTS (read the source)

> Wieviel Stackspeicher würdet ihr für printf vorsehen ?

Hängt von der maximalen Stringlänge der erwarteten Ausgabe ab. Wenn du 
nur die nackte vsprintf() nutzt, kannst du das in deiner (eigenen) 
printf()-Funktion selber festlegen:
1
int printf(const char *fmt, ...)
2
{
3
  char buf[80];
4
  va_list args;
5
..

> Benutzt printf evtl. malloc?

Welche Implementierung? newlib, uClibc, ...?
Die reentrante newlib-Variante nutzt malloc. Aber vermutlich hast du 
eine andere, wie der hapernde float-support suggeriert.
OP #4900275
Ich benutze die libc.a, die der gcc standardmässig eingestellt hat.
I Map file gibts dann die Zeile:

c:/xilinx/sdk/2013.3/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx- 
elf/4.6.4/../../../../microblaze-xilinx-elf/lib/bs/m\libc.a(lib_a-printf 
.o)

Das scheint die Version anzugeben. In den verschiedensten 
Unterverzeichnissen
unter /sdk/2013.3/gnu.... finden sich aber zahlreiche andere Versionen
von libc.a, von denen sich mir nicht wirklich die jeweilige 
Spezialisierung erschliesst.
OP #4901183
xil_printf kann aber, soweit ich mich erinnere, keine 
Fließpunktvariablen.

Ausserdem geht es mir primär darum, zu verstehen warum printf nicht 
geht, auch wenn ich printf wegen der enormen Größe in der Praxis nicht 
verwenden werde.
Gast #4901199
Moin,

such dir doch einfach eine printf()-Implementation deiner Wahl im Source 
raus, es gibt zig kompakte Varianten im Netz neben uClibc und newlib, 
die auch Float können. Mit den libgloss-Xilinx-Minimalismen wirst du 
vermutlich keinen Spass haben.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.