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