Forum: Compiler & IDEs Einbinden von headern, bzw. vorcompilieren


von Asterix-007 (Gast)


Lesenswert?

Moin Männers,

ich sitze hier wieder mal an einem Problem und brauche mal eure Hilfe.
Folgendes:

Ich will mit Hilfe einer Appnote(315) von ATMEL einen I²C-Master zum
Laufen bekommen. Ich habe das letzte AVR-Studio (460) und gerade den
GCC und die Libs "geupdatet" (siehe =>
http://www.mikrocontroller.net/forum/read-2-277531.html)
Dabei habe ich folgendes gemacht:
1. neues Projekt angelegt
2. TWI_Master.c +*.h in das Projektverzeichnis kopiert und die *.h im
main.c includiert. Ich habe jedoch ein neues leeres main.c erstellt!
3. rufe ich die Funktion " TWI_Master_Initialise" (nur die, zum
Test)in meiner Init-Routine im main.c auf

Ich bekomme beim Build-Lauf immer eine undefined Reference auf
TWI_Master_Initialise !

Der Compiler-Lauf wird ausgeführt, aber der Linker scheint
abzustürzen!

Wenn ich mir eine eigene *.h-Datei erstelle und diese einbinde
funktioniert das "scheinbar problemlos", zumindest bekomme ich keine
Fehlermeldungen mehr. => Oder liegt es daran, das hier
Funktionsdefinition und funktion in einer Datei stehen?

Ich habe schon versucht die Pfade in den Settings einzutragen aber
erfolglos! Auch habe ich versucht die TWI_Master.c einzeln zu
compilieren um so eine *.o_Datei zu erzeugen, aber auch erfolglos!
Ich habe auch den Eindruck, dass man die Settings und Pfade im Projekt
jedes mal neu einstellen muss :-((
Es wäre schön, wenn mir einer von euch, mal die Zusammenhänge
ein wenig beleuchten könnte. Besonders die Pfade und wo was beim
compilieren und linken gesucht wird!

Bevor jetzt alle wieder loslegen: ich habe hier im GCC-Tut geschaut,
ich habe im Forum einige Seiten zurückgeblättert und noch einige Seiten
zu Rate gezogen....

Danke!!

mfg

Asterix-007

von Karl H. (kbuchegg)


Lesenswert?

Du musst alle *.c Dateien in Dein Projekt im AVR-Studio eintragen
Nur dann weiss AVR-Studio, dass sie Bestandteil des Projektes
sind und compiliert werden mussen bzw. auch mitgelinkt werden
muessen.

In der Baumansicht links den obersten Knoten anklicken (das Projekt),
dann rechte Maustaste: Menuepunkt "Add Existing File"
Directory aufsuchen und "TWI_Master.c" auswaehlen.

von Asterix-007 (Gast)


Lesenswert?

@KHB:

Danke, aaaber dann bekomme ich das:

rm -rf main.o  I²C-Test.elf dep/ I²C-Test.hex I²C-Test.eep
Build succeeded with 0 Warnings...
avr-gcc -I"D:\Dokumente und
Einstellungen\Ulf\AVR-Projekte\I²C-Test\."  -mmcu=atmega128 -Wall
-gdwarf-2 -O0 -Wp,-M,-MP,-MT,main.o,-MF,dep/main.o.d  -c  ../main.c
avr-gcc -I"D:\Dokumente und
Einstellungen\Ulf\AVR-Projekte\I²C-Test\."  -mmcu=atmega128 -Wall
-gdwarf-2 -O0 -Wp,-M,-MP,-MT,TWI_Master.o,-MF,dep/TWI_Master.o.d  -c
../TWI_Master.c
../TWI_Master.c:26:33: ioavr.h: No such file or directory
../TWI_Master.c:27:19: inavr.h: No such file or directory
../TWI_Master.c: In function `TWI_Master_Initialise':
../TWI_Master.c:42: error: `TWBR' undeclared (first use in this
function)
../TWI_Master.c:42: error: (Each undeclared identifier is reported only
once
../TWI_Master.c:42: error: for each function it appears in.)
../TWI_Master.c:44: error: `TWDR' undeclared (first use in this
function)
../TWI_Master.c:45: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:45: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:46: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:46: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:47: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:47: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:47: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:48: error: `TWWC' undeclared (first use in this
function)
../TWI_Master.c: In function `TWI_Transceiver_Busy':
../TWI_Master.c:56: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:56: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c: In function `TWI_Start_Transceiver_With_Data':
../TWI_Master.c:92: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:92: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:93: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:93: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:94: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:94: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:94: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:95: error: `TWWC' undeclared (first use in this
function)
../TWI_Master.c: In function `TWI_Start_Transceiver':
../TWI_Master.c:108: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:108: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:109: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:109: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:110: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:110: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:110: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:111: error: `TWWC' undeclared (first use in this
function)
../TWI_Master.c: At top level:
../TWI_Master.c:144: warning: ignoring #pragma vector
../TWI_Master.c:145: error: syntax error before "void"
../TWI_Master.c: In function `TWI_ISR':
../TWI_Master.c:149: error: `TWSR' undeclared (first use in this
function)
../TWI_Master.c:158: error: `TWDR' undeclared (first use in this
function)
../TWI_Master.c:159: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:159: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:160: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:160: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:161: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:161: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:161: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:162: error: `TWWC' undeclared (first use in this
function)
make: *** [TWI_Master.o] Error 1
Build failed with 43 errors and 1 warnings...

Na, da war mir der "eine" Fehler aber bedeutend lieber!!!! ;-))

Übrigens, ich hatte vorher das File in "Other Files " eingebunden!

Nein, ich vermute, das hier eine einfache Pfadvorgabe fehlt!

Danke Karl-Heinz, aber der Schuß ging daneben!

Asterix-007

von Sascha (Gast)


Lesenswert?

Jetzt mußt du nurnoch die header für TWI includen. Das muss aber in der
TWI_Master.c geschehen, da dieser die TWI constanten nicht kennt.

Gruß
   Sascha

von Fritz G. (fritzg)


Lesenswert?

ioavr.h gibts nicht (steht ja da!)

nimm stattdessen:

#include "avr/twi.h"

Fehlermeldungen lesen hilft ungemein!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nun musst du ,,nur noch'' den Code der AppNote von IAR-Syntax
auf GCC-Syntax portieren...

von Karl H. (kbuchegg)


Lesenswert?

> Na, da war mir der "eine" Fehler aber bedeutend lieber!!!! ;-))

Du solltest Fehlermeldungen auch lesen!
Die erste ist:

../TWI_Master.c:26:33: ioavr.h: No such file or directory

Bei der faengst Du an. Wenn Du ein ioavr.h hast (oder
was gleichwertiges) werden schon mal einen ganzen Haufen
anderer Fehler wie von Zauberhand verschwinden.

> Danke Karl-Heinz, aber der Schuß ging daneben!

Glaub ich nicht. Programmieren ist nun mal auch eine
Kunst. Der eine hat's, der andere hat's nicht.

von Asterix-007 (Gast)


Angehängte Dateien:

Lesenswert?

@Jörg : bedeutet, neu schreiben ist einfacher als portieren?????
Wie verhält es sich mit "ioavr.h und inavr.h"? Woher kommen, bzw. was
sind das für Dateien?

so, hier noch mal eine Beschreibung:
meine main.c (siehe Anhang) includiert nur die TWI_Master.h. Nach
meinem C-Verständnis, und dem Herrn Krüger von A-W, sind in dieser *.h
die Funktionsdeklarationen und in der dazugehörigen *.c die
Funktionsdefinitionen. Normalerweise sollte die Angabe der *.h-Datei
ausreichen um auf die Funktionen zugreifen zu können! Dazu sollten
diese aber vorcompiliert (als *.o-Datei) vorliegen, damit der Linker
dann diese mit "verbauen" kann.
Also habe ich versucht, die TWI_Master.c zu compilieren aber das war
nichts!

Außerdem ist in der TWI_Master.c der Header mit den Konstanten
includiert!!! => Deshalb die Vermutung, das der Linker auf dem Holzweg
ist, d.h. das irgend welche Pfade nicht stimmen!!

Außerdem sagen die Fehlermeldungen das die main.c erfolgreich
durchgelaufen ist!

Übrigens, da ich nur eine Datei anhängen kann, der Rest steht in der
Appnote 315 (ohne die dortige main).

Ich glaube, ich gehe hier zu Fuß weiter, d.h. ich schreibe den Code
neu!!

mfg

Asterix-007

von Asterix-007 (Gast)


Angehängte Dateien:

Lesenswert?

Sorry Fehler vom Amt!!

Hier die richtige Main.c!!!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> bedeutet, neu schreiben ist einfacher als portieren?

Mitnichten.  Ich habe schon einige Stunden seinerzeit damit
verbracht, das twidemo in der avr-libc auf die Beine zu
stellen (und ich habe es im Wesentlichen getan, weil ich ein
Gefühl für I²C bekommen wollte).

> Wie verhält es sich mit "ioavr.h und inavr.h"? Woher kommen,

Vom IAR-Compiler.

> bzw. was sind das für Dateien?

Das musst du in erster Linie den IAR fragen.

<ioavr.h> ist wohl ziemlich genau das, was beim AVR-GCC/avr-libc
<avr/io.h> heißt.  <inavr.h> ist irgendwelcher privater Krempel
vom IAR.  Was da genau drin deklariert ist, kann ich dir aus'm
Hut nicht sagen (ich könnte aber auf Arbeit mal nachgucken).

> Ich glaube, ich gehe hier zu Fuß weiter, d.h. ich schreibe
> den Code neu!

Wenn du meinst.

Ich hätte auch noch ein paar Manntage an Aufgaben abzugeben, nur
falls du noch weitere freie Reserven haben solltest...

von Asterix-007 (Gast)


Lesenswert?

Hallo Jörg,

zuerst einmal ein Dankeschön für die Antwort! Das Licht im Dunkel wird
langsam mehr! Nun weiß ich wenigstens, wie ich die beiden Dateien
einordnen muß!
Ich werde mal versuchen, dein Beispiel mit dem I²C zu probieren!

Was sagst du zu meinen gedanken bezüglich der Header-Datei? Vom Ansatz
sollte das doch richtig sein, oder? Wenn ich diese oben genannten
Dateien auskommentiere bekomme ich immer noch die Fehlermeldungen,
welche auf unbekannte Konstanten usw. hinweisen!

Woraus ich schlußfolgere, das die *.h nicht gefunden wird!
Gibt es im AVR-Studio noch eine Einstellung (Pfadangabe) an der man
"drehen" kann, damit der Linker dies *.h findet??

Und zu guter Letzt, wie importiere ich die neuesten Libs richtig in den
GCC? Ich hab versucht das einfach hineinzukopieren, aber das war wohl
nix!

Und das mit dem neu schreiben ist dann günstiger, wenn ich mit den
Beispielen nicht klar komme und mir einen Wolf suche....

Trotzdem..
Danke fürs erste!

mfg

Asterix-007

von Fritz G. (fritzg)


Lesenswert?

Wozu poste ich eigentlich die Lösung wenn sie niemand liest?

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.