1. 程式人生 > >AVR-GCC Makefile 中文翻譯

AVR-GCC Makefile 中文翻譯

這段時間一直弄AVR微控制器,以前只用彙編編過程,但是沒有用過C語言,最近用了C語言,學了一下Makefile ,GCC 。用AVR_studio4.12可以自己生成Makefile, 用了一下,其實所有的想要的功能都可以實現。但是我是個愛鑽牛角尖人,呵呵。看了一下 WINAVR Makefile 的模板我覺得寫得很好,學習了一下,翻譯了一下,加上很多我的理解和註釋。把它共享給大家,共同進步。這個Makefile 的目標板是這樣的:mega128 外擴32k (62256)RAM ,我把變數.data .bss ,stack都定義在內部4k RAM,而只把 heap (malloc()) 區定義在外部RAM 區。可能是因為用熟了Keil C51 吧。整個工程在 AVRstudio 4.12sp4   , WINAVR 20060421 ,avr-gcc 3.4.6 ,winxp sp2 系統編通過,並下載到目標板測試沒有問題。因為是初學,如果我寫得有什麼錯誤,我理解有錯識的話,請大家一定要指正。給我發E-mail 或給我留言,非常感謝。

#××××××××××××××××××××××××××××××
# AVR-GCC makefile 模板                                                                      ×
# semilog                                                                                                   ×
# E-mail:                                                                   
# 時間:2007年11月9日                                                                           ×
# 地點:南京理工大學                                                                               ×
# 注:在原來的WinAVR 的例程的基礎上修改,翻譯,註釋,並且測試    ×
#××××××××××××××××××××××××××××××

#下面這一段是原作者,為了尊重他們的勞動
# Hey Emacs, this is a -*- makefile -*-
#----------------------------------------------------------------------------
# WinAVR Makefile Template written by Eric B. Weddington, Joerg Wunsch, et al.
#
# Released to the Public Domain
#
# Additional material for this makefile was written by:
# Peter Fleury
# Tim Henigan
# Colin O'Flynn
# Reiner Patommel
# Markus Pfaff
# Sander Pool
# Frederik Rouleau
# Carlos Lamas
#
#----------------------------------------------------------------------------

# 編譯操作命令如下:
#
# make all = 編譯整個工程.
#
# make clean = 刪除所有前一次編譯的整個工程所產生的檔案
#
# make coff = 轉換 ELF 除錯檔案到 AVR 的 COFF 除錯檔案.適用於AVRStudio.3.X及以前的版本.         
#             VMLAB <3.10 
#
# make extcoff = 轉換 ELF 除錯檔案到 AVR 的 Extended COFF 除錯檔案.          VMLAT 3.10+
#                適用於AVRStudio.4.07 及以後的版本。也就是現在我們要使用的版本
#                但是好像AVRStdio.4.10及以上的版本開始支援 ELF 除錯文
#
# make program = 用 avrdude(gnu的avr微控制器下載軟體) 下載 hex 檔案到AVR微控制器內,
#                不要再這之前要先配置好 avrdude .注:我們可以用雙龍的下載軟體等。
#
# make debug = 啟動 simulavr 或 avarice 進行除錯,你用 avr-gdb 或是avr-insight作的你的除錯前端
#
# make filename.s = 單獨編譯 filename.c 到彙編檔案filename.s .
#
# make filename.i = 通過這個命令進行預編譯,來檢視GCC工程是否有錯.
#
# 說了這麼多,最有用的就是下面這兩句:
# make clean 
# make all 
# 這樣你的工程就編譯完成了。
#----------------------------------------------------------------------------

#下面對AVR-GCC引數的說明   
#注:關於Makefile的知識網上有很多,看看Makefile的手冊

# AVR微控制器的名字。這個很重要,不可寫錯,因為這個引數真接關係到<io.h>檔案所包含的<iomxx.h>檔案
# 這個<iomxx.h>檔案包含了所以的對於 你所選的AVR 微控制器的所有引腳和暫存器定義。
# 就如keil 51中的引用<at89x51>或<REG51.h>一樣 
MCU = atmega128

# MCU 的執行頻率.
#     下面是給出的一些典型值:
#         F_CPU = 1000000
#         F_CPU = 1843200
#         F_CPU = 2000000
#         F_CPU = 3686400
#         F_CPU = 4000000
#         F_CPU = 7372800
#         F_CPU = 8000000
#         F_CPU = 11059200
#         F_CPU = 14745600
#         F_CPU = 16000000
#         F_CPU = 18432000
#         F_CPU = 20000000
# 在使用<avr/delay.h> 中的延時程式時很有用

