mikrocontroller.net

Forum: Compiler & IDEs Anleitung: Atmel Studio stdout auf Output umleiten


Autor: Christian S. (christian_s593)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Ich wollte kurz eine Möglichkeit präsentieren, wie man stdout und stderr 
auf das Debug-Fenster in Atmel Studio umleiten kann. Damit kann man 
prima im Simulator aber auch mithilfe einer JTAG oder Debug-Wire 
Verbindung sich nützliche Sachen anzeigen lassen, ohne eine 
UART-Schnittstelle zu blockieren.

Hier mein Programmcode für die Ausgabe:
#include <avr/io.h>
#include <stdio.h>

#ifndef __ASSERT_USE_STDERR
#define __ASSERT_USE_STDERR
#endif
#include <assert.h>

#define  DEBUG_SIZE 100
int debug_putchar(char c, FILE *stream)
{
  (void) stream; //unused
  volatile static char debug[DEBUG_SIZE];
  static uint8_t ptr = 0;
  debug[ptr++] = c;
  if (c < 32 || ptr == DEBUG_SIZE) {
    ptr = 0;
    (void) debug;
  }
  return 0;
}

#define TEST_ERROR 0
int main(void)
{
  static FILE debug_out = FDEV_SETUP_STREAM(debug_putchar, NULL, _FDEV_SETUP_WRITE);
  stdout = &debug_out;
  stderr = &debug_out;
  for (;;) {
    printf("test\r");
    assert(TEST_ERROR);
  }
}

Hinzu muss ein Breakpoint bei:
ptr = 0;
 gesetzt werden. In den Einstellungen des Breakpoints muss ein Haken 
unter „Aktionen“ gesetzt und unter „Meldung in Ausgabefenster 
protokollieren“ der Wert:
{debug,s}
 eingetragen werden. Hinzu macht es Sinn den Haken bei „Ausführung 
fortsetzen“ zu setzen, damit nicht bei jeder Ausgabe das Programm stehen 
bleibt.
In den Screenshot ist nochmal der Breakpoint und die resultierende 
Ausgabe dargestellt.

Vor allem finde ich es in Kombination mit asserts sehr praktisch da man 
so einen Fehler schnell ausfindig machen kann, ohne sein Programmcode 
dafür groß zu ändern.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Feine Sache :)

Kleiner Wermutstropfen: 2 KBytes vom kostbaren Flash.

Die Ausgabe 2 mit Newline ('\n') ist putzig.


Simulator(AS7, ATTiny85):

Ausgabe 1: printf("Broterwerb\r");
"Broterwerb
"
"Assertion failed: (TEST_ERROR), function main, file .././main.c, line 38.
"

Ausgabe 2: printf("Broterwerb\r\n");
"Broterwerb
"
"
roterwerb
"
"Assertion failed: (TEST_ERROR), function main, file .././main.c, line 38.
"

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"putzig" hat sich erledigt.

Autor: Leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian (ThreadOpener)

ich finde es gut, dass du deine Lösung mit (uns) anderen teilen 
möchtest. Um deine Lösung jedoch besser zu finden, wäre es prima, wenn 
du diese in einem Artikel oder Snippet hinterlegen könntest.

Gruß Leo

Autor: Christian S. (christian_s593)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl schrieb:
> Kleiner Wermutstropfen: 2 KBytes vom kostbaren Flash.

Wenn man auf assert() und printf() verzichten kann, dann kann man auch 
viel Flash sparen. Stattdessen kann man zu puts() oder puts_P() greifen.
Den benötigten RAM bei assert darf man natürlich nicht außer Acht 
lassen.
Wenn es kritisch wird kann man natürlich auch "DEBUG_SIZE 100" 
verkleinern. Dadurch werden Ausgaben über mehrere Zeilen angezeigt, wenn 
die Ausgabe größer ist.

Karl schrieb:
> Die Ausgabe 2 mit Newline ('\n') ist putzig.

Ja stimmt, kleiner Schönheitsfehler, wenn man damit nicht leben kann 
einfach:
(void) debug;
durch:
memset((char *)debug, 0, sizeof(debug));
ersetzen. Jedoch wird auch dann noch jedes Steuerzeichen als Enter 
interpretiert. Wer das ändern will muss noch die Abfrage (c < 32) in (c 
== '\n') ändern, dann sollte es eigentlich passen.

Leo schrieb:
> Hallo Christian (ThreadOpener)
>
> ich finde es gut, dass du deine Lösung mit (uns) anderen teilen
> möchtest. Um deine Lösung jedoch besser zu finden, wäre es prima, wenn
> du diese in einem Artikel oder Snippet hinterlegen könntest.
>
> Gruß Leo

Ich hab den Link zu diesen Thread mal bei Atmel Studio unter Tipps 
und Tricks aufgenommen.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Christian

Vielen Dank für deine Erläuterungen :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.