printf für microblaze Softcore

OP #4899857
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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.
Gast #4901199
Lesenswert?

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

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