PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Eigene Include-Datei verwenden



crowdy
31.05.2011, 22:32
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

#include "uart.h"uart.h:

extern int uart_putc(unsigned char c);
extern void uart_puts (char *s);
extern void uart_init_9600(void);uart.c

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

}Dabei entstehen mehrere solche Fehlermeldungen:

/home/Thomas/projects/ATmega16/UART/main.c:107: undefined reference to `uart_puts'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?
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

radbruch
31.05.2011, 22:38
uart.h:
Code:

extern int uart_putc(unsigned char c);
extern void uart_puts (char *s);
extern void uart_init_9600(void);

Warum "extern"?

Felix G
01.06.2011, 01:41
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.


Und muss ich eigentlich wenn die include Datei auf weitere Libs zurückgreift diese auch nochmal in der include-Datei includen?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).

crowdy
01.06.2011, 16:56
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?