Forum: Compiler & IDEs Probleme mit uart Einbindung & Linker


von Felix D. (felix_lued)


Lesenswert?

Hallo gcc-Experten,

Wie der Titel bereits sagt habe ich ein Problem mit der Einbindung der 
uart library von Peter Fleury.
Obwohl ich - wie weiter unten zu sehen - die uart.h Datei included habe 
erscheint mir beim compilieren/linken folgende Fehlermeldung
1
-------------- Build: Debug in mm_comtest ---------------
2
3
Compiling: main.c
4
Linking console executable: bin/Debug/mm_comtest.elf
5
obj/Debug/main.o: In function `__vector_13':
6
/home/felix/avr/tests/mm_comtest/main.c:19: undefined reference to `uart_getc'
7
collect2: ld returned 1 exit status
8
Process terminated with status 1 (0 minutes, 0 seconds)
9
1 errors, 0 warnings

Als IDE verwende ich Code::Blocks unter Ubuntu und steh auf dem 
Schlauch.
Meiner Interpretation und google Ergebnissen nach fehlt irgend ein 
Eintrag für den Linker, aber ich weiß nicht, was er noch brauchen 
sollte.
Die uart.h liegt natürlich im Projektordner und wurde testweise auch 
schon den Ordner der anderen includes kopiert.
Könnt ihr mir vielleicht einen Tipp geben, wie ich das Problem 
beseitigen kann?

Mit freundlichen Grüßen,
Felix Dohrmann
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
#include <stdbool.h>
5
#include "functions.h"
6
#include "uart.h"
7
8
9
#define UART_BAUD_RATE      38400
10
11
//globale Variablen fuer interrupts
12
volatile uint8_t bit_counter;
13
volatile uint8_t new_uartByte, new_uartBit, uartBit1, uartBit2;
14
15
16
ISR(USART_RXC_vect)
17
{
18
    // Gleissignale empfangen
19
    new_uartByte=uart_getc();
20
    switch(new_uartByte)
21
    {
22
    case 32:  //Ein 1 Bit erhalten
23
        new_uartBit=1;
24
        PORTC |= (1 << PC7);
25
        break;
26
    case 0:    //Ein 0 Bit erhalten
27
        new_uartBit=0;
28
        PORTC |= (0 << PC7);
29
        break;
30
    }
31
    if (bit_counter%2==0)
32
    {
33
        uartBit1=new_uartBit;
34
        PORTC |= (1 << PC6);
35
    }
36
    else
37
    {
38
        uartBit2=new_uartBit;
39
        PORTC |= (0 << PC6);
40
    }
41
    bit_counter++;
42
}

von Walter S. (avatar)


Lesenswert?

Felix D. schrieb:
> Linking console executable: bin/Debug/mm_comtest.elf
> obj/Debug/main.o: In function `__vector_13':
> /home/felix/avr/tests/mm_comtest/main.c:19: undefined reference to `uart_getc'

d.h. dass der Linker die Funktion uart_getc nicht findet,
ist auch uart.c mit im Projekt?

von Krapao (Gast)


Lesenswert?

Das Include von uart.h ist nicht ausreichend. In dieser Datei steht 
maximal die Deklaration der Funktion uart_getc (d.h. der "Prototyp" der 
Funktion).

Du musst auch die Quelldatei in dein Projekt aufnehmen, in der die 
Funktion uart_getc definiert ist (d.h. der "Sourcecode" der Funktion).

von Karl H. (kbuchegg)


Lesenswert?

Felix D. schrieb:
> Hallo gcc-Experten,
>
> Wie der Titel bereits sagt habe ich ein Problem mit der Einbindung der
> uart library von Peter Fleury.
> Obwohl ich - wie weiter unten zu sehen - die uart.h Datei included habe
> erscheint mir beim compilieren/linken folgende Fehlermeldung

