Zitat von
Falte
Jetzt ist eine Frage wie muss ich das dann unter Linux machen. Du hast ja schon eben ein Code-Schnipsel gepostet. Kannst du mir den vielleicht noch erklären? Und wie bekomme ich mehrere Ordner mit in das Projekt, dass ich quasi wie bei der Makefile aus AVRStudio das machen kann. Kann mir da jemand helfen?
Besten Dank und beste Grüße,
Falte
Das ist nicht nur ein Codeschnipsel .. das ist das komplette Makefile für mein Projekt usbstepper.
Hier mal eine Erklärung:
----- Festlegung der Befehle. avrgcc und der flags
CC=avr-g++
RM=rm -f
OBJCOPY=avr-objcopy
AVRDUDE=sudo avrdude -p m168 -c avrispmkii -P USB
AVRSIZE=avr-size
OBJDUMP=avr-objdump
----- meine MCU
MCU=atmega168p
F_CPU=16000000
--- die CFlags stellen die Compileroptionen dar, hier setze ich eben die Defines für F_CPU und Compileroptionen
CFLAGS=-g -DF_CPU=$(F_CPU) -Wall -Os --std=c++11 -mcall-prologues
--- Hier werden die Objekte welche übersetzt werden müssen angegeben. *.o anstatt *.cpp. Wenn du eine Datei in einem Ordner hast einfach "lib/dasding.o". Ganze Biblitheken kann man natürlich auch einbinden. Siehe Makefile Tutoriol unter Google.
OBJ = main.o rs232.o parser.o timer1.o io.o
---- Hier lege ich die Zieldateien fest
BIN = usbstepper.bin
HEX = usbstepper.hex
MAP = usbstepper.map
--- Hier wird festgelegt dass bei nur "make" eben "make all" gemacht werden soll
.phony: all
-- Das hauptziel: Erstellen der firmware. all hängt von den OBJ (siehe oben) ab
--- Ich lösche die Zieldateien
--- Und Kompiliere das elf file das ich unter BIN angegeben habe
--- und erzeuge das hex file für den avrdude
all: $(OBJ)
$(RM) $(HEX) $(BIN) $(MAP)
$(CC) -mmcu=$(MCU) $(CFLAGS) -o $(BIN) -Wl,-Map,$(MAP) $(OBJ)
$(OBJCOPY) -R .eeprom -O ihex $(BIN) $(HEX)
--- diese Regel sagt, dass für alle *.o in OBJ eine passende *.cpp datei übersetzt werden soll
%.o: %.cpp
$(CC) -mmcu=$(MCU) $(CFLAGS) -c $<
--- clean = alles löschen ws der Kompiler erzeugt hat
clean:
$(RM) $(OBJ) $(BIN) $(HEX) $(MAP)
--- flash: hängt auch von den OBJ sachen ab und schubst anschliessend das Hex file auf den AVR
flash: $(OBJ)
$(AVRDUDE) -e -U flash:w:$(HEX)
--- hier kann ich ich die Fuses auslesen zur Kontrolle
readfuse:
$(AVRDUDE) lfuse:r:-:i -v
--- hier kann ich meine Fuses setzen. In diesem Fall lfuse= 0xde / hfuse = 0xdf / efuse = 0x01 für externen Quarz und > 8 MHz. Siehe fuse calculatur bei google
writefuse:
$(AVRDUDE) -U lfuse:w:0xde:m -U hfuse:w:0xdf:m -U efuse:w:0x01:m
--- hier kann ich die Größe auf dem Ziel ausgeben lassen.
size: $(BIN)
$(AVRSIZE) -B $(BIN)
--- hier kann ich das elf file dumpen lassen und sehen welche funktionen wieviel Speicher brauchen
dump:
$(OBJDUMP) -d --demangle $(BIN)
Das ganze nutzt man dann so:
Code:
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ ls
Makefile atmega168p.h fifo.h io.cpp io.h main.cpp motion.h parser.cpp parser.h rs232.cpp rs232.h stepper.h timer1.cpp timer1.h units.h
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ make
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c main.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c rs232.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c parser.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c timer1.cpp
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -c io.cpp
rm -f usbstepper.hex usbstepper.bin usbstepper.map
avr-g++ -mmcu=atmega168p -g -DF_CPU=16000000 -Wall -Os --std=c++11 -mcall-prologues -o usbstepper.bin -Wl,-Map,usbstepper.map main.o rs232.o parser.o timer1.o io.o
avr-objcopy -R .eeprom -O ihex usbstepper.bin usbstepper.hex
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ ls
Makefile fifo.h io.h main.cpp motion.h parser.h rs232.cpp rs232.o timer1.cpp timer1.o usbstepper.bin usbstepper.map
atmega168p.h io.cpp io.o main.o parser.cpp parser.o rs232.h stepper.h timer1.h units.h usbstepper.hex
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ make flash
sudo avrdude -p m168 -c avrispmkii -P USB -e -U flash:w:usbstepper.hex
Passwort:
avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): bad AVRISPmkII connection status: Unknown status 0x00
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
make: *** [flash] Fehler 1
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $ make size
avr-size -B usbstepper.bin
text data bss dec hex filename
7626 308 370 8304 2070 usbstepper.bin
georg@machariel ~/Dokumente/Entwicklung/upstream/Elektro/Projekte/usbstepper/firmware $
Hier habe ich nur am avrispmkii keinen atmega168 dran....
Wie ich die Dateien erstelle mit welchem Editor ist doch völlig egal.... Ein Makefile funktioniert immer, unabhängig davon welche "IDE" oder Editor ich einsetze.
Viel mehr als hier [1] beschrieben mache ich nicht ...
Wichtig bei makefiles ist, dass nur die Ziele wie "all" ganz vorne stehen bzw die Variablenzuweisungen weiter oben.
Code:
dump:
-->Tab zum einrücken" "$(OBJDDUMP)....
[1] http://www.ijon.de/comp/tutorials/makefile.html
Gruß
Georg
Lesezeichen