Frage

Ich möchte printf verwenden, um Text auf einem seriellen Port eines ARM-Mikrocontroller Diplay. Ich bin zu tun, damit nicht in der Lage. Jede Hilfe ist willkommen.

Meine init_serial wie folgt aussieht

void init_serial (void)
{
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
U1DLL = 0x000000C2; /*9600 Baud Rate @12MHz VPB Clock */
U1LCR = 0x00000003; /* DLAB=0*/
}

was offensichtlich falsch ist.

War es hilfreich?

Lösung

Für Mikrocontrollern, haben Sie in der Regel Ihre eigene putc Funktion definieren Bytes zu senden je nachdem, was Sie UART verwenden. print wird dann putc nennen.

Überprüfen Sie die Dokumentation für die Bibliotheken mit dem Compiler zugeführt wird.

Beachten Sie, dass dies völlig unabhängig ist, wie Sie Ihre UART intialise. Alles, was zählt, ist die UART Sie verwenden.

(auf einem nicht verwandtes Thema, anstatt zu sagen:

PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR   = 0x00000083; /*8 bits, 1 Stop bit */

gibt es typischerweise #defines für die Register, die (in der Regel) Hilfe Lesbarkeit, einen Link zu den Bit-Namen in der Dokumentation, und reduziert die Notwendigkeit für Kommentare zu jeder Zeile wie diese aufgenommen und gepflegt werden. Zum Beispiel:

PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN;
U1LCR   = U1LCR_8BITS | U1LCR_1STOPBIT;

.. und so weiter.)

Andere Tipps

Um printf() , puts() etc Arbeit auf einer Embedded-Plattform, müssen Sie einige Haken implementieren, die mit der C-Bibliothek arbeiten. Dies ist in der Regel abhängig von den C-Bibliotheken mit dem Compiler bereitgestellt, so ist wahrscheinlich Compiler abhängig. Aber in vielen Fällen nur die Bibliothek erfordert, dass Sie eine schaffen putc() Funktion (oder einem ähnlichen Namen), die ein Zeichen nimmt (erzeugt durch die printf() Library-Funktion) und sendet sie an Ihr gewähltes Ausgabegerät. Das könnte ein Speicherpuffer, serielle Schnittstelle, USB-Nachricht sein, was auch immer.

Aus der Sicht der C-Bibliothek, die putc() Funktion Run-to-Completion würde, so ist es an Ihnen ist, ob Sie es implementieren eine einfache Sperrfunktion zu sein (zu warten, bis die seriell Port ist frei und das Zeichen) senden, oder nicht-blockierenden (es in einen Puffer setzen, durch einen Hintergrund Interrupt-Task gesendet werden, aber der Puffer füllen könnte, wenn Sie Ausgang genug Bytes schnell genug, und dann haben Sie entweder blockieren oder verwerfen Zeichen). Sie können es auch richtig mit Ihrem RTOS machen arbeiten, wenn Sie eine haben, eine blockierende Schreib Implementierung, die auf einem Semaphore schläft, bis die serielle Schnittstelle zur Verfügung.

So in der Zusammenfassung, lesen Sie in der Dokumentation zu Ihrem Compiler und seine C-Bibliothek, und es sollte Ihnen sagen, was Sie printf() Arbeit.

zu machen tun müssen

Beispiel-Links für AVR Micro mit GCC Compiler:

ARM GCC-Compiler newlib C-Bibliothek:

Ich bin nicht sicher über ARM insbesondere ...

Für einige Chips innerhalb der IDE, müssen Sie angeben, dass Sie einen Haufen benötigen die printf zu verwenden, und wie groß es sein sollte. Der Programmierer wird nicht automatisch eine angelegt.

Überprüfen Sie in den Menüs Ihrer Programmierer / IDE und sehen, ob es ein Ort ist, um die Heap-Größe angeben.

Und ich mit Steve einverstanden ist, ist dies nur, wenn Sie tatsächlich die printf verwenden können, sonst Ihre eigenen kleine Schnipsel schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top