Zitat Zitat von ikarus_177
Hi Georg!

Eigentlich brauche ich bloß das *.hex - File fürs Flashen.

Wenn ich nun in der Kommandozeile
Code:
avr-gcc -mmcu=atmega32 -Os main.c -o main.hex
eingebe, erstellt er mir ein schönes hex-File auch ganz, ohne dass ein Makefile im Ordner vorhanden wäre.

Ist die Vorgehensweise denn so in Ordnung? Falls ja, brauch ich die Kompilierungsfunktion im Programmer's Notepad und das Makefile ja gar nicht, da würde doch auch ein kleines Batch-File auch reichen (nur zur Erstellung der hex-Datei)?

Viele Grüße
Nein, das ist so nicht in Ordnung. Mit dem Kommando erstellst du eine ELF-Datei mit einer .hex-Endung. -o legt nur den Ausgabename der Datei fast, sonst nichts.

make wird als Build-Tool verwendet. Es ist nicht notwendig, um C-Projekte zu erzeugen. Dennoch findest du zu fast jedem C-Projekt ein Makefile, weil es den Build-Prozess beschleunigen kann. Das trifft aber natürlich nur dann zu, wenn das Makefile korrekt ist.

make ist keine Programmiersprache; wenn man ein Makefiles als Programm ansieht, liegt man fix auf der Nase.

In großen Projekten sind oft viele verschiedene Aufgaben zu lösen, die mit make automatisiert werden können, etwa: Wenn Datei A gebraucht wird und eine Regel besteht, wie A aus einer Datei B erzeugt werden kann, dann erzeuge A neu falls B jünger ist als das alte A.

Shell-Skripte sind nicht so intelligent, sie machen immer mehr oder weniger stupide das gleiche, ohne Abhängigkeiten und Zeitstempel innerhalb eines Projektes zu berücksichtigen. sh-Skripte sind hier also idR ineffizienter, was aber bei einem kleinen Projekt keine Rolle spielt. Vor allem aber sind sh-Skripte (wenn sie nicht ausufern) besser nachvollziehbar als make, weil es im Gegensatz zu Makefiles eine Abfolge von Kommandos darstellt.

GCC selbst kann keine HEX-Dateien erstellen. Er mach die Ausgabe als Assembler-Datei und ruft darauf andere Programme auf. Was er genau macht, sieht du wenn du die Option -v mit angibst. Die Endausgabe ist wie gesagt ein ELF -- egal wie es auch genannt wird.

Das ELF musst du dann mit einem Tool wie avr-objcopy in ein HEX umwandeln. Du kannst zwar auch ein ELF auf den AVR laden, aber das ist nicht ausführbar (zumindest nicht ohne ELF-Loader, der die Umwandlung in Maschinencode übernimmt). In ELF ist noch viel Zeug drin wie Symbol- und Debug-Informationen, die nicht aufn AVR gehören.

Den Inhalt kannst du aber anschauen mit avr-objdump -d foo.elf

Früher gab es bei WinAVR kleine, überschaubare Beispiel in einem Ordner Examples. Heutzutage gibt's nur noch Zeug mit riesigen, zuperkomplexen Makefiles als eiergelende Wollmilchsau die kein Schwanz mehr nachvollziehen kann. Wenn es funzt, schon, wenn nicht, hat man die Asrchkarte weil es nicht zu durchblicken ist für nen Einsteiger wo es hakt und wie man es behebt...