Forum: FPGA, VHDL & Co. printf für microblaze Softcore


von Martin O. (ossi-2)


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?

von Martin S. (strubi)


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.

von Martin O. (ossi-2)


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.

von MicroBlazer (bauchfrei) (Gast)


Lesenswert?

Aus den Xilinxbibliotheken steht dir xil_printf() zur Verfügung.

von Martin O. (ossi-2)


Lesenswert?

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.

von Strubi (Gast)


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.

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.