mikrocontroller.net

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


Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
usart_init();
msg_init();
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:
/*
 * This is an internal structure of the library that is subject to be
 * changed without warnings at any time.  Please do *never* reference
 * elements of it beyond by using the official interfaces provided.
 */
struct __file {
  char  *buf;    /* buffer pointer */
  unsigned char unget;  /* ungetc() buffer */
  uint8_t  flags;    /* flags, see below */
#define __SRD  0x0001    /* OK to read */
#define __SWR  0x0002    /* OK to write */
#define __SSTR  0x0004    /* this is an sprintf/snprintf string */
#define __SPGM  0x0008    /* fmt string is in progmem */
#define __SERR  0x0010    /* found error */
#define __SEOF  0x0020    /* found EOF */
#define __SUNGET 0x040    /* ungetc() happened */
#define __SMALLOC 0x80    /* handle is malloc()ed */
#if 0
/* possible future extensions, will require uint16_t flags */
#define __SRW  0x0100    /* open for reading & writing */
#define __SLBF  0x0200    /* line buffered */
#define __SNBF  0x0400    /* unbuffered */
#define __SMBF  0x0800    /* buf is from malloc */
#endif
  int  size;    /* size of buffer */
  int  len;    /* characters read or written so far */
  int  (*put)(char, struct __file *);  /* function to write one char to device */
  int  (*get)(struct __file *);  /* function to read one char from device */
  void  *udata;    /* User defined and accessible data. */
};

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ist das so einfach möglich, oder gibt es Probleme?

Das kommt darauf an, welche libc du verwendest.

Autor: hennin g. (henning)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.