Forum: Compiler & IDEs Programm vergisst die Einstellung von stdout


von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

Hallo,

ich verwende in meinem Programm die USART-ausgabe per printf.

Der Code kurz zusammengefasst:
1
#include <stdio.h>
2
3
int main( void )
4
{
5
   USART_Init();
6
7
   static FILE mystdout = FDEV_SETUP_STREAM( usart_putchar, NULL, _FDEV_SETUP_WRITE );
8
9
   stdout = stderr = &mystdout;
10
11
   printf("Test 1");
12
13
   //...an dieser Stelle folgt weiterer C-Code der das TWI verwendet
14
15
   printf("Test 2");
16
}

Bei diesem Programm funktioniert die Ausgabe von "Test 1", nicht aber 
die von "Test 2".

Wenn ich stattdessen folgendes verwende, funktioniert die Ausgabe von 
"Test2":
1
#include <stdio.h>
2
3
int main( void )
4
{
5
   USART_Init();
6
7
   static FILE mystdout = FDEV_SETUP_STREAM( usart_putchar, NULL, _FDEV_SETUP_WRITE );
8
9
   stdout = stderr = &mystdout;
10
11
   printf("Test 1");
12
13
   //...an dieser Stelle folgt weiterer C-Code der das TWI verwendet
14
15
   //Dies hier...
16
   stdout = stderr = &mystdout;
17
   printf("Test 2");
18
19
   //Oder diese Version...
20
   fprintf(&mystdout, "Test 2");
21
}

Es scheint so, als ob das Programm die Einstellung von stdout, stderr 
"vergisst". Sobald ich direkt vor dem printf die Ausgabekanäle neu 
einstelle, bzw. den fprintf verwende funktioniert das Programm wie 
gewollt.

In dem Code-Teil für TWI wird definitiv nirgends das stdout bzw. stderr 
neu geschrieben.

Der Flash ist zu 19.1% gefüllt, der RAM zu 6.2% (Angaben beim 
Kompilieren).

Werden stdout und stderr durch irgendetwas anderes, außer durch direkte 
Zugriffe, verändert?

Vielen Dank,

Thomas

von Simon K. (simon) Benutzerseite


Lesenswert?

Möglicherweise erstellst du große lokale Puffer in dem TWI Code? Oder 
führst anderweitig unzulässige Speicherzugriffe dort aus.

Von allein verändert sich da nix.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.