welcome: please sign in

Verwendung von printf mit AVRGCC

Falls man auf einem Mikrocontroller die bekannten printf-Funktionen nutzen möchte um einfach variablen formatiert ausgeben zu können, muss man sich eine Ausgabefunktion der folgenden Gestalt badteln:

   1 int uart0_putchar(char c, FILE *sream) {
   2         while(uart0_tx_head == ((uart0_tx_tail-1)&(UART0_TX_BUFFER_SIZE-1)) ) {}
   3         uart0_tx_buffer[uart0_tx_head++] = c;
   4         uart0_tx_head &= (UART0_TX_BUFFER_SIZE-1);
   5         uart0_udre_int_en();
   6         return 0;
   7 }

Im Hauptprogramm muss man diese funktion dann als stdout definieren und kann wie gewohnt mit printf Strings ausgeben. Es ist Nützlich wenn man sich ein kleines Makro definiert, welches zum einen den Formatstring aus dem Flash liest, und zum Anderen umdefiniert werden kann, und somit alle vorkommen von printf entfallen.

   1 #include <avr/io.h>
   2 #include <stdio.h>
   3 
   4 #define print(fmt,...) printf_P(PSTR(fmt), ##__VA_ARGS__)
   5 //#define print(fmt,...) 
   6 
   7 static FILE mystdout = FDEV_SETUP_STREAM(uart0_putchar, NULL, _FDEV_SETUP_WRITE);
   8 
   9 int main() {
  10         stdout = &mystdout;
  11 
  12         print("Hello World\r\n");
  13 }