Forum: Mikrocontroller und Digitale Elektronik Fehler beim Erzeugen eines Hex-files mit Make (Programmers Notepad/Win7)


von Marr (Gast)


Angehängte Dateien:

Lesenswert?

Hallihallo :)

Nachdem ich jetzt einige Stunden damit verbracht habe, das folgende 
Problem zu lösen/ das Forum nach einem ähnlichem Problem zu 
durchforsten, habe ich mich entschlossen, hier direkt nachzufragen.
Ich hab mich die letzten Wochen recht gut in die 
µController-Programmierung eingelesen und sogar schon eine 
Experimentierplatine geätzt, die soweit auch funktionieren müsste. 
Folgendes ist erledigt:

- Installation von WINAVR
- Schreiben eines Testprogramms
- Erstellen eines Makefiles

Mein Problem liegt nun beim erzeugen der Hex-Datei. Ich nutze das 
mitgelieferte "Programmers Notepad" zum schreiben und möchte nun aus dem 
Makefile und der .c-Datei mit dem eingebauten "Make all"-Kommando, wie 
gesagt eine Hexdatei erstellen. Beim Aufruf des Kommandos erhalte ich 
folgende Fehlermeldung:

---

> "C:\WinAVR-20100110\utils\bin\make.exe" all
make: *** [begin] Error 1

> Process Exit Code: 2
> Time Taken: 00:00

---

Ist die make.exe, die ich manuell zugewiesen habe, nicht die richtige?
Am Makefile liegt es denke ich nicht, das hab ich mit MFile konfiguriert 
und erstellt und dann manuell nichts mehr geändert.
Ist mein C-Programm möglicherweise gar nicht lauffähig? Liegt es daran? 
Ich programmiere gewöhnlicherweise in Java und habe mir jetzt im Rahmen 
der µController gaaanz elementare C-Syntax angeeignet.
Folgender Code müsste doch schon ausreichen, oder irre ich mich?
1
 
2
#include <avr/io.h>
3
4
int main(void){
5
6
  DDRA = 0b00000001;
7
  PORTA = 0b00000001;
8
9
}
... Schreibweise ohne Bitmanipulation, ich weiß. Muss aber für den 
Anfang reichen. :)
Das Makefile hab ich jetzt einfach mal in den Anhang gepackt. Ich hoffe, 
dass ist in Ordnung. Wenn nicht, übermittle ich den Inhalt auf anderem 
Wege.

Ich hoffe irgendein weiser Mensch kann mir Helfen: :)
Vielen Dank im Vorraus
Marr

von Stefan W. (dl6dx)


Lesenswert?

Hm. Sieht beim schnellen Überfliegen ok aus.

Welche Version von make ist das?

Was kommt bei "make -d all"?

Grüße

Stefan

von Marr (Gast)


Lesenswert?

Gut gut, ersteres beruhigt mich schon mal. :)
make -v gibt "GNU Make 3.81" aus.
Nachdem ich die Systemvariable Path angepasst habe funktioniert Make 
auch aus der Konsole raus.
make -d all gibt zuerst jede Menge "Trying pattern rule with 
makefile.Buchstabe" und ähnliche Zeilen aus.

Das kommt etwa 20 mal, danach folgendes:
---
No implicit rule found for `makefile`.
Finished prerequisites of target file `makefile`.
No need to remake target `makefile`.
Updating goal targets....
Considering target file `all`.
File `all` does not exist
Considering target file `begin`.
File `begin` does not exist.
Finished prerequisites of target file`begin`.
Must remake target `begin`.
---
Dann noch irgend etwas über "putting child on the Chain" und dann 
nochmal folgendes:
---
------- begin -------
Reaping winning child 0x003fd498 PID 38114152
Removing child WIEDARÜBER PID WIEDARÜBER from the Chain
Successfully remade target file `begin`.
Considering target file `gccversion`.
File `gccversion`does not exist.
Finished prerequisites of target file `gccversion`.
Must remake target `gccversion`.
CreateProcess<NULL, avr-gcc --version, ...> failed.
pricess_begin: CreateProcess<NULL, avr-gcc --version, ...>.
Putting Child HEXNUMMER PID NUMMER on the Chain.
Live child HEXNUMMER PID NUMMER
make <e=2>: Das System kann die angegebene Datei nicht finden.
Reaping losing child HEXNUMMER PID NUMMER
make: *** [gccversion] Error 2
Removing Child HEXNUMMER PID NUMMER from Chain.
---

ich kann damit nicht so viel anfangen. Für mich sieht es lediglich so 
aus, als fürde make.exe "all" als dateinamen ansehen.

von Stefan W. (dl6dx)


Lesenswert?

Marr schrieb:
> make <e=2>: Das System kann die angegebene Datei nicht finden.