F_CPU = 7372800

# 輸出檔案格式,對於微控制器程式設計來說,一般我們先intel 的hex格式. (可以是: srec, ihex, binary)
FORMAT = ihex

# 目標檔名,一般就是你最main()函式所在檔名,也是最後輸的hex文年的檔名(不帶副檔名).
TARGET = m128

#目標檔案的臨時目錄,就選 "obj"這個名子吧,一般不用修改
OBJDIR = obj

# 列出你的C語言的工程中的所有的 *.C 原始檔名. (C 的所有的檔案依賴關係會自己動建立,後面會說.)
# 對於只有一個源文的工程也可以寫成: SRC = $(TARGET).c
SRC = m128.c

# 列出你的 C++工程中的所有的 *.cpp原始檔名. (C++的所有的檔案依賴關係也會自己動建立.)
# 對於我們對AVR微控制器程式設計來說,一般我們只用C語言就可以了。所以這裡我們什麼都不用寫
# 如果你要用C++也可以,這裡你就要配置下。
CPPSRC =

# 列出你的工程中的所有的彙編源程式
#     記住要用大寫.S儲存你的彙編檔名,不要用小寫的.s 。要不然AVR-GCC不認為它是個彙編原始檔
#     而且在執行 make clean 時也刪除 .s 的檔案,因為它會認為是編譯C檔案生成的彙編過程檔案
ASRC =


# AVR-GCC程式碼優化級別,選項:[0, 1, 2, 3, s]. 級別越高,優化程度越大
#     0 = 不優化. s = 2 + 優化程式碼大小,3 優化並不總是最好的.使用-O時表示-O1;
OPT = s

# 除錯檔案格式.
#     如果是用Winavr 的GDB除錯的話選 dwarf-2 [預設] 或者stabs也行。
#     從AVR Studio 4.10 (我不知道是不是從這個版本開始,反正4.12是可以的)
#     開始AVRStudio已開始支援ELF/DWARF的除錯檔案,所以這時你可以選 dwarf-2.
#     編譯你的工程然後開始除錯,我測試過,而且在AVRStudio4.12的幫助文件中找到了
#     AVRStudio目前支援的 Debugging File 的說明,你們也可以自己去看一下。
#     當然 AVR [Extended] COFF 格式還是支援,不過你要在編譯時在這裡選 stabs 選項
#     然後在用"make all" 編譯後再用"make extcoff"呼叫avr-objcopy 生成 [Extended] COFF.
#     這時你會覺得有點煩,呵呵。那就選 dwarf-2選項吧,不用動它就可以了
DEBUG = dwarf-2


# 列出你的用#i nclude 包含的.h標頭檔案的目錄.make 會在當前目錄或標準庫的目錄找不到時
# 到這個目錄在尋找 例: EXTRAINCDIRS = c:\m128\inc 如果是makefile當前目內的子目錄inc
# 那麼就直接寫 EXTRAINCDIRS = inc .如果有多個目錄,中間用空格隔開。都在一個目錄就不用寫
EXTRAINCDIRS =


# 編譯標記,用來選標準C的級別,一般不用動
#     c89   = "ANSI" C
#     gnu89 = c89 plus GCC extensions
#     c99   = ISO C99 standard (還沒有完全完成)
#     gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99


# 在C語言原始檔前面加上 -D or -U 選項(具體什麼意思我還沒有弄明白)
CDEFS = -DF_CPU=$(F_CPU)UL

# 這個和上面的說明一樣,不過是對於C++檔案的
CPPDEFS = -DF_CPU=$(F_CPU)UL

#----------------------- C 編譯選項-------------------------------
# -g*:          產生除錯資訊
# -O*:          程式碼優代級別
# -f...:        用於改變內建一些預設的函式,具體的看avr-libc手冊
# -Wall..:      警告的級別
# -Wa,...:      告訴GCC 後面的選項不用管,把它傳給彙編選項.
# -Wl,...:      和-Wa選項差不多,告訴GCC 傳遞後面的選項給liker連結器.
# -a[cdhlmns=file]: 建立彙編列表檔案,預設的一般選 -adhlns 
# 子選項如下: 
# c 省略錯誤的條件 
# d 省略除錯的指令
# h 包含最高層的原始檔
# l 包含彙編檔案
# m 包含巨集的展開 
# n 省略處理的框架(forms processing)(我不知是什麼意思) 
# s 包含標號 
# =file 設定生成的彙編列表檔案的檔名,可以包含目錄名用"/"隔開.

