1724
Kommentar:
|
1727
|
Gelöschter Text ist auf diese Art markiert. | Hinzugefügter Text ist auf diese Art markiert. |
Zeile 32: | Zeile 32: |
Die ``_read()`` Funktion ist etwas | Die ``_read()`` Funktion sieht so aus: |
Tipps zur Loesung der "retarget" Aufgabe vom 13.11.2019
Folgendes gilt fuer das Beispiel "a1".
In Src/usart.c muss man noch folgende Funktion einbauen:
__attribute__((weak)) char __io_getchar() { char c; c = usart_receive_char(); return c; }
Die Empfangsfunktion usart_receive_char() sieht so aus:
char usart_receive_char() { USART2_CR1 |= (1 << 2); while(!(USART2_ISR & (1 << 5))) ; return (char) USART2_RDR; }
Die _read() Funktion sieht so aus:
/* works with gets and scanf() -- int, string, float * works with getchar() * tested with picocom terminal emulator on Linux */ int _read(int file, char *ptr, int len) { int idx; char c; for (idx = 0; idx < len; idx++) { c = __io_getchar(); if (c == 0x0d) { /* 0x0d is the ENTER key */ *ptr++ = 0x0a; /* 0x0a is the newline character (line ending) */ return idx+1; } else { *ptr++ = c; } } }
Die _read() Funktion wird von allen Standardbibliotheksfunktionen aufgerufen, die ein oder mehrere Zeichen einlesen wollen. Da die Anzahl variabel ist, muss die die tatsaechlichen gelesenen Zeichen als Rueckgabewert zurueckliefern. Die Eingabe wird auf der Tastatur immer durch ENTER (ASCII 0x0d) abgeschlossen. Intern wertet aber __read() das Newline-Zeichen (0x0a) aus. Mit der obigen Funktion haben scanf(), gets() und getchar() funktioniert.