Da fehlt eine Pfadangabe zum C-Compiler (avr-gcc). make findet das 
Executable des Compilers nicht.

Ab Zeile 338 ("# Define programs and commands.") findest du die Makros 
für die einzelnen Executables. Im Moment steht da nur "CC = avr-gcc", 
d.h. make versucht den C-Compiler mit der Kommandozeile "avr-gcc ..." zu 
starten.

Entweder, du erweiterst PATH so, dass alle aufgeführten Executables über 
den Suchpfad gefunden werden, oder du ergänzt den Pfad zum Compiler im 
Makefile. (Grundsätzlich geht beides, die Anpassung von PATH ist etwas 
portabler.)

Grüße

Stefan

von W.S. (Gast)


Lesenswert?

Stefan Wagner schrieb:
> (Grundsätzlich geht beides, die Anpassung von PATH ist etwas
> portabler.)

Scherzbold...

Du vergißt, daß der gute Marr nicht mit Linux, sondern mit Windows 
arbeitet. Mag ja sein, daß er nix anderes drauf hat außer dem Gnu-Avr 
Zeugs, aber wesentlich wahrscheinlicher ist es, daß er einiges mehr auf 
der Platte hat. Ich hatte vor einiger Zeit mal nachgezählt: Bei mir 
tummeln sich mehr als 12 MAKE.EXE herum und ein jedes stammt von ner 
anderen Toolchain und ist selbstverständlich völlig inkompatibel zum 
Rest. Den PATH anzupassen ist also die mit Abstand dümmste Idee, weil 
man damit garantiert irgendetwas einreißt. Also wäre m.E. ein mit 
präzisen Pfadangaben versehenes Makefile die bessere Lösung, weil es den 
Rest der Anwendungen auf dem betreffenden Rechner nicht beeinflußt.

W.S.

von Stefan W. (dl6dx)


Lesenswert?

Grundsätzlich hast du für eine solche Umgebung recht, dass es besser 
ist, die Executables über einen eindeutigen Pfad aufzurufen.

Blöd wird es dann, wenn man das selbe Coderepository auf mehreren 
Plätzen bearbeiten will und sich dort Pfade unterscheiden. Dann müsste 
man jedes Mal die Pfade umhängen.

In so einem Fall hielte ich es für besser, die Pfade beim Aufruf von 
make mitzugeben:

make CC=/path/to/avr-gcc <target>

Weil so was jedes Mal von Hand einzugeben natürlich Mist ist, packt man 
das dann in ein CMD-Skript.

Grüße

Stefan

von W.S. (Gast)


Lesenswert?

Stefan Wagner schrieb:
> Weil so was jedes Mal von Hand einzugeben natürlich Mist ist, packt man
> das dann in ein CMD-Skript.

Ich geh mal davon aus, daß die Projekte, die hier gebastelt werden, 
keine Riesenprojekte sind, die zum Compilieren ne Ewigkeit brauchen.

Deshalb ist es schlichtweg konsequent, auf die Makedatei ganz zu 
verzichten und die nötigen Aufrufe gleich in ne Batchdatei zu schreiben. 
Etwa so:

@ECHO OFF
SET ARMHOME=C:\KEIL40\ARM
SET PATH=%ARMHOME%\BIN40
SET ARMCONF=%ARMHOME%\BIN
SET ARMDLL=%ARMHOME%\BIN40
SET ARMINC=%ARMHOME%\RV31\INC
SET ARMLIB=%ARMHOME%\RV31\LIB

echo Assembliere Startup
armasm --cpu Cortex-M0 --thumb --list startup.lst --width 100 
startup.asm
if Errorlevel==1 goto ende

echo Compile Ir Tests
armcc  --via compile.xcl  ir_test.c
if Errorlevel==1 goto ende

echo Compile Main
armcc  --via compile.xcl  main.c
if Errorlevel==1 goto ende

na und so weiter. Die SET Angaben gelten nur lokal und momentan und 
damit ist das Ganze völlig unabhängig vom Rest der Welt. Sollte nach 
Umschreiben auch unter Linux sauber und zuverlässig funktionieren. 
Allerdings sehe ich bei Gnu nicht die elegante Möglichkeit, mit Dateien 
für xcl (extended command line) zu arbeiten - m.E. ein echtes Manko.

W.S.

von Marr (Gast)


Lesenswert?

So. :)
Vielen Dank erstmal für die vielen Antworten. Im großen und ganzen bin 
ich doch um einiges weiter gekommen. Jetzt bastel ich grade noch an ein 
paar kleinen Anfängerfehlern. Aber das wird schon. Und wenn nicht, dann 
finde ich hier im Forum sicher Unterstützung. :)
Bis bald
Marr

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.