#-------------------------集合所有C編譯選項到變數 CFLAGS 中-------------------
#DUBUG選項
CFLAGS = -g$(DEBUG)

#CPU時鐘頻率
CFLAGS += $(CDEFS)

#優化級別
CFLAGS += -O$(OPT)

#把int 當成 8-bit integer,avr-libc並不真的支援,所以一般不要用.
#CFLAGS += -mint8

#在大於8K 微控制器使用 rjmp/rcall (預設情況用jmp/call)
#CFLAGS += -mshort-calls

#這個選項會關掉自動內建的函式(但是可以在實際使用的函式前加上 __builtin_)
#當你使用這個引數時,void main() 不出現警告
#這個引數同時也會影響你的程式碼的優化,使程式碼增加。一般不使用就可以了。
#更多的說明請參考avr-libc說明。
#CFLAGS += -ffreestanding

#編譯器總認為 char = unsigned char
CFLAGS += -funsigned-char

#當你定義一個位變數bit區時,總認為它是unsigned bitfields, 所以定義 aa:4 = unsigned aa:4
CFLAGS += -funsigned-bitfields

#定義結構體的時候,使裡面的每一個元素的儲存空間都是連續,一個接一個存,中間沒有儲存間隔
CFLAGS += -fpack-struct

#定義列舉型別的時候,使用裡面儲存空間最大的一個變數作為整個列舉變數的儲存空間
CFLAGS += -fshort-enums

#在製作執行檔案前分析整個編譯單位。提供某些額外最佳化套用的機會,但會使用更多記憶體。
#這個引數我也不知是什麼意思。不用它吧。
#CPPFLAGS += -fno-unit-at-a-time

#很多警告的集合,具體參見GCC 手冊
CFLAGS += -Wall

#如果函式的宣告或定義沒有指出引數型別,編譯器就發出警告
CFLAGS += -Wstrict-prototypes

#如果使用未定義巨集,則進行警告
CFLAGS += -Wundef

#對程式中沒有使用的程式碼作出警告
#CFLAGS += -Wunreachable-code

#在有符號數和無符號數進行值比較時,有符號數可能在比較之前被轉換為無符號數而導致結果錯誤
#CFLAGS += -Wsign-compare

#建立彙編列表檔案, $(<:%.c=$(OBJDIR)/%.lst)的意思是把"<"表示的目標的
#所有.c檔案換成.lst 檔案,作為輸出lst檔案的檔名
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)

#這句的意思是在$(EXTRAINCDIRS)定義目錄變數中,為每一個用空格隔開的目錄前加上 -I
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))

#標準C的級別
CFLAGS += $(CSTANDARD)

#--------------------------- C編譯選項 CFLAGS 結束---------------------------


#----------------下面是 C++ 的編譯選項(見C編譯選頂,不重複說了) -------------
# -g*:          generate debugging information
# -O*:          optimization level
# -f...:        tuning, see GCC manual and avr-libc documentation
# -Wall...:     warning level
# -Wa,...:      tell GCC to pass this to the assembler.
#    -adhlns...: create assembler listing
CPPFLAGS = -g$(DEBUG)
CPPFLAGS += $(CPPDEFS)
CPPFLAGS += -O$(OPT)
#CPPFLAGS += -mint8
#CPPFLAGS += -mshort-calls
CPPFLAGS += -funsigned-char
CPPFLAGS += -funsigned-bitfields
CPPFLAGS += -fpack-struct
CPPFLAGS += -fshort-enums
CPPFLAGS += -fno-exceptions
#CPPFLAGS += -fno-unit-at-a-time
CPPFLAGS += -Wall
#CPPFLAGS += -Wstrict-prototypes
CPPFLAGS += -Wundef
#CPPFLAGS += -Wunreachable-code
#CPPFLAGS += -Wsign-compare
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
#CPPFLAGS += $(CSTANDARD)
#--------------------------- C++ 編譯選項 CFLAGS 結束-------------------------


