www.mikrocontroller.net

Forum: GCC LCD aus GCC Tutorial läuft nicht mit AVR Studio

Autor: Igor Metwet (bastel-wastel)
Datum: 12.05.2008 14:44

Guten Tag miteinander,

ich habe ein Problem mit der LCD Ansteuerung aus dem AVR-GCC Tutorial.
->
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Ich habe den Quellcode in zwei Dateien kopiert und den Dateinamen mit
lcd-routines.h bzw. lcd-routines.c versehen. In meinem Hauptprogramm
verwende ich nur den Testcode aus dem Tutorial. Das ganze Projekt läuft
unter AVR Studio 4.14 mit der neuesten Version von Win-AVR.
Leider compiliert das Ganze nicht und ich kann mit dem Fehlercode vom
Compiler nicht wirklich was anfangen. Vielleicht hat einer von euch ne
Idee:
PS: Ich verwende kein externes Makefile, sondern stelle in AVR Studio
unter  "Configuration Option" mein Device (Atmega8) und meine
Taktfrequenz (8MHz) ein.

Fehlercode:
 
Build started 12.5.2008 at 14:26:17
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99    -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT AVR_LCD.o -MF dep/AVR_LCD.o.d  -c  ../AVR_LCD.c
In file included from ../lcd-routines.c:7,
                 from ../AVR_LCD.c:7:
../lcd-routines.h:15:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
../lcd-routines.c: In function 'set_cursor':
../lcd-routines.c:126: warning: 'tmp' may be used uninitialized in this function
avr-gcc.exe -mmcu=atmega8 -Wl,-Map=AVR_LCD.map AVR_LCD.o lcd-routines.o     -o AVR_LCD.elf
lcd-routines.o: In function `lcd_enable':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:56: multiple definition of `lcd_enable'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:56: first defined here
lcd-routines.o: In function `lcd_command':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:35: multiple definition of `lcd_command'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:35: first defined here
lcd-routines.o: In function `lcd_data':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:13: multiple definition of `lcd_data'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:13: first defined here
lcd-routines.o: In function `lcd_clear':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:109: multiple definition of `lcd_clear'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:109: first defined here
lcd-routines.o: In function `lcd_home':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:117: multiple definition of `lcd_home'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:117: first defined here
lcd-routines.o: In function `set_cursor':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:125: multiple definition of `set_cursor'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:125: first defined here
lcd-routines.o: In function `lcd_string':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:140: multiple definition of `lcd_string'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:140: first defined here
lcd-routines.o: In function `lcd_init':
D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:70: multiple definition of `lcd_init'
AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:70: first defined here
make: *** [AVR_LCD.elf] Error 1
Build succeeded with 3 Warnings...

Wo liegt der Fehler?

Mit freundlichen Grüßen
bastl
Autor: Oliver (Gast)
Datum: 12.05.2008 15:43

Von oben nach unten:

>../lcd-routines.h:15:1: warning: "F_CPU" redefined
><command-line>: warning: this is the location of the previous definition

AVRStudio definiert F_CPU schon in der Kommandoszeile zum Compiler,
daher ist die erneute Definition im headerfile unnötig.

>../lcd-routines.c:126: warning: 'tmp' may be used uninitialized in this function

tmp wird nach Ansicht des Compilers vor seiner ersten Verwendung nicht
initialisiert. Hier irrt der gcc allerdings öfter mal.

Bisher waren das alles Warnungen.

