AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

发布时间:2024-11-08

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带
首页 相册 标签



博客登陆
用户名:
密 码:
验证码:
    记住密码
用户注册 忘记密码



北京时间



站点日历
<< < 2009 - 11 > >>日一二三四五六
123
45678910
11121314151617
18192021222324
252627282930



最新日志
我会更新的
#ifndef的主要作用是什么?(转
#ifdef __cplusplus
关于AD的一些术语
AVR的DS18B20 温度采集示例
avr-gcc中关于delay延时函
AVR-GCC Makefile 中
嵌入式系统中volatile 的使用
正则表达式 Sed 用法(转)
正则表达式(regular expr



最新评论
Re:AVR-GCC Ma
Re:avr-gcc中关于delay
Re:avr-gcc中关于delay
Re:Delphi中关于OleVar
Re:AVR的DS18B20&nbs
Re:Delphi中关于OleVar
Re:#ifdef __c
Re:AVR-GCC Ma
Re:嵌入式系统中volatile&
Re:AVR-GCC Makefil



留 言 板
签写留言



友情链接
梦想的骨头
枫井O_O








日志信息
详细信息站内订阅(0)加为好友发送短信日志:17评论:-20留言:0访问:78251


AVR-GCC Makefile 中文翻译并加上我的理解 [semilog 发表于 2007-11-13
11:51:00]

2
推荐这段时间一直弄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-g

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

cc
3.4.6 ,winxp sp2 系统编通过,并下载
到目标板测试没有问题。
因为是初学,如果我写得有什么错误,我理解有错识的话,请大家一定要指正。给我发E-mail 或给我
留言,非常感谢。



#××××××××××××××××××××××××××××××
# AVR-GCC makefile 模板
×
# semilog
×
# E-mail: semilog@http://

# 时间: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 cl
ean = 删除所有前一次编译的整个工程所产生的文件
#
# make coff = 转换 ELF 调试文件到 AVR 的 COFF
调试文件.适用于AVRStudio.3.X及以前的版本.
# VMLAB <3.10
#

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

# 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
# 输出文件格式,对于单片机编程来

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

说,一般我们先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 a
ll" 编译后再用"make extcoff"调用avr-objcopy 生成
[Extended] COFF.
# 这时你会觉得有点烦,呵呵。那就选 dwarf-2选项吧,不用动它就可以了
DEBUG = dwarf-2

# 列出你的

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

用#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选项
C
FLAGS = -g$(DEBUG)
#CPU时钟频率
CFLAGS += $(CDEFS)
#优化级别
CFLAGS += -O$(OPT)
#把int 当成 8-bit integer,avr-libc并不真的支持,所以一般不要用.
#CFLAGS += -mint8

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

#在大于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

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

结束---------------------------

#----------------下面是 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
#

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

标准 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_star
t=0x801100,--defsym=__heap_end=0x807fff
#显示地注明堆栈最高地址,也就是栈顶地址,C语言堆栈是向下生长,一般定义在RAM的尾部
EXTMEMOPTS += -minit-stack=0x1100

#---------------- 链接选

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

项 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:///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_F
LAGS += $(AVRDUDE_ERASE_COUNTER)

#---------------------调试选项--------------------
# For simulavr only - target MCU frequency.
# MCU 的频率 (only

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

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

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

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)
sizebefo

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

re:
@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-s
ection-address .data-0x800000
COFFCONVERT += --change-section-address .bss-0x800000
COFFCONVERT += --change-section-address .noinit-0x800000

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

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) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom
--set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
# 通过 ELF 文件创建扩展的列表文件.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
# 通过 ELF 文件创建列表文件
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
$(NM) -n $< > $@

# 通过.o目标文件创建.a 库文
.SECONDARY : $(TARGET).a
.PRECIOUS : $(OBJ)
%.a: $(OBJ)
@echo
@echo $(MSG_CREATING_LIBRARY) $@
$(AR) $@ $(OBJ)

# 链 接: 通过.o目标文件创建 ELF 文件
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

# 编 译: 编译 C 源文件创建 .o 目标文件
$(OBJDIR)/%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@

# 编 译: 编译 C++ 源文件创建 .o 目标文件
$(OBJDIR)/%.o : %.cpp
@echo
@echo $(MSG_COMPILING_CPP) $<
$(CC) -c $(ALL_CPPFLAGS) $< -o $@

# 编 译: 编译 C 源文件创建 .s 汇编文件
%.s : %.c

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

$(CC) -S $(ALL_CFLAGS) $< -o $@

