Verwenden einer anderen putch()-Funktion in einer Bibliothek

Ich schreibe eine C-Bibliothek für PIC18-Mikrocontroller, die mit dem ESP8266- Chip über den UART-Bus kommunizieren . Ich möchte die printf()Funktion verwenden, um formatierte Zeichenfolgen an den Chip zu senden.

Verwendet in XC8 printf()die Funktion putch(), die der Benutzer als Ausgabe definieren soll. Auf diese Weise kann der Benutzer entscheiden, ob er UART, LCD, ... für stdout verwenden möchte.

Das gibt mir ein Problem. In der Bibliothek, die ich verwenden möchte , printf()die auf basiert putch(), kann (sollte) ich dies nicht putch()in der Bibliothek deklarieren, da dies zu einem Konflikt führen würde, wenn ein Benutzer den ESP8266 in Kombination mit einem LCD verwenden möchte, für das er bereits definiert hat putch(). Wie kann ich dieses Problem lösen?

Ich könnte verwenden sprintf(), um die Zeichenfolge vorübergehend im Speicher zu speichern und dann meinen eigenen Code zu schreiben, um diesen Byte für Byte in das ESP zu schreiben, aber ich würde es wegen Speicher- und Zeitineffizienz lieber nicht tun.

Ich könnte auch meine eigene esp8266_printf()mit eingeschränkter Funktionalität rollen und diese stattdessen verwenden, aber das fühlt sich auch nicht so gut an.

Gibt es dafür eine saubere(r) Lösung?

Hinweis: Dies mag wie reine Programmierung erscheinen, aber dieser Putch-Trick ist kein Standard-C, und als solches ist diese Frage keine Standardprogrammierung und fragt nach einer PIC-abgestimmten Antwort.
Es ist kein fprintf()verfügbar?
@IgnacioVazquez-Abrams nein, leider nicht.

Antworten (1)

Sie könnten einen benutzerdefinierten PUTCH erstellen, der zur Laufzeit entscheidet, was mit dem Byte geschehen soll. Dies würde auf einer von Ihnen gepflegten globalen Einstellung basieren. Sie würden die globale Einstellung ändern, um Charaktere dorthin zu leiten, wo Sie sie gerade haben möchten. Eine davon kann die Routine eines Kunden sein, obwohl sie anders als PUTCH heißen müsste.

Danke! Das würde funktionieren, aber bei langen Strings hätte das Überprüfen dieser globalen Einstellung bei jedem Aufruf von putch() keinen großen Einfluss auf die Zeiteffizienz?
Das Überprüfen eines booleschen Werts und dessen Wert sollte im Vergleich zum Schreiben auf einen UART oder LCD nicht viel Zeit in Anspruch nehmen.
@Camil: Wie Wouter sagte, wird die zusätzliche Überprüfung und Verzweigung minimal sein. Der größere Overhead ist der verschachtelte Subroutinenaufruf und die Übergabe von Argumenten, das Speichern von Zuständen usw. Wenn Sie sich darüber wirklich Sorgen machen, schreiben Sie Ihren speziellen PUTCH in Assembler. Auf diese Weise kann es den Test sehr schnell durchführen und den größten Teil des Overheads einer anderen Unterroutinenschicht vermeiden. Beispielsweise kann es zur Ziel-Subroutine GEHEN, die dann zum Aufrufer von PUTCH zurückkehrt. Sie müssen sich sehr genau ansehen, wie Ihr Compiler Unterroutinen verknüpft, aber wenn es richtig gemacht wird, sollte die zusätzliche Schicht nur ein paar Zyklen umfassen.
In Ordnung, in diesem Fall gehe ich einfach diesen Weg und schaue es mir noch einmal an, wenn es langsam wird. Danke schön!