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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.