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 ist etwas
- ::
- /* 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.