stdin, stdout: Modular austauschbar?

Gast #628571
Lesenswert?

Hi,

ich habe ein Verständnis-Problem mit StdIo.

Ich möchte erreichen, das ich absolut modulare Quelldateien habe. Eine 
usart.h und .c die sich eben um das senden der einzelnen zeichen 
kümmern. und eine msg.c und .h, die sich um das verwendete potokoll 
kümmert. Initiallisiert soll das ganze der reihe nach in der main 
werden.
1
usart_init();
2
msg_init();
3
printf("lala");

usart_init() soll dabei zB. die stdout mit seiner UsartTxByte() 
verknüpfen.
msg_init() soll anschließend sich die UsartTxByte() Adresse aus dem 
stdout holen und zukünftig für eigene ausgaben verwenden. in stdout 
kommt dann Ersatzweise zB. MsgTxByte(), damit das normale printf() auf 
die Msg-Routinen zugreift.

Ist das so einfach möglich, oder gibt es Probleme? ich habe versucht die 
stdio.h zu inspizieren, habe aber bald aufgeben müssen.

stdin ist als __iob[1] definiert.
__iob ist als Pointer auf __file.
__file ist wiederum ein struct:
1
/*
2
 * This is an internal structure of the library that is subject to be
3
 * changed without warnings at any time.  Please do *never* reference
4
 * elements of it beyond by using the official interfaces provided.
5
 */
6
struct __file {
7
  char  *buf;    /* buffer pointer */
8
  unsigned char unget;  /* ungetc() buffer */
9
  uint8_t  flags;    /* flags, see below */
10
#define __SRD  0x0001    /* OK to read */
11
#define __SWR  0x0002    /* OK to write */
12
#define __SSTR  0x0004    /* this is an sprintf/snprintf string */
13
#define __SPGM  0x0008    /* fmt string is in progmem */
14
#define __SERR  0x0010    /* found error */
15
#define __SEOF  0x0020    /* found EOF */
16
#define __SUNGET 0x040    /* ungetc() happened */
17
#define __SMALLOC 0x80    /* handle is malloc()ed */
18
#if 0
19
/* possible future extensions, will require uint16_t flags */
20
#define __SRW  0x0100    /* open for reading & writing */
21
#define __SLBF  0x0200    /* line buffered */
22
#define __SNBF  0x0400    /* unbuffered */
23
#define __SMBF  0x0800    /* buf is from malloc */
24
#endif
25
  int  size;    /* size of buffer */
26
  int  len;    /* characters read or written so far */
27
  int  (*put)(char, struct __file *);  /* function to write one char to device */
28
  int  (*get)(struct __file *);  /* function to read one char from device */
29
  void  *udata;    /* User defined and accessible data. */
30
};

da darf ich also nicht ran. die Makros verstehe ich nicht, und einfach 
immer neue files erzeugen, die dann verknüpft werden ist ja auch nicht 
das ziel?

hat jemand eine Idee, wie ich dem Problem Herr werden kann?

grüße,
Henning
Gast #628723
Lesenswert?

Hmm, ich habe keine besonderen Einstellungen vorgenommen. Ich 
programmiere im AVRStudio und kompiliere dann über das WinAVR-Plugin.
Mein Programm ist auch soweit lauffähig, ich würde es nur eben wie oben 
beschrieben ändern.

Im Build-Log sehe ich nichts, was Auskunft über die libc geben kann.

Ich habe grad in den "Project Options" die libc.a hinzugefügt, und kann 
immer noch fehlerfrei kompilieren.

Danke für den Hinweis, hast du noch einen weiteren Tip?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren