Warum "extern"?uart.h:
Code:
extern int uart_putc(unsigned char c);
extern void uart_puts (char *s);
extern void uart_init_9600(void);
Moin Moin,
ich würde gerne eigene Include-Dateien verwenden, um unter anderem meinen code etwas übersichtlicher zu machen. Leider habe ich das aber noch nicht hinbekommen... Ich verwende avr-gcc unter Linux. Die Artikel auf RN-Wissen und mikrocontroller.net haben mir auch nicht so richtig weitergeholfen, deswegen wende ich mich jetzt mal ans Forum.
Einbinden inder main.c Datei sieht so aus
uart.h:Code:#include "uart.h"
uart.cCode:extern int uart_putc(unsigned char c); extern void uart_puts (char *s); extern void uart_init_9600(void);
Dabei entstehen mehrere solche Fehlermeldungen:Code:int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))); //Warten auf Bereitschaft UDR = c; //Senden return 0; } void uart_puts (char *s) { while (*s) //Durchlaufen des Strings bis zum Zeichen /0 { uart_putc(*s); s++; } } void uart_init_9600(void) { uint16_t bps_real; UCSRB |= (1 << TXEN)|(1 << RXEN)|(1 << RXCIE); UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 bps_real = (F_CPU/(9600 * 16.0))-1; //BdR für Timer umrechnen UBRRH = (bps_real >> 8); //bps_real=(F_CPU/(16*BD))-1 UBRRL = bps_real; //Baudrate auf 9.600 }
Also offensichtlich findet der Compiler die Funktionen nicht. Ich hab schon einiges mit der Makfile ausprobiert kenne mich damit aber nicht so richtig aus. An welcher Stelle muss man denn den Pfad angeben? Oder muss man den Pfad gar nicht angeben, wenn alle Dateien in dem selben Verzeichnis liegen? An welcher Stelle beim Kompiliervorgang werden die Libs denn dann kompiliert?/home/Thomas/projects/ATmega16/UART/main.c:107: undefined reference to `uart_puts'
Und muss ich eigentlich wenn die include Datei auf weitere Libs zurückgreift diese auch nochmal in der include-Datei includen?
Also ich bin etwas verwirrt, wie man vielleicht an den fragen merkt und hoffe, dass ihr mir weiterhelfen könnt
mfg crowdy
Warum "extern"?uart.h:
Code:
extern int uart_putc(unsigned char c);
extern void uart_puts (char *s);
extern void uart_init_9600(void);
Geändert von radbruch (31.05.2011 um 22:44 Uhr)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Stimmt, "extern" muss man nur bei Variablen explizit davor schreiben, bei Funktionen ist es eigentlich unnötig.
(es sollte aber auch keine Fehler verursachen, wenn man es trotzdem verwendet)
Im einfachsten Fall liegen alle Dateien im gleichen Verzeichnis (dann kannst du sie ohne Pfadangabe im Makefile eintragen), dann sollte sich das normalerweise problemlos kompilieren lassen.
Ja! Ein Beispiel dafür wäre, wenn man Typen wie uint8_t als Parameter bzw. Rückgabewerte nutzen möchte. Ohne #include <stdint.h> würde man in diesem Fall vom Compiler mit Fehlermeldungen bombardiert. In der .c Datei könnte man das entsprechende #include dann übrigens auch weglassen, weil es ja schon in der .h Datei steht (empfehlen würde ich das aber für den Anfang eher nicht, da man sonst leicht den Überblick verlieren kann).Und muss ich eigentlich wenn die include Datei auf weitere Libs zurückgreift diese auch nochmal in der include-Datei includen?
So viele Treppen und so wenig Zeit!
Vielen Dank für die Antworten, jetzt läuft es. extern... hmm ja stimmt, dass hat sich wohl verirrt, hat dann wohl aber nicht den Fehler verursacht. Der lag in der makefile.
Wenn die header-dateien aber nun doch in einem anderen Verzeichnis liegen, an welcher Stelle muss ich die Pfade dann einfügen?
mfg crowdy
Lesezeichen