Du musst schon auch noch die Datei uart.c zu deinem Projekt hinzufügen.
In dieser Datei sind die IMplementierungen besagter Funktionen
>
> ISR(USART_RXC_vect)
> {
>     // Gleissignale empfangen
>     new_uartByte=uart_getc();

Was'n das für ein Unsinn.
Die Fleury Lib kümmert sich schon selbst um diesen Interrupt. Damit hast 
du nichts zu tun.
Du rufst einfach nur (zb in der Hauptschleife) uart_getc auf und das 
sagt dir dann schon, ob in der Zwischenzeit ein Zeichen eingetroffen 
ist. Peter hat doch ein Beispiel zu seiner Lib gemacht! Schau dir das 
doch einfach mal an.

von Felix D. (felix_lued)


Lesenswert?

Hallo Walter,

Danke schonmal für die schnelle Antwort!

Das habe ich natürlich auch schon probiert. Dann findet er allerdings 
etliche Fehler in der pgmspace.h weswegen ich glaubte hier auf dem 
Holzweg zu sein.

MfG
Felix
1
-------------- Build: Debug in mm_comtest ---------------
2
3
Compiling: uart.c
4
In file included from uart.c:93:0:
5
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:937:40: error: expected ‘)’ before ‘src’
6
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:938:41: error: expected ‘)’ before ‘src’
7
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:939:37: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
8
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:940:37: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
9
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:941:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
10
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:942:37: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
11
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:943:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
12
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:944:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
13
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:945:39: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
14
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:946:40: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
15
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:947:43: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
16
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:948:44: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
17
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:949:41: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
18
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:950:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
19
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:951:36: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
20
uart.c:238:37: error: Operator »||« hat keinen rechten Operanden
21
Process terminated with status 1 (0 minutes, 0 seconds)
22
16 errors, 0 warnings

von Felix D. (felix_lued)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Was'n das für ein Unsinn.
> Die Fleury Lib kümmert sich schon selbst um diesen Interrupt. Damit hast
> du nichts zu tun.
> Du rufst einfach nur (zb in der Hauptschleife) uart_getc auf und das
> sagt dir dann schon, ob in der Zwischenzeit ein Zeichen eingetroffen
> ist. Peter hat doch ein Beispiel zu seiner Lib gemacht! Schau dir das
> doch einfach mal an.




UUUPs.. Hatte ich ganz intuitiv mir mehr Arbeit gemacht. Ich schreibe es 
mal um. Vielleicht ist die einfache Variante doch wirklich richtig ;-)

Melde mich wieder, wenn ich Ergebnisse habe.


Danke für die vielen Antworten von euch! Klasse.

von Felix D. (felix_lued)


Lesenswert?

Habe die Sachen aus der ISR jetzt in die main geschoben und führe dort 
die Überprüfungen durch.


Immernoch erhalte ich bei im Projekt eingepflegtem uart.c die 
Fehlermeldungen in der pgmspace.h.
Ohne uart.c findet er die uart_getc immer noch nicht (das hätte ich nach 
euren Ausflüchten auch nicht anders erwartet)
1
-------------- Build: Debug in mm_comtest ---------------
2
3
Compiling: main.c
4
Compiling: uart.c
5
In file included from uart.c:93:0:
6
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:937:40: error: expected ‘)’ before ‘src’
7
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:938:41: error: expected ‘)’ before ‘src’
8
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:939:37: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
9
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:940:37: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
10
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:941:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
11
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:942:37: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
12
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:943:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
13
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:944:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
14
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:945:39: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
15
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:946:40: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
16
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:947:43: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
17
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:948:44: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
18
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:949:41: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
19
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:950:38: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
20
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:951:36: error: expected declaration specifiers or ‘...’ before ‘uint_farptr_t’
21
uart.c:238:37: error: Operator »||« hat keinen rechten Operanden
22
Process terminated with status 1 (0 minutes, 0 seconds)
23
16 errors, 0 warnings

von Rolf M. (rmagnus)


