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:
1 | #include <avr/io.h>
|
2 | #include <stdio.h>
|
3 |
|
4 | #ifndef __ASSERT_USE_STDERR
|
5 | #define __ASSERT_USE_STDERR
|
6 | #endif
|
7 | #include <assert.h>
|
8 |
|
9 | #define DEBUG_SIZE 100
|
10 | int debug_putchar(char c, FILE *stream)
|
11 | {
|
12 | (void) stream; //unused
|
13 | volatile static char debug[DEBUG_SIZE];
|
14 | static uint8_t ptr = 0;
|
15 | debug[ptr++] = c;
|
16 | if (c < 32 || ptr == DEBUG_SIZE) {
|
17 | ptr = 0;
|
18 | (void) debug;
|
19 | }
|
20 | return 0;
|
21 | }
|
22 |
|
23 | #define TEST_ERROR 0
|
24 | int main(void)
|
25 | {
|
26 | static FILE debug_out = FDEV_SETUP_STREAM(debug_putchar, NULL, _FDEV_SETUP_WRITE);
|
27 | stdout = &debug_out;
|
28 | stderr = &debug_out;
|
29 | for (;;) {
|
30 | printf("test\r");
|
31 | assert(TEST_ERROR);
|
32 | }
|
33 | }
|
Hinzu muss ein Breakpoint bei:
gesetzt werden. In den Einstellungen des Breakpoints muss ein Haken
unter „Aktionen“ gesetzt und unter „Meldung in Ausgabefenster
protokollieren“ der Wert:
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.