#---------------- Assembler Options ----------------
# -Wa,...:   告訴GCC 後面的選項不用管,把它傳給彙編選項..
# -ahlms:    建立列表檔案
# -gstabs:   stabs debugging symbols for assembler source lines.
#             This enables avr-gdb to trace through assembler source files
#             當原始檔中由C編譯產生的.s彙編檔案時不要用這個選項,因為
#             其已包含了合適的行資訊。

#ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2    #彙編檔案由C產生時用            
ASFLAGS = -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs


#--------------------------------- 有關庫的選項-------------------------------
# printf 函式最小的版本
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min

# 標準 printf 還加上 Floating point (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

# 如果PRINTF_LIB不寫為空,那麼gcc-libc 就使用標準版的 printf 函式.
PRINTF_LIB = 
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)

# 最小的 scanf 函式的版本
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)

# -l[lib-name] 庫名去掉lib 和.a字尾 如 libm.a 則寫成 -lm 如下所示:
MATH_LIB = -lm


#----------------------外部儲存器選項 ---------------------------
#      關於--defsym 的說明
#      --defsym symbol=expr   #定義一個全域性的標誌,用expr作為symbol 的值.
#    -Tbss org    
#    -Tdata org
#    -Ttext org        

# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# 64 KB的外部擴充套件的 RAM, 地址接在內部 RAM後面
# used for variables (.data/.bss) and heap (malloc()).
# 變數(.data/.bss)還有heap(malloc()),都使用這個區不用內部RAM 
# 前面加上0x800000 表示是RAM資料區,而不是程式區,因為AVR 是哈弗結構
# EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff

# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# 外部RAM只用作 heap區,供malloc()分配的空間儲存,變數(.data/.bss)仍在內部RAM.
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff

EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x807fff

#顯示地註明堆疊最高地址,也就是棧頂地址,C語言堆疊是向下生長,一般定義在RAM的尾部
EXTMEMOPTS += -minit-stack=0x1100


#---------------- 連結選項 LDFLAGS----------------
# -Wl,...:     告訴GCC 傳遞後面的選項給liker連結器.
#    -Map:      建立 map 檔案
#    --cref:    把對照資訊加到 map 檔案中
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)

#連結器使用linker_script.x指令碼,avr-gcc自帶指令碼存在 WinAVR\avr\lib\ldscripts下
#LDFLAGS += -T linker_script.x


#---------------- 程式設計下載選項 (avrdude) ----------------
# 用到少,我就不翻譯了,而且也很簡單。
# Programming hardware: alf avr910 avrisp bascom bsd 
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
#
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = stk500

# com1 = serial port. Use lpt1 to connect to parallel port.
AVRDUDE_PORT = com1    # programmer connected to serial device

AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep

# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
# AVRDUDE_ERASE_COUNTER = -y

# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
# AVRDUDE_NO_VERIFY = -V

# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude
# to submit bug reports.
# AVRDUDE_VERBOSE = -v -v

AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)

 

#---------------------除錯選項--------------------

# For simulavr only - target MCU frequency.
# MCU 的頻率 (only for simulavr)
DEBUG_MFREQ = $(F_CPU)

# Set the DEBUG_UI to either gdb or insight.
# DEBUG_UI = gdb
DEBUG_UI = insight

# Set the debugging back-end to either avarice, simulavr.
DEBUG_BACKEND = avarice
#DEBUG_BACKEND = simulavr

# GDB Init Filename.
GDBINIT_FILE = __avr_gdbinit

# When using avarice settings for the JTAG
JTAG_DEV = /dev/com1

# Debugging port used to communicate between GDB / avarice / simulavr.
DEBUG_PORT = 4242

# Debugging host used to communicate between GDB / avarice / simulavr, normally
#     just set to localhost unless doing some sort of crazy debugging when 
#     avarice is running on a different computer.
DEBUG_HOST = localhost


#============================================================================

#---------------定義編譯軟體和命令的別名,便於移植--------------------
SHELL = sh
CC = avr-gcc
#----------------------複製和翻譯目標檔案成其他的格式,如: elf -> ihex
OBJCOPY = avr-objcopy
#----------------------avr-objdump 顯示關於目標檔案和彙編檔案的一些資訊
OBJDUMP = avr-objdump
SIZE = avr-size
#----------------------avr-nm 從目標檔案中列出所有標號
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
#----------------------刪除目標及目錄內檔案
REMOVEDIR = rm -rf
COPY = cp
WINSHELL = cmd


#-------------------定義一些用於編譯時顯示的資訊-------------------
# English (英文)
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 C:
MSG_COMPILING_CPP = Compiling C++:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
MSG_CREATING_LIBRARY = Creating library:


