Hallo, hat jemand Erfahrung mit der Nutzung/Erstellung von eigenen Makefiles im AVRStudio 5 oder 6?? Bei mir funktioniert es nicht einmal, wenn ich ein vom System erstelltes Makefile in einen anderen Ordner kopiere und es dort als extern erkläre.
Inzwischen bin ich einen Schritt weiter! Nachdem der Compiler bisher immer nach einer Regel zur Erstellung einer Datei makedep.mk verlangt hat, habe ich nun die aus dem System erstellte Datei ebenfalls in den Ordner kopiert und dann ist er durchgelaufen. Gibt es denn irgendwo eine Erklärung was man dabei alles beachten muß?
Bruno M. schrieb: > Gibt es denn irgendwo eine Erklärung was man dabei alles beachten muß? Vielleicht schaust du mal in das makefile hinein, und versuchst, zu Verstehen, was da drin passiert. Vermutlich benötigt das automatisch erzeugte makefile makedep.mk. Dem Studio ist das alles herzlich egal, das startet in dem Fall einfach jedes externe makefile, das du ihm vorsetzt. Oliver
Oliver schrieb: > > Vielleicht schaust du mal in das makefile hinein, und versuchst, zu > Verstehen, was da drin passiert. Vermutlich benötigt das automatisch > erzeugte makefile makedep.mk. > Im Systemmakefile gibt es nur eine Zeile zu makedep.mk u.z. OUTPUT_FILE_DEP:= ./makedep.mk D.h. er ist davon irgendwie abhängig. Wenn ich im externen Makefile die Zeile ganz lösche, dann läuft es auch. Für mich noch unverständlich ist nur, daß das System diese Datei offensichtlich selbst anlegt, bei einem externen Makefile aber nicht.
Das System legt bei Nutzung eines externen makefiles überhaupt gar nichts an. Da ruft das Studio einfach make auf, und übergibt das "externe" makefile. Das ist ja der Sinn eines Projektes mit externem makefile. Oliver
Oliver schrieb: > Das System legt bei Nutzung eines externen makefiles überhaupt gar > nichts an. Da ruft das Studio einfach make auf, und übergibt das > "externe" makefile. > Das ist mir wohl klar. Unklar war, wozu dieses makedep.mk bei einem System-Makefile benötigt wird. Inzwischen kann ich mir die Antwort aber auch selbst geben. Im Gegensatz zu Studio 4 muß man in 5 und 6 Dateien ganz explizit ein- oder ausschließen. makedep.mk enthält nun die Auflistung genau der Dateien, die eingeschlossen werden müssen. >Dem Studio ist das alles herzlich egal, das startet in dem Fall einfach >jedes externe makefile, das du ihm vorsetzt. Das stimmt zwar, aber ein Makefile von Studio 4 läuft in 5 oder 6 z. B. nicht. Offensichtlich gibt es da andere Regeln, die ich gerne wüßte.
Bruno M. schrieb: > Das ist mir wohl klar. Unklar war, wozu dieses makedep.mk bei einem > System-Makefile benötigt wird. Das wird benötigt, weil Atmel das halt im Studion so 5/6 macht. Möglich ist alles, müssen muß man gar nix. Jedes makefile, das vollständig und korrekt ist, kannst du als externes makefile in sämtlichen Studios dieser Welt verwenden. Oder auch in Eclipse. oder in einem Visual Studio, oder ganz ohne Studio. Oliver
Oliver schrieb: > > Jedes makefile, das vollständig und korrekt ist, kannst du als externes > makefile in sämtlichen Studios dieser Welt verwenden. Oder auch in > Eclipse. oder in einem Visual Studio, oder ganz ohne Studio. > Wenn das so richtig wäre, dann müßte ein funktionierendes Makefile von Studio 4 auf Studio 5 laufen. Genau das macht es aber nicht!
Je nun, sei mir nicht böse, aber nur, weil das bei dir nicht funktioniert, heisst das nicht, daß es nicht geht. Selbstverständlich funktionieren Studio4-makefiles genauso mit Studio 5 oder 6, wenn Oliver schrieb: > vollständig und korrekt erfüllt ist. Die vom Studio4 erstellten makefile sind völlig in Ordnung, sonst könnte Studio4 die ja auch nicht per make kompilieren lassen. Wenn da bei dir was nicht funktioniert, lies die Fehlermeldungen, schau in das makefile, und versuche, zu verstehen, was da schief geht. Oliver
Oliver schrieb: > Je nun, sei mir nicht böse, aber nur, weil das bei dir nicht > funktioniert, heisst das nicht, daß es nicht geht. Selbstverständlich > funktionieren Studio4-makefiles genauso mit Studio 5 oder 6, wenn > Wenn das so klar und einfach ist, dann erkläre mir bitte konkret (nicht nur schlaue Allgemeinplätze) warum die Definitionen UI_LANGUAGE = LANG_ENGLISH oder CFLAGS += -DF_CPU=$(OP_MHZ)000000UL im Studio 4 funktionieren und im Studio 6 nicht. In beiden Fällen handelt es sich um bereits erprobte Makefiles.
Bruno M. schrieb: > Wenn das so klar und einfach ist, dann erkläre mir bitte konkret (nicht > nur schlaue Allgemeinplätze) warum die Definitionen So ist das nun mal, wenn man nur Allgemeinplätze postet ("funktioniert nicht"), dann bekommt man auch nur Allgemeinplätze als Antwort. Konkrete Antworten können nur bei konkreten Fragen und konkreten Informationen kommen. Also das ganze Makefile posten und nicht nur zwei Zeilen. Und vor allem mal erklären, was "funktioniert nicht" überhaupt konkret bedeuten soll.
Bruno M. schrieb: > Wenn das so klar und einfach ist, dann erkläre mir bitte konkret Bitte sehr: Du hast immer noch nicht im entferntesten verstanden, was ein makefile überhaupt ist, und was man(n), make, und die verschiedenen Studios überhaupt machen. Nimm dir bitte mal etwas Zeit, google, eine guten Kaffee, und versuche das zu verstehen. Das makefile aus dem trasistortester-prokejt ist kein vom Studio4 erstelltes makefile, das hat jemand von Hand geschrieben. Du wirst es vielleicht nicht glauben, daber das ist tatsächlich die normale Vorgehensweise, so etwas zu erstellen. Und, wie die ja schon im anderen Thread versichert wurde, funktioniert das problemlos mit allen Studios, oder auch ganz ohne. Warum das bei dir nicht funktioniert, ist unklar, ebenso, ob du überhaupt schon einmal versucht hast, das Projekt ohne jede Änderung deinerseits zu kompilieren. Oliver
Hallo Stefan, anliegend findest Du die beiden Makefiles. Das Studio 4 File ist Dir ja schon vom Transistortester bekannt. Wenn ich sage, es läuft nicht, dann heißt das: - bei Verwendung des kompletten Makefiles kommt eine Fehlermeldung "***Missing Separator. Stop." mit Bezug auf das Makefile. - da ich aber in der Zwischenzeit den Code im Studio 5 oder auch 6 zum Laufen gebracht habe (der entscheidende Beitrag kam von Karl-Heinz Kübbeler) versuche ich nun einzelne Definitionen aus dem Studio 4 Makefile in das Studio 6 Makefile einzusetzen und zu testen. Zwei davon siehe oben. In diesem Fall bedeutet "es läuft nicht", daß der Compiler Fehler ausgibt, die erkennen lassen, daß die Definitionen nicht verarbeitet wurden.
Bruno M. schrieb: > - bei Verwendung des kompletten Makefiles kommt eine Fehlermeldung > "***Missing Separator. Stop." mit Bezug auf das Makefile. Schade, dass Du die Zeilennummer, auf die sich diese Fehlermeldung bezieht, nicht angegeben hast. Googlen nach "Missing Separator. Stop." gibt Dir sofort den Grund aus, was im Makefile kaputt ist. Ich habe jetzt aber keine Lust, danach zu suchen, da Du ja die Zeilennummer kennst und ich nicht. Gruß, Frank
Frank M. schrieb: > Schade, dass Du die Zeilennummer, auf die sich diese Fehlermeldung > bezieht, nicht angegeben hast. > > Googlen nach "Missing Separator. Stop." gibt Dir sofort den Grund aus, > was im Makefile kaputt ist. die Zeilennummer hilft wenig, da es Zeile 1 ist. Google habe ich natürlich bemüht, aber fehlendes Tab (wenn Du das meinst) habe ich nicht gefunden. Außerdem läuft genau dieses Makefile (ohne die geringste Änderung) im Studio 4.
Ich habe jetzt mal das Studio6 angeworfen, ein neues Projekt in einem leeren Ordner angelegt, da als externes makefile das aus dem default-Ordner aus Transistortester-Original angegeben, auf build geklickt, und - keine Überraschung, es kompiliert alles völlig problemlos.
1 | ------ Build started: Project: GccApplication1, Configuration: Debug AVR ------ |
2 | Build started. |
3 | Project "GccApplication1.cproj" (default targets): |
4 | Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). |
5 | Target "CoreBuild" in file "C:\Programme\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "C:\Dokumente und Einstellungen\sce\Desktop\GccApplication1\GccApplication1\GccApplication1.cproj" (target "Build" depends on it): |
6 | Using "RunCompilerTask" task from assembly "C:\Programme\Atmel\Atmel Studio 6.0\Vs\Compiler.Task.dll". |
7 | Task "RunCompilerTask" |
8 | C:\Programme\Atmel\Atmel Studio 6.0\make\make.exe -C "C:\Dokumente und Einstellungen\sce\Desktop\Transistortester-Original\default" -f "Makefile" all |
9 | make: Entering directory `C:/Dokumente und Einstellungen/sce/Desktop/Transistortester-Original/default' |
10 | avr-gcc -Wall -DWITH_SELFTEST -DWITH_AUTO_REF -DREF_C_KORR=16 -DR_MESS -DC_MESS -DCAP_EMPTY_LEVEL=3 -DAUTOSCALE_ADC -DNO_AREF_CAP -DUSE_EEPROM -DPULLUP_DISABLE -DANZ_MESS=44 -DPOWER_OFF=5 -DBAT_CHECK -DBAT_OUT=150 -DBAT_POOR=64 -DF_CPU=8000000UL -mmcu=atmega168 -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT lcd-routines.o -MF dep/lcd-routines.o.d -c ../lcd-routines.c |
11 | avr-gcc -Wall -DWITH_SELFTEST -DWITH_AUTO_REF -DREF_C_KORR=16 -DR_MESS -DC_MESS -DCAP_EMPTY_LEVEL=3 -DAUTOSCALE_ADC -DNO_AREF_CAP -DUSE_EEPROM -DPULLUP_DISABLE -DANZ_MESS=44 -DPOWER_OFF=5 -DBAT_CHECK -DBAT_OUT=150 -DBAT_POOR=64 -DF_CPU=8000000UL -mmcu=atmega168 -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -DLANG_ENGLISH -c ../main.c |
12 | avr-gcc -Wall -DWITH_SELFTEST -DWITH_AUTO_REF -DREF_C_KORR=16 -DR_MESS -DC_MESS -DCAP_EMPTY_LEVEL=3 -DAUTOSCALE_ADC -DNO_AREF_CAP -DUSE_EEPROM -DPULLUP_DISABLE -DANZ_MESS=44 -DPOWER_OFF=5 -DBAT_CHECK -DBAT_OUT=150 -DBAT_POOR=64 -DF_CPU=8000000UL -mmcu=atmega168 -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT swuart.o -MF dep/swuart.o.d -c ../swuart.S |
13 | avr-gcc -Wall -DWITH_SELFTEST -DWITH_AUTO_REF -DREF_C_KORR=16 -DR_MESS -DC_MESS -DCAP_EMPTY_LEVEL=3 -DAUTOSCALE_ADC -DNO_AREF_CAP -DUSE_EEPROM -DPULLUP_DISABLE -DANZ_MESS=44 -DPOWER_OFF=5 -DBAT_CHECK -DBAT_OUT=150 -DBAT_POOR=64 -DF_CPU=8000000UL -mmcu=atmega168 -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT wait1000ms.o -MF dep/wait1000ms.o.d -c ../wait1000ms.S |
14 | avr-gcc -Wall -DWITH_SELFTEST -DWITH_AUTO_REF -DREF_C_KORR=16 -DR_MESS -DC_MESS -DCAP_EMPTY_LEVEL=3 -DAUTOSCALE_ADC -DNO_AREF_CAP -DUSE_EEPROM -DPULLUP_DISABLE -DANZ_MESS=44 -DPOWER_OFF=5 -DBAT_CHECK -DBAT_OUT=150 -DBAT_POOR=64 -DF_CPU=8000000UL -mmcu=atmega168 -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT CombineToLong.o -MF dep/CombineToLong.o.d -c ../CombineToLong.S |
15 | avr-gcc -Wall -DWITH_SELFTEST -DWITH_AUTO_REF -DREF_C_KORR=16 -DR_MESS -DC_MESS -DCAP_EMPTY_LEVEL=3 -DAUTOSCALE_ADC -DNO_AREF_CAP -DUSE_EEPROM -DPULLUP_DISABLE -DANZ_MESS=44 -DPOWER_OFF=5 -DBAT_CHECK -DBAT_OUT=150 -DBAT_POOR=64 -DF_CPU=8000000UL -mmcu=atmega168 -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ReadADC.o -MF dep/ReadADC.o.d -c ../ReadADC.S |
16 | avr-gcc -mmcu=atmega168 -Wl,-Map=TransistorTester.map lcd-routines.o main.o swuart.o wait1000ms.o CombineToLong.o ReadADC.o -o TransistorTester.elf |
17 | avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature TransistorTester.elf TransistorTester.hex |
18 | avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex TransistorTester.elf TransistorTester.eep || exit 0 |
19 | avr-objdump -h -S TransistorTester.elf > TransistorTester.lss |
20 | AVR Memory Usage |
21 | ---------------- |
22 | Device: atmega168 |
23 | Program: 9508 bytes (58.0% Full) |
24 | (.text + .data + .bootloader) |
25 | Data: 95 bytes (9.3% Full) |
26 | (.data + .bss + .noinit) |
27 | EEPROM: 472 bytes (92.2% Full) |
28 | (.eeprom) |
29 | make: Leaving directory `C:/Dokumente und Einstellungen/sce/Desktop/Transistortester-Original/default' |
30 | Done executing task "RunCompilerTask". |
31 | Using "RunOutputFileVerifyTask" task from assembly "C:\Programme\Atmel\Atmel Studio 6.0\Vs\Compiler.Task.dll". |
32 | Task "RunOutputFileVerifyTask" |
33 | |
34 | Display Output File Size Skipped due to : Output File not found |
35 | Done executing task "RunOutputFileVerifyTask". |
36 | Done building target "CoreBuild" in project "GccApplication1.cproj". |
37 | Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != ''). |
38 | Target "Build" in file "C:\Programme\Atmel\Atmel Studio 6.0\Vs\Avr.common.targets" from project "C:\Dokumente und Einstellungen\sce\Desktop\GccApplication1\GccApplication1\GccApplication1.cproj" (entry point): |
39 | Done building target "Build" in project "GccApplication1.cproj". |
40 | Done building project "GccApplication1.cproj". |
41 | |
42 | Build succeeded. |
43 | ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== |
Noch Fragen? Oliver
Oliver schrieb: > > Noch Fragen? > > Oliver Eigentlich hätte ich noch jede Menge Fragen, aber die kann mir keiner beantworten. Ich habe es jetzt mal genau so versucht wie Du auch, d.h. ich habe alles so genommen wie es das Studio vorgibt, sprich Projektname, Pfad usw. und siehe da es läuft. Anschließend habe ich noch meine alten Projekte versucht und auch die laufen plötzlich obwohl ich das vorher schon mindestens 10 mal genau so versucht habe. Mit anderen Worten ich kann jetzt nicht einmal mehr nachvollziehen was vorher passiert war. Was ich aber sehr gut nachvollziehen kann ist, daß Euch mein Problem ordentlich genervt hat. Also nichts für ungut und herzlichen Dank.
Oliver schrieb: > > Jedes makefile, das vollständig und korrekt ist, kannst du als externes > makefile in sämtlichen Studios dieser Welt verwenden. Oder auch in > Eclipse. oder in einem Visual Studio, oder ganz ohne Studio. Irgendwie scheint diese Aussage bei mir nicht zu stimmen. Ich versuche gerade ein anderes Projekt (siehe Anlage) zum Laufen zu bewegen, aber leider wieder umsonst. Im Studio 4 ist es wieder kein Problem. Die Ausgabe von Build ist:
1 | ------ Build started: Project: GccApplication1, Configuration: Debug AVR ------ |
2 | Build started. |
3 | Project "GccApplication1.cproj" (default targets): |
4 | Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). |
5 | Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\GccApplication1\GccApplication1.cproj" (target "Build" depends on it): |
6 | Task "RunCompilerTask" |
7 | C:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe -C "D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\GccApplication1" -f "makefile" all |
8 | Der Befehl "sed" ist entweder falsch geschrieben oder |
9 | konnte nicht gefunden werden. |
10 | make: Entering directory `D:/Documents/Elektronik/Mikroprozessoren/GCC/Projekte/LCD_con_320x240/GccApplication1' |
11 | set -e; avr-gcc -MM -mmcu=atmega8515 -I. -g -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=uart.lst -std=gnu99 uart.c \ |
12 | | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > uart.d; \ |
13 | [ -s uart.d ] || rm -f uart.d |
14 | Der Befehl "sed" ist entweder falsch geschrieben oder |
15 | konnte nicht gefunden werden. |
16 | set -e; avr-gcc -MM -mmcu=atmega8515 -I. -g -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=lcd.lst -std=gnu99 lcd.c \ |
17 | | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > lcd.d; \ |
18 | [ -s lcd.d ] || rm -f lcd.d |
19 | Der Befehl "sed" ist entweder falsch geschrieben oder |
20 | konnte nicht gefunden werden. |
21 | set -e; avr-gcc -MM -mmcu=atmega8515 -I. -g -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 main.c \ |
22 | | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > main.d; \ |
23 | [ -s main.d ] || rm -f main.d |
24 | "-f" kann syntaktisch an dieser Stelle nicht verarbeitet werden. |
25 | ECHO ist ausgeschaltet (OFF). |
26 | -------- begin -------- |
27 | avr-gcc (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2 |
28 | Copyright (C) 2011 Free Software Foundation, Inc. |
29 | This is free software; see the source for copying conditions. There is NO |
30 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
31 | make: *** [sizebefore] Error 255 |
32 | make: Leaving directory `D:/Documents/Elektronik/Mikroprozessoren/GCC/Projekte/LCD_con_320x240/GccApplication1' |
33 | Done executing task "RunCompilerTask" -- FAILED. |
34 | Done building target "CoreBuild" in project "GccApplication1.cproj" -- FAILED. |
35 | Done building project "GccApplication1.cproj" -- FAILED. |
36 | |
37 | Build FAILED. |
38 | ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ========== |
Ich habe inzwischen schon einiges über Erstellung von Makefiles gelesen, aber das Problem ist, daß sie alle anders aufgebaut sind. Letztendlich erfüllen sie natürlich den gleichen Zweck, aber für einen Ungeübten sind sie damit sehr schwer zu lesen. Da mir das Makefile vom Transistortester noch am Übersichtlichsten erscheint. habe ich auch schon versucht ein analoges Makefile für das neue Projekt zu stricken, aber es kommt wieder die übliche Fehlermeldung "Missing Separator. Stop.".
Bruno M. schrieb: > Der Befehl "sed" ist entweder falsch geschrieben oder > konnte nicht gefunden werden. Tja, das ist halt Pech. So etwas passiert, wenn man sich uralte Projekte aus dem Netz zusammensucht. Das makefile nutzt das Programm "sed", das mit WinAVR mitgeliefert wird (dein Studio4 nutzt WinAVR), aber nicht mit der Atmel toolchain, die vom Studio5 und 6 genutzt werden. Ergo funktionert das mit den aktuellen Atmel ttolchains nicht mehr. Beschwer dich bei Atmel, oder versuch, zu verstehen, was das makefile macht, und bau dir ein funktionierendes. Das makefile basiert auf einem (ur-)alten makefile-Template, und sed wurde da benutzt, um die Abhängigkeiten der header herauszufinden. Das geht seit einer weile auch anders, der Compiler kann das inzwischen mit den passdenden Optinen im Aufruf selber. Wie, kannst du dir in aktuellen Studio4/5/6-makefiles ansehen. Bleibt die Frage, warum du unbedingt immer Studio6 verwenden willst. Nimm für solche alten Projekte doch Studio 4, und alles wird gut. Oliver
Oliver schrieb: > > Tja, das ist halt Pech. So etwas passiert, wenn man sich uralte Projekte > aus dem Netz zusammensucht. Das ist eines der Projekte, die ich immer noch aktiv nutze. > > Beschwer dich bei Atmel, oder versuch, zu verstehen, was das makefile > macht, und bau dir ein funktionierendes. Wie oben schon beschrieben bin ich dabei das zu versuchen. Wenn ich auf Deine Hilfe zählen könnte, wäre das super. > > Das makefile basiert auf einem (ur-)alten makefile-Template, und sed > wurde da benutzt, um die Abhängigkeiten der header herauszufinden. Das > geht seit einer weile auch anders, der Compiler kann das inzwischen mit > den passdenden Optinen im Aufruf selber. Wie, kannst du dir in aktuellen > Studio4/5/6-makefiles ansehen. Gelesen habe ich von dieser Option schon, aber die Realisierung ist noch ein Problem. > > Bleibt die Frage, warum du unbedingt immer Studio6 verwenden willst. > Nimm für solche alten Projekte doch Studio 4, und alles wird gut. > Das Problem ist, daß auf meinem neuen Rechner Studio 4 nicht läuft und der alte wandert bald in den Schrott. Daher versuche ich die interessantesten Projekte umzustricken.
In diesem Fall würde ich kein externes makefile verwenden, sondern ein neues Studio-Projekt mit automatischer makefile-Erstellung in dem Ordner anlegen. In dem makefile passiert überhaupt nichts außergewöhnliches, das kompiliert und linkt einfach main.c, lcd.c, uart.c, und lcdcon.S zusammen, dazu noch die Mathelib lm. Also pack die Sourcen ins den source-Ordner, dazu die mathelib in den linker-optionen, stell den Optimierungslevel auf 2 oder s, und das war es acuh schon. Oliver
Danke für den Tip! Ich habe das allerdings schon vorher versucht und die Einstellungen jetzt nochmals überprüft. Wenn ich Dich richtig verstehe, dann schließe ich diese 4 Dateien in das Projekt ein, die mathelib ist eigentlich standardmäßig drin und den Optimierungslevel habe ich jetzt auf s gestellt. Das Problem ist nur, daß dann der Debugger rummäkelt. So war das ja auch schon beim Transistortester, obwohl ja das externe Makefile problemlos lief. Warum das so ist, weiß ich nicht.
1 | ------ Build started: Project: main, Configuration: Debug AVR ------ |
2 | Build started. |
3 | Project "main.cproj" (default targets): |
4 | Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). |
5 | Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\main.cproj" (target "Build" depends on it): |
6 | Task "RunCompilerTask" |
7 | C:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all |
8 | In file included from .././lcd.c:6:0: |
9 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\8x12_horizontal_MSB_1.h(1,1): unknown type name 'prog_char' |
10 | Building file: .././lcd.c |
11 | Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2 |
12 | "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -Os -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "lcd.d" -MT"lcd.d" -MT"lcd.o" -mmcu=atmega162 -o"lcd.o" ".././lcd.c" |
13 | .././lcd.c: In function 'lcd_init': |
14 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.c(25,2): large integer implicitly truncated to unsigned type [-Woverflow] |
15 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.c(48,2): passing argument 3 of 'lcd_string' discards 'const' qualifier from pointer target type [enabled by default] |
16 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.h(10,6): expected 'char *' but argument is of type 'const char *' |
17 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.c(49,2): passing argument 3 of 'lcd_string' discards 'const' qualifier from pointer target type [enabled by default] |
18 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.h(10,6): expected 'char *' but argument is of type 'const char *' |
19 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.c(52,2): passing argument 3 of 'lcd_string' discards 'const' qualifier from pointer target type [enabled by default] |
20 | D:\Documents\Elektronik\Mikroprozessoren\GCC\Projekte\LCD_con_320x240\main\lcd.h(10,6): expected 'char *' but argument is of type 'const char *' |
21 | make: *** [lcd.o] Error 1 |
22 | Done executing task "RunCompilerTask" -- FAILED. |
23 | Done building target "CoreBuild" in project "main.cproj" -- FAILED. |
24 | Done building project "main.cproj" -- FAILED. |
25 | |
26 | Build FAILED. |
27 | ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ========== |
Wie schon gesagt, habe ich mich auch schon an einem externen Makefile versucht (siehe Anlage), aber da sind offensichtlich noch Fehler drin.
Das ist jetzt kein Problem des makefiles, da mag der Compiler den C-Code nicht. Auch das ist teilweise ein Problem von altem (eigentlich fehlerhaften) Code und aktuellen Compilervrsionen, die alten gccs waren da nicht so pingelig. Nimm dir halt jede einzelne Meldung vor, und versuche, dass Problem zu lösen. Nur durch kopieren lernt man kein C. Oliver
Oliver schrieb: > > Nur durch kopieren lernt man kein C. > Du hast ja soo recht!! Trotzdem würde mich bei Gelegenheit Deine Meinung zum Makefile interessieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.