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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.