# 定義所有的目標檔案.
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)

# 定義所有的 listing 檔案.
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)

# 編譯選項,用來生成所有的依賴檔案. -MF 用於指定寫入的.d的檔名,-MMD 不包系統標頭檔案名 
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d


# 合併所有需要的flags 和可選項的 flags
# 並且把 MCU 型號加入到 flags 中.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)


# 預設的目標,也就是Makefile中出現的第一個目標.
all: begin gccversion sizebefore build sizeafter end

# 把編譯工程生成的 目標檔案轉換成.HEX 檔案或是 .a庫檔案等等.預設不生成庫檔案
build: elf hex eep lss sym
#build: lib

elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)


# Eye candy.
# AVR Studio 3.x 不會檢查 make 退出的程式碼,但是卻依賴下面的字串
# echo 是用來顯示的命令,和DOS中的命令不一樣,不是一個顯示開關。
begin:
@echo
@echo $(MSG_BEGIN)

end:
@echo $(MSG_END)
@echo


# 顯示各個檔案的大小
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
AVRMEM = avr-mem.sh $(TARGET).elf $(MCU)

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

 

# 顯示avr-gcc的版本資訊.
gccversion: 
@$(CC) --version


#下載程式到目標MCU 
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)


# 生成 avr-gdb 配置/初始化檔案,主要按下面來做:
# 定義復位訊號,載入目標檔案,連線目標,把斷點設定在main()函式 
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)

 


# 把 ELF 檔案轉換成 COFF 檔案,供 AVR Studio 或 VMLAB 除錯與模擬.
COFFCONVERT = $(OBJCOPY) --debugging
COFFCONVERT += --change-section-address .data-0x800000
COFFCONVERT += --change-section-address .bss-0x800000
COFFCONVERT += --change-section-address .noinit-0x800000
COFFCONVERT += --change-section-address .eeprom-0x810000


coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof

extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof


# 通過輸出的 ELF 檔案建立最終的(.hex, .eep)檔案.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) [email protected]
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< [email protected]

%.eep: %.elf
@echo
@echo $(MSG_EEPROM) [email protected]
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< [email protected]

# 通過 ELF 檔案建立擴充套件的列表檔案.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) [email protected]
$(OBJDUMP) -h -S $< > [email protected]

# 通過 ELF 檔案建立列表檔案
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) [email protected]
$(NM) -n $< > [email protected]

 

# 通過.o目標檔案建立.a 庫文
.SECONDARY : $(TARGET).a
.PRECIOUS : $(OBJ)
%.a: $(OBJ)
@echo
@echo $(MSG_CREATING_LIBRARY) [email protected]
$(AR) [email protected] $(OBJ)


# 鏈 接: 通過.o目標檔案建立 ELF 檔案
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) [email protected]
$(CC) $(ALL_CFLAGS) $^ --output [email protected] $(LDFLAGS)


# 編 譯: 編譯 C 原始檔建立 .o 目標檔案
$(OBJDIR)/%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o [email protected]


# 編 譯: 編譯 C++ 原始檔建立 .o 目標檔案
$(OBJDIR)/%.o : %.cpp
@echo
@echo $(MSG_COMPILING_CPP) $<
$(CC) -c $(ALL_CPPFLAGS) $< -o [email protected]


# 編 譯: 編譯 C 原始檔建立 .s 彙編檔案
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o [email protected]


# 編 譯: 編譯 C++ 原始檔建立 .s 彙編檔案
%.s : %.cpp
$(CC) -S $(ALL_CPPFLAGS) $< -o [email protected]


# 匯 編: 編譯 .S 彙編原始檔建立 .o 目標檔案(必須大寫"S"作字尾)
$(OBJDIR)/%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o [email protected]


# 只對原始檔進行預處理,檢視是原始檔是否有錯
%.i : %.c
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o [email protected]


# 目 標: 清除整個工程,便於下次編譯
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
$(REMOVEDIR) $(OBJDIR)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
$(REMOVEDIR) .dep


# 建立用於存目標檔案的目錄 $(OBJDIR)
$(shell mkdir $(OBJDIR) 2>/dev/null)

# 包含依賴檔案
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

# 把所有的目標都定義成偽目標,偽目標的特性總是被執行
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program debug gdb-config

 

https://www.cnblogs.com/ele-eye/archive/2012/08/10/2632198.html