|
MCU = atmega128
#型号
F_CPU = 8000000
#频率
FORMAT = ihex
#目标文件的格式
TARGET = main
#目标文件
SRC = $(TARGET).c
#C源文件
ASRC =
#ASM源文件
OPT = s
#优化等级
DEBUG = dwarf-2
#调试格式
EXTRAINCDIRS =
#其他目录
CSTANDARD = -std=gnu99
#C标准
CDEFS = -DF_CPU=$(F_CPU)UL
#编译定义
# Place -I options here
CINCS =
#其它C文件
#---------------- Compiler Options 编译选项 ----------------
CFLAGS = -g$(DEBUG)
#调试格式
CFLAGS += $(CDEFS) $(CINCS)
#基本定义和目录
CFLAGS += -O$(OPT)
#优化等级
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
#字段选项
CFLAGS += -Wall -Wstrict-prototypes
#警告等级
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
#汇编选项
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
#其他目录
CFLAGS += $(CSTANDARD)
#C标准
#---------------- Assembler Options 汇编选项----------------
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
#生成列表文件,使用调试格式
#-a[cdhlmns=file]
#生成汇编列表.子选项:
#c 忽略错误条件
#d 忽略调试指令
#h 包括高等语言(C语言)
#l 包括汇编语言
#m 包括宏扩展
#n 忽略类型预处理
#s 包括符号
#=file 列表文件名
#---------------- Library Options 库选项----------------
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
# If this is left blank, then it will use the Standard scanf version.
SCANF_LIB =
#SCANF_LIB = $(SCANF_LIB_MIN)
#SCANF_LIB = $(SCANF_LIB_FLOAT)
MATH_LIB = -lm
#使用数学函数库
#---------------- External Memory Options 扩展内存选项----------------
EXTMEMOPTS =
#---------------- Linker Options 连接选项----------------
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
#用交叉索引生成影射文件
LDFLAGS += $(EXTMEMOPTS)
#扩展内存选项
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
#标准输出,标准输入,数学的库选项
#---------------- Programming Options (avrdude) 编程选项(AVRDUDE) ----------------
AVRDUDE_PROGRAMMER = stk500
#编程器
AVRDUDE_PORT = com1 # programmer connected to serial device
#端口
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#FLASH文件
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
#AVRDUDE选项,型号,端口,编程器
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
#校验选项
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
#
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
#擦除计数器
#---------------- Debugging Options 调试选项 ----------------
DEBUG_MFREQ = $(F_CPU)
#频率
DEBUG_UI = insight
#界面
DEBUG_BACKEND = avarice
#后台
GDBINIT_FILE = __avr_gdbinit
#GDB初始文件
JTAG_DEV = /dev/com1
#JTAG设备
DEBUG_PORT = 4242
#端口
DEBUG_HOST = localhost
#主机
#============================================================================
# Define programs and commands.
SHELL = sh
#SHELL
CC = avr-gcc
#编译器
OBJCOPY = avr-objcopy
#转换OBJ文件
OBJDUMP = avr-objdump
#显示OBJ文件的内容
SIZE = avr-size
#显示文件大小
NM = avr-nm
#显示OBJ文件中的符号
AVRDUDE = avrdude
#
REMOVE = rm -f
#删除文件
COPY = cp
#复制文件
WINSHELL = cmd
#命令行
# Define Messages
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
#定义所有的目标文件
# Define all listing files.
LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
#定义所有的列表文件
# Compiler flags to generate dependency files.
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
#编译选项生成依赖文件
#-M 生成依赖
# -MD 生成依赖并编译
# -MF <file> 生成依赖文件
# -MG 将丢失的头文件当作已生成的文件
# -MM 同-M但忽略系统头文件
# -MMD 同-MD但忽略系统文件
# -MP 将所有头文件当作假目标
# -MQ <target> 引用目标开始
# -MT <target> 引用目标结束
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
#加入型号和一般选项
# Default target.
all: begin gccversion sizebefore build sizeafter end
build: elf hex eep lss sym
elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
end:
@echo $(MSG_END)
@echo
# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
#HEX文件的大小
ELFSIZE = $(SIZE) -A $(TARGET).elf
#ELF文件大小
AVRMEM = avr-mem.sh $(TARGET).elf $(MCU)
#AVR内存
sizebefore:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
$(AVRMEM) 2>/dev/null; echo; fi
sizeafter:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
$(AVRMEM) 2>/dev/null; echo; fi
# Display compiler version information.
gccversion :
@$(CC) --version
#版本信息
# Program the device.
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
#编程
gdb-config:
@$(REMOVE) $(GDBINIT_FILE)
@echo define reset >> $(GDBINIT_FILE)
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
@echo end >> $(GDBINIT_FILE)
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
ifeq ($(DEBUG_BACKEND),simulavr)
@echo load >> $(GDBINIT_FILE)
endif
@echo break main >> $(GDBINIT_FILE)
debug: gdb-config $(TARGET).elf
ifeq ($(DEBUG_BACKEND), avarice)
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
@$(WINSHELL) /c pause
else
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
endif
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
#由ELF转换成COFF文件,此处定义四个段位的起点
coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
#由ELF文件生成COFF文件
extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
#由ELF文件生成EXTCFF文件
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
#由ELF生成HEX文件
%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
#由ELF文件生成EEP文件
# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
#由ELF文件生成扩展列表文件
# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
$(NM) -n $< > $@
#由ELF生成符号列表
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
#连接生成ELF文件
# Compile: create object files from C source files.
%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@
#由C文件编译OBJ文件
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
#由C文件编译ASM文件
# Assemble: create object files from assembler source files.
%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@
#由ASM文件编译OBJ文件
# Create preprocessed source for use in sending a bug report.
%.i : %.c
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
#生成预处理文件以便报错
# Target: clean project.
clean: begin clean_list end
clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
$(REMOVE) .dep/*
# Include the dependency files.
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
#依赖文件
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program debug gdb-config |
|