Forum: Compiler & IDEs stdin, stdout: Modular austauschbar?


von Henning (Gast)


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

von Rolf Magnus (Gast)


Lesenswert?

> Ist das so einfach möglich, oder gibt es Probleme?

Das kommt darauf an, welche libc du verwendest.

von Hennin G. (Gast)


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?

von Gast (Gast)


Lesenswert?

Unter

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_printf

findet man was dazu. Vielleicht passt das ja zu dem was du willst.

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.