>D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:56: multiple definition of
>`lcd_enable'
>AVR_LCD.o:D:\Elektronik\AVR\AVR_LCD\default/../lcd-routines.c:56: first >defined
>here

und alle folgenden:

Der Linker findet alle Funktionen aus lcd-routines.c zweimal. Hat du
vielleicht sowas wie "#include lcd-routines.c" in AVR_LCD.c stehen? Oder
ist lcd-routines.c zweimal im source-Ordner angegeben?

Oliver
Autor: Igor Metwet (bastel-wastel)
Datum: 12.05.2008 15:53

Vielen Dank für die Hilfe.
Hab den Fehler dadurch gefunden:

Ich war der Annahme, dass ich die include-files im "AVR GCC" Baum, der
standardmäßig auf der Linken Seite in AVR Studio platziert ist einfügen
muss. Habe dort die "lcd-routines.c" in den "Source-file" Ordner
geschoben.

Nachdem ich diese wieder gelöscht hatte geht es nun. Blöder Fehler
meinerseits.

Nochmals vielen Dank für deine Hilfe !!
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 12.05.2008 16:36

Igor Metwet wrote:
> Vielen Dank für die Hilfe.
> Hab den Fehler dadurch gefunden:
>
> Ich war der Annahme, dass ich die include-files im "AVR GCC" Baum, der
> standardmäßig auf der Linken Seite in AVR Studio platziert ist einfügen
> muss. Habe dort die "lcd-routines.c" in den "Source-file" Ordner
> geschoben.
>
> Nachdem ich diese wieder gelöscht hatte geht es nun. Blöder Fehler
> meinerseits.

Das allerdings war die falsche Korrektur.

Dieses File in den Baum mit aufzunehmen war schon richtig.
Was du entfernen hättest sollen ist der

#include "lcd-routines.c"

bzw. diesen durch ein

#include "lcd-routines.h"

ersetzen.
Autor: Igor Metwet (bastel-wastel)
Datum: 12.05.2008 16:47

#include lcd-routines.h wird in lcd-routines.c aufgerufen
 lcd-routines.h habe ich aber auch noch im Baum stehen. Dies stört den
Compiler dann anscheinend nicht, wenn dieses Doppelt aufgerufen wird.

Könntet Ihr mir noch Eines erklären:
Warum ist es besser wenn man die include-Dateien im Baum einfügt und
nicht über den C-Text.

Danke schonmal
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 12.05.2008 16:53

Igor Metwet wrote:
> #include lcd-routines.h wird in lcd-routines.c aufgerufen

Ja, das ist auch korrekt so.

Was aber nicht korrekt ist, ist dass du in deinem Programm
einen
#include "lcd-routines.c"
                      ***
stehen hast.

*.c Files werden nicht inkludiert! Immer nur die Header Files *.h

>  lcd-routines.h habe ich aber auch noch im Baum stehen. Dies stört den
> Compiler dann anscheinend nicht, wenn dieses Doppelt aufgerufen wird.

lcd-routines.h wird nicht compiliert (zumindest nicht einzeln)!
Immer nur im Zusammenhang mit einem *.c File, welches das *.h File
includiert.

> Könntet Ihr mir noch Eines erklären:
> Warum ist es besser wenn man die include-Dateien im Baum einfügt und
> nicht über den C-Text.

Jedes *.c File wird getrennt von allen anderen übersetzt. So ist
die Sprache C ausgelegt und so funktioniert das seit über 30 Jahren.
Die einzelnen *.c Files werden getrennt voneinander compiliert
und erst deren Ergebnisse (die Objekt Files) werden dann zum
vollständigen Programm zusammengebunden.

Bei 2 Dateien, wie bei dir, macht das noch keinen grossen Unterschied.
Aber wenn du 2000 Source Code Dateien (*.c) hast, dann bist du froh
darüber, dass jedes einzelne *.c einzeln compiliert werden kann.
Erst so ist es möglich die Compilierzeiten für ein grosses Projekt
in vertretbarem Rahmen zu halten. Warum sollen 200000 Lines of Code
compiliert werden, wenn es völlig ausreicht das eine *.c File, in
dem eine Änderung notwendig war und das vielleicht 500 Lines of Code
besitzt, neu zu compilieren und das Programm neu zu bauen.
Autor: Igor Metwet (bastel-wastel)
Datum: 12.05.2008 17:00

Ahh, jetzt wirds klar. Deine Erklärungen sind sehr anschaulich.
Das erklärt warum ich in dieser Hinsicht schonmal Probleme hatte...

Danke sehr !!

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net