Lesenswert?

Felix D. schrieb:
> In file included from uart.c:93:0:

Der Fehler ist höchstwahrscheinlich irgendwo in den 92 Zeilen davor.

von Karl H. (kbuchegg)


Lesenswert?

> Compiling: uart.c
> In file included from uart.c:93:0:
> /usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/pgmspace.h:937:40:
> error: expected ‘)’ before ‘src’

Ich schätze mal, da fehlt irgendein #include, der in einer 
vorhergehenden WinAVR Version noch nicht notwendig war. Könnte auch ein 
Command-Line Argument sein (zb die Angabe des µC mittels -mmcu), die 
fehlt.

von Felix D. (felix_lued)


Angehängte Dateien:

Lesenswert?

Rolf Magnus schrieb:
> Felix D. schrieb:
>> In file included from uart.c:93:0:
>
> Der Fehler ist höchstwahrscheinlich irgendwo in den 92 Zeilen davor.

Auf die Idee könnte man kommen. Aber davor stehen im Grunde nur 
Kommentare und io.h bzw. interrupt.h includes.

Die Datei pgmspace wurde so wie sie ist mitgeliefert und von mir nicht 
verändert. Somit würde ich erstmal ausschließen, dass dort ein Fehler 
vorliegt sondern den Harken bei mir selber suchen.
Meine main.c Datei habe ich mal angehängt. Vielleicht findet ja noch 
jemand was.

MfG
Felix

von Rolf M. (rmagnus)


Lesenswert?

Felix D. schrieb:
> Rolf Magnus schrieb:
>> Felix D. schrieb:
>>> In file included from uart.c:93:0:
>>
>> Der Fehler ist höchstwahrscheinlich irgendwo in den 92 Zeilen davor.
>
> Auf die Idee könnte man kommen. Aber davor stehen im Grunde nur
> Kommentare und io.h bzw. interrupt.h includes.

Evtl. auch includes eigener Header? Die können den Fehler ja auch 
enthalten.

> Meine main.c Datei habe ich mal angehängt. Vielleicht findet ja noch
> jemand was.

Warum? Der Fehler wird doch in uart.c und nicht in main.c gemeldet.

von ikke (Gast)


Lesenswert?

die lib läuft doch einwandfrei von peter hab ich selbst in vielen 
Projekten im einsatz
auch das Beispiel auf seiner seite läuft.

ich finde auch nirgends in deiner Main ein,
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,XTAL_CPU) );
sei;

ich glaube sie wissen nicht was sie tun

von Felix D. (felix_lued)


Lesenswert?

ikke schrieb:
> die lib läuft doch einwandfrei von peter hab ich selbst in vielen
> Projekten im einsatz
> auch das Beispiel auf seiner seite läuft.
>
> ich finde auch nirgends in deiner Main ein,
> uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,XTAL_CPU) );
> sei;
>
> ich glaube sie wissen nicht was sie tun

Ich habe den uart von Hand initialisiert, da ich nicht die Standard 
Werte der Lib brauche sondern ein etwas extragantes Format vorliegen 
habe.
----------

Wahrscheinlich ist es ein Problem in meiner Toolchain. Die test_uart.c 
die bei der library dabei waren macht die gleichen Probleme, wenn ich es 
mit code::blocks öffne.
Über die Konsole also mit "make" funktioniert die test_uart jedoch.
Jetzt steh ich wohl vor dem Poblem mir ein makefile selber schreiben zu 
dürfen.
Gibt es da empfehlenswerte Tools die einem die Arbeit erleichtern?

MfG
Felix

von Felix D. (felix_lued)


Lesenswert?

An der Stelle erneut vielen Dank für eure Hilfe.

Der Hauptfehler lag wohl im code::blocks versteckt. Mit dem manuellen 
Makefile ging das kompilieren und anschließende hochladen in den AVR 
ohne Probleme.

MfG
Felix

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.