Hallo zusammen, wie die Überschrift schon sagt, gibt es zu meinem Problem schon eine Beschreibung in der AVR-GCC-Doku. Nur: Ich verstehe sie nicht: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#stdio_without_malloc Wo/wie lege ich den Puffer fest? In dem Beispiel habe ich doch nirgendwo eine Variable, die dauerhaft Speicher belegt? Die Frage ist zwar peinlich, aber ich werde wohl damit leben müssen. Viele Grüße Nicolas
Walter Tarpan schrieb: > Wo/wie lege ich den Puffer fest? Welchen Puffer? > In dem Beispiel habe ich doch nirgendwo eine Variable, die dauerhaft > Speicher belegt? Doch: static FILE mystdout
Es gibt in dem Beispiel keinen Buffer.
1 | printf("Hello, world!\n"); |
Ruft intern für jedes Zeichen die funktion uart_putchar auf. Welche dann wiederum das Zeichen per UART sendet. Wenn du da einen TX-Buffer drin haben willst musst du den selbst einbauen. static FILE mystdout ist vereinfacht gesagt nur ein Pointer auf uart_putchar. Und mit stdout = ... legst du das Ziel der Standardausgabe fest. Umschalten (Display/UART/...) ist so möglich.
Tim schrieb: > Es gibt in dem Beispiel keinen Buffer. Ah, das erklärt einiges. printf arbeitet den Eingangsstring also häppchenweise ab. Was natürlich eine weitere Frage aufwirft: Ist dann "snprintf" schneller als "printf" (von der Laufzeit von "putchar" mal abgesehen)?
Walter Tarpan schrieb: > Was natürlich eine weitere Frage aufwirft: Ist dann "snprintf" schneller > als "printf" (von der Laufzeit von "putchar" mal abgesehen)? Warum sollte es? putchar ist ja gerade der Unterschied zwischen den beiden.
Ansonsten: das ist Opensource. Schau dir doch bitte einfach die Implementierung an, und mach dir selbst ein Bild davon. Steht alles in vfprintf.c. (Alle anderen *printf.c-Dateien sind nur Wrapper um diese herum.)
Rolf Magnus schrieb: > Warum sollte es? Rein intuitive Vermutung: wenn das eine (printf) normaleweise einen Puffer benötigt ("malloc") und zurechtsgestutzt wird, das nicht zu tun und das andere ("snprintf") sowieso einen Puffer hat drängt sich die Frage auf, ob das Geschwindigkeitsunterschiede mit sich bringt. Jörg Wunsch schrieb: > Ansonsten: das ist Opensource. Schau dir doch bitte einfach die > Implementierung an, und mach dir selbst ein Bild davon. Steht alles > in vfprintf.c Ich habe Respekt vor Leuten, die gut anderer Leute Quelltext lesen können. Selbst mache ich das nur dann, wenn die anderen Möglichkeiten der Informationsbeschaffung ausgeschöpft sind. OK, dieser Punkt ist wohl erreicht. Danke für die Hilfe!
Walter Tarpan schrieb: > Rein intuitive Vermutung: wenn das eine (printf) normaleweise einen > Puffer benötigt ("malloc") und zurechtsgestutzt wird Da wird nichts "zurechtgestutzt". fdevopen() ist das Äquivalent zu fopen() aus dem Standard. Diese Funktion liefert (weil das eben im Standard so steht) einen Zeiger auf ein Objekt vom Typ "FILE". Dafür (und nur dafür) wird malloc() benötigt. Wenn man die FILE-Objekte jedoch stattdessen statisch vordefinieren will, entfällt die Notwendigkeit für malloc(), denn der Speicher ist ja dann statisch in der Applikation bereits vorhanden. Ein Puffer ist dabei in keinem Fall involviert (wenn man von einem „Puffer“ der Tiefe eins absieht, der dafür da ist, damit das im Standard vorgesehene ungetc() implementiert werden kann).
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.