Hallo, ich arbeite mit der Keil-IDE und einem STM32. Ziel ist es, Daten von einer seriellen Schnittstelle (UART) zu empfangen, zu analysieren und zu verarbeiten und bedingungsabhängig auf einer anderen auszugeben. Es geht um 3 Schnittstellen, die alle, Source und Senke der Information sein können. In den Templates, die zum Keil mitkommen, ist die printf-Ausgabe per #define festgeschrieben, was mir ja zur Laufzeit nicht weiterhilft. Wie löst man dieses Problem nun elegant? U.B. printf mit 2. Parameter oder vorher globale Variable umsetzen? Mit der retarget.c komme ich nicht klar, d.h. ich verstehe nicht, wie ich das damit lösen kann. Also, was ist Euer Vorschlag? Viel Grüße Jürgen
Soweit erinnert (nutze fast nur anderen Compiler/libc, ist aber überall ähnlich), wird den low-level-Funktionen (sys_write, sys_read,...) ein file-handle mitgegeben. printf nutzt STDOUT und für die anderen Schnittstellen führt man selbst File-Handles ein, nutzt fprintf/fgetc etc. und macht in den low-level-Funktionen (sys_write, sys_read...) Fallunterscheidungen oder - eleganter - mittels eines Arrays aus structs, in denen Funktionspointer für die jeweilige schnittstellenspezifischen Funktionen gespeichert sind.
Hallo, ich hatte das gleiche Problem.(benutze einen STM32F215) Hier mal eien retarget Variante die bei mir funktioniert. printf braucht um die 500Bytes, sollte ja aber kein Problem sein Ich weiss nicht, ob das ganze noch vom Debugger abhängt? Ich benutze einen J-Link Adapter per SW und nicht JTAG. Zusätzlich habe ich das ganze noch so konfiguriert: http://www.keil.com/support/man/docs/jlink/jLink_STM32F10xxx_SWT.htm Ich kann nun per printf Texte in das Debugfenster schreiben. Was ich noch nicht so ganz verstanden habe: Laut http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0067d/Cihdfbhe.html ist printf() nur abhängig von fputc() and ferror(). Bei mir wurden aber immer noch die file Funktionen wie _sys_open() aufgerufen. evtl. muss man da noch irgendwie den StdOut umkonfigurieren? Mit der retarget Version klappt es jetzt aber, da die _sys-Funktionen dort ersetzt sind. Da waren vorher auch noch Funktionen drinne, um printf für ein LCD benutzen zu können. Ich habe das aber gelöscht, da nicht benötigt. Wer weiteres wissen will, kann sich auch das Beispiel in "Keil\ARM\Boards\Keil\MCBSTM32E\framebuffer" zu gemüte führen Evtl. hilft das ja jemanden
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.