Avr makefile
From Attie's Wiki
# the output binary name (found in ./bin) ELFOUT:=main.elf HEXOUT:=main.hex # the source files you wish to use (without the '.c') - main.c is added later SRCS:= # which device are you using? DEVICE:=atmega328p # what protocol do you use to communicate with the IC? AVRDUDE_PROTO:=stk500v1 #AVRDUDE_PROTO:=buspirate # which serial port is it connected to? AVRDUDE_PORT:=/dev/ttyUSB0 AVRDUDE_BAUD:=57600 ################################################################################### # There should be no need to change below here for most projects DIRS:=bin obj hex SRCS+=main OPTIMISATION:=-falign-functions \ -falign-jumps \ -falign-labels \ -falign-loops \ -fif-conversion2 \ -finline-functions \ -fregmove \ -frename-registers \ -fshort-enums \ -freorder-blocks \ -freorder-functions \ -fsplit-wide-types \ -ftoplevel-reorder \ -funroll-all-loops \ -fvariable-expansion-in-unroller CROSS_COMPILE:=avr- CC:=$(CROSS_COMPILE)gcc OBJCOPY:=$(CROSS_COMPILE)objcopy CFLAGS:=$(OPTIMISATION) -mmcu=$(DEVICE) -c -Wall -O9 CLINKS:=$(OPTIMISATION) -fwhole-program -mmcu=$(DEVICE) .PHONY: all new clean spotless .dirs upload download all: .dirs ./hex/$(HEXOUT) new: clean ./hex/$(HEXOUT) clean: rm -f *~ rm -f ./hex/$(HEXOUT) rm -f ./bin/$(ELFOUT) rm -f ./obj/*.o spotless: clean rm -rdf $(addprefix ./,$(DIRS)) .dirs .dirs: makefile mkdir -p $(addprefix ./,$(DIRS)) @touch .dirs upload: ./hex/$(HEXOUT) avrdude -c$(AVRDUDE_PROTO) -P$(AVRDUDE_PORT) -b$(AVRDUDE_BAUD) -D -Uflash:w:./hex/$(HEXOUT):a download: rm ./hex/$(HEXOUT).downloaded avrdude -c$(AVRDUDE_PROTO) -P$(AVRDUDE_PORT) -b$(AVRDUDE_BAUD) -D -Uflash:r:./hex/$(HEXOUT).downloaded:a ./hex/$(HEXOUT): ./bin/$(ELFOUT) $(OBJCOPY) -j .text -O ihex $^ $@ ./bin/$(ELFOUT): $(addprefix ./obj/,$(addsuffix .o,$(SRCS))) makefile $(CC) $(CLINKS) $(filter %.o,$^) -o $@ ./obj/%.o: %.c %.h makefile $(CC) $(CFLAGS) $*.c -o $@ ./obj/%.o: %.c makefile $(CC) $(CFLAGS) $*.c -o $@
Memory Usage
It is very handy to know the current memory usage of your application. Especially when working with the smaller devices.
Add this to your makefile and then type make meminfo
to get detailed information on the memory usage
.PHONY: meminfo meminfo: .meminfo @cat .meminfo .meminfo: ./bin/$(ELFOUT) @echo "Regenerating memory usage information..." @avr-objdump ./bin/$(ELFOUT) -t | grep -e "^[0-9a-f]* ......O" > .meminfo.t1 @cat .meminfo.t1 | sed -re "s/.*\.bss[ \t]0*//" | awk --non-decimal-data '{print ("0x"$$1)+0 "\t" $$2}' > .meminfo.t2 @cat .meminfo.t2 | sort -nr > .meminfo @cat .meminfo | awk '{val += $$1}END{print "TOTAL: " val " bytes"}' >> .meminfo @rm .meminfo.t*