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
intmain(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
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.
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
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.
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
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.
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
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.