-         

Ergebnis 1 bis 4 von 4

Thema: Eigene Include-Datei verwenden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.02.2005
    Beiträge
    76

    Eigene Include-Datei verwenden

    Anzeige

    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
    Code:
    #include "uart.h"
    uart.h:
    Code:
    extern int uart_putc(unsigned char c);
    extern void uart_puts (char *s);
    extern void uart_init_9600(void);
    uart.c
    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
    
    }
    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
    mfg crowdy

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    uart.h:
    Code:

    extern int uart_putc(unsigned char c);
    extern void uart_puts (char *s);
    extern void uart_init_9600(void);
    Warum "extern"?
    Geändert von radbruch (31.05.2011 um 22:44 Uhr)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    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).
    So viele Treppen und so wenig Zeit!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    04.02.2005
    Beiträge
    76
    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

Ähnliche Themen

  1. hex-Datei in bin-Datei konvertieren
    Von Manta im Forum Software, Algorithmen und KI
    Antworten: 5
    Letzter Beitrag: 20.09.2009, 19:21
  2. c-datei zu exe-datei kompilieren
    Von Roboman93 im Forum Open Source Software Projekte
    Antworten: 9
    Letzter Beitrag: 27.02.2008, 10:46
  3. Hex Datei aus TXT Datei erzeugen?
    Von Thomas74 im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 01.01.2008, 20:56
  4. sch datei und lib datei öffnen
    Von xbgamer im Forum Konstruktion/CAD/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 6
    Letzter Beitrag: 03.09.2007, 08:03
  5. C Datei in Bin oder Hex Datei umwandeln
    Von MSSauerxxx im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 08.05.2005, 16:31

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •