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
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
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 !!
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.
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
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.
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