# 编 译: 编译 C++ 源文件创建 .s 汇编文件
%.s : %.cpp
$(CC) -S $(ALL_CPPFLAGS) $< -o $@

# 汇 编: 编译 .S 汇编源文件创建 .o 目标文件(必须大写"S"作后缀)
$(OBJDIR)/%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@

# 只对源文件进行预处理,查看是源文件是否有错
%.i : %.c
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@

# 目 标: 清除整个工程,便于下次编译
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





阅读全文(3474) | 回复(6) | 引用通告(0) | 编辑


标签:avr-gcc makefile 中文
上一篇:嵌入式系统中volatile 的使用的意义
下一篇:avr-gcc中关于delay延时函数的应用
Re:AVR-GCC Makefile 中文翻译并加上我的理解 [john(游客)发表评论于2009-3-1
6
16:22:00]

在makefile里怎么读取和设置熔丝位呢?
以下为blog主人的回复:
makefile 里不用设,而且也不在里面设。熔丝位 在用编程器烧录的时候设的。



个人主页 | 引用 | 返回 | 删除 | 回复

Re:AVR-GCC

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

Makefile 中文翻译并加上我的理解 [孙涛(游客)发表评论于2008-5-7
11:37:00]

你好,avr-gcc后面的参数specs是做什么的啊,我的邮箱y071301@http://
我在做wsn相关的项目,用到avr-gcc 很想向您请教一下!
以下为blog主人的回复:
那个是要求你包含一个关于你自己的一个 Specs file 来代替你默认的Specs
strings.也就是重新定义你的预编译,汇编,连接,等命令行参数。 具体请参见:
http:///onlinedocs/gcc-4.3.0/gcc/Spec-Files.html#Spec-Files
GCC上有关于它的详细说明。
avr-gcc 的默认的 specs file 在C:\WinAVR\lib\gcc\avr\3.4.6\
目录下,里面一个叫specs的文件。你可以用记事本打开看一下。一般情况下不用修改Specs所指定的参数。所以一般的运用不用修改,也就不要Specs参数



个人主页 | 引用 | 返回 | 删除 | 回复

Re:AVR-GCC Makefile 中文翻译并加上我的理解
[sparkling(游客)发表评论于2008-1-17 22:33:00]

very good!



个人主页 | 引用 | 返回 | 删除 | 回复

Re:AVR-GCC Makefile 中文翻译并加上我的理解 [tony(游客)发表评论于2008-1-17
22:11:00]

你好。请问你有否用过simulavr+avr-gdb调试程序呢?我用的时候发现,无法打印变量的值。不知你是否有高招。
以下为blog主人的回复:
不好意思,我没有用simulavr +
avr-gdb调试过。所以也没有去研究过如何去调试,而且最近一段时间忙于其他的事,也没有时间弄avr。你问问其他人吧。



个人主页 | 引用 | 返回 | 删除 | 回复

Re:AVR-GCC Makefile 中文翻译并加上我的理解 [AVR研究(游客)发表评论于2008-1-10
23:39:00]

非常感谢您的解答和实际操作!之所以问这个,是因为有人谈到 avr studio 不可以处理和编译 c
语言,但我发现其实 avr studio 在安装了 winavr 后是可以编译 c 源程序并输出 elf

文件的,所以这样的话,如果 avr studio 能够加载 elf 文件并可以配合仿真器的话,就可以摆脱结合
iccavr 枯燥和繁琐的调试环境了。



个人主页 | 引用 | 返回 | 删除 | 回复

Re:AVR-GCC Makefile 中文翻译并加上我的理解

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带

[AVR研究(游客)发表评论于2008-1-3
22:46:00]

大哥你好,我对您说到的一个地方很感兴趣。您的意思就是说,avr
studio(4.10以上)+winavr+elf文件+目标板,就可以实现硬件的仿真实验吗?

这样说来是不时整个过程可以不需要iccavr了,是怎样吗?
以下为blog主人的回复:
是的.用 winavr 的avr-gcc 编译链接生成所要的 elf文件,然后用 AVR Studio 导入
elf 文件进行仿真.然后把用avr-objcopy生成的 hex
或bin文件下载到目标板就可以了.整个的开发过程并不要
iccavr的。因为其实他们做的是同样的工作。看你自己喜欢用什么了。



个人主页 | 引用 | 返回
| 删除 | 回复



发表评论:
昵称:
密码: (游客无须输入密码)
主页:
标题:






关于我们 专家加盟 希赛顾问 版权所有 &copy; 2001-2010 湘ICP备05000276号 错误报告 联系我们

AVR-GCC Makefile 中文翻译并加上我的理解--森林地带.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219