适用于cortex-m3系列CPU的工程,操作系统为windows环境,交叉编译器Sourcery g++,方便修改
1 # *****文件目录配置******* 2 3 #交叉编译器系统路径 4 TOOL_CHAIN_DIR=C:/Program Files/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/ 5 6 #输出目录 7 OUTDIR=Debug 8 9 #链接文件 10 LD_SCRIPT=stm32_rom.ld 11 12 #用户自定义头文件目录 13 EXTRA_INC= -Iboard 14 EXTRA_INC+= -Iboard/STM32F10x_StdPeriph_Driver/inc 15 EXTRA_INC+= -Icpu 16 EXTRA_INC+= -Iinclude/k_inc 17 EXTRA_INC+= -IApp 18 19 20 # ***** CPU信息 ****** 21 MCU=cortex-m3 22 CHIP=STM32F103 23 BOARD=FMC 24 25 # *****编译器相关命令配置******* 26 27 # 编译器前缀 28 TCHAIN_PREFIX=arm-none-eabi- 29 30 # 删除文件命令 windows环境 31 REMOVE_CMD=del 32 33 # 编译器 34 CC = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)gcc 35 CPP = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)g++ 36 AR = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)ar 37 OBJCOPY = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)objcopy 38 OBJDUMP = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)objdump 39 SIZE = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)size 40 NM = $(TOOL_CHAIN_DIR)$(TCHAIN_PREFIX)nm 41 REMOVE = $(REMOVE_CMD) /q 42 43 44 # *******生成工程配置信息********* 45 46 # 目标文件前缀名 47 TARGET=FMCOS 48 49 # 目标文件格式 50 TARGET_FORMAT=ihex 51 52 # 警告信息 53 USE_WARNING=yes 54 55 # 优化级别 56 OPT=0 57 58 # 用户自定义宏 59 USER_DEFINE=STM32F10X_HD 60 USER_DEFINE1=USE_STDPERIPH_DRIVER 61 62 # 工程源码文件配置 63 64 # .C源码文件 65 CSRCS=$(wildcard board/*.c) $(wildcard board/STM32F10x_StdPeriph_Driver/src/*.c) $(wildcard cpu/*.c) $(wildcard kernel/*.c) 66 CSRCS+= $(wildcard App/*.c) 67 68 # .S汇编文件 69 ASRCS=$(wildcard board/*.S) $(wildcard cpu/*.S) 70 71 # *********相关编译选项********** 72 73 # thumb格式 74 THUMB=-mthumb 75 76 # C 优化级别配置 77 CFLAGS= -O$(OPT) 78 # CPU 79 CFLAGS+= -mcpu=$(MCU) 80 # 用户预定义宏 81 CFLAGS+= -D$(USER_DEFINE) -D$(USER_DEFINE1) 82 # 用户头文件目录 83 CFLAGS+= $(EXTRA_INC) 84 85 #警告信息 86 # ifeq($(USE_WARNING),yes) 87 CFLAGS+= -Wall 88 #endif 89 90 # -Wa,-adhlns传递参数给汇编器,生成汇编信息列表文件 91 # addprefix 函数 添加前缀 notdir 函数 去除名称中的路径 92 # addsuffix 函数 添加后缀 basename 去掉文件名中的后缀 93 # < 临时变量 表示一组文件 94 # ex. pdir/cdir/foo.c 执行后变为 outdir/foo.lst 95 CFLAGS+= -Wa,-adhlns=$(addprefix $(OUTDIR)/, $(notdir $(addsuffix .lst, $(basename $<)))) 96 97 # -MD 生成当前编译文件关联的详细信息,包括目标文件依赖的所有代码源码文件以及头文件,但是输出信息保存到.d 98 # 件中 99 # -MP 除了主文件外,为每个依赖文件增加一个伪目标,这个伪目标不依赖任何文件.可以避免在删除了头文件, 100 # 但是没有相应的更新Makefile文件时 make 错误 101 # -MF 设置输出的信息文件名称? 102 # $@ 为规则中的目标文件集 $^为规则中的依赖文件集 $<为规则中的第一个依赖文件 103 # $(@F) 不带路径名的目标文件 $(@D) 目标文件中的路径 104 # ps.请手动在OUTDIR下创建dep文件夹 105 CFLAGS+= -MD -MP -MF $(OUTDIR)/dep/$(@F).d 106 # 调试 107 CFLAGS+= -g3 -gdwarf-2 108 109 110 ASFLAGS= -x assembler-with-cpp $(CFLAGS) #汇编flags 111 112 # 链接 -Map 生成map文件 113 LDFLAGS = -Wl,-Map=$(OUTDIR)/$(TARGET).map 114 # 链接脚本文件 115 LDFLAGS += -T$(LD_SCRIPT) 116 117 # ************输出消息定义******************* 118 MSG_ERRORS_NONE = Errors: none 119 MSG_BEGIN = "-------- begin (mode: TEST) --------" 120 MSG_END = "-------- end --------" 121 MSG_SIZE_BEFORE = Size before: 122 MSG_SIZE_AFTER = Size after build: 123 MSG_LOAD_FILE = Creating load file: 124 MSG_EXTENDED_LISTING = Creating Extended Listing/Disassembly: 125 MSG_SYMBOL_TABLE = Creating Symbol Table: 126 MSG_LINKING = "**** Linking :" 127 MSG_COMPILING = "**** Compiling C :" 128 MSG_COMPILING_ARM = "**** Compiling C (ARM-only):" 129 MSG_COMPILINGCPP = "Compiling C++ :" 130 MSG_COMPILINGCPP_ARM = "Compiling C++ (ARM-only):" 131 MSG_ASSEMBLING = "**** Assembling:" 132 MSG_ASSEMBLING_ARM = "****Assembling (ARM-only):" 133 MSG_CLEANING = Cleaning project: 134 MSG_FORMATERROR = Can not handle output-format 135 MSG_LPC21_RESETREMINDER = You may have to bring the target in bootloader-mode now. 136 MSG_ASMFROMC = "Creating asm-File from C-Source:" 137 MSG_ASMFROMC_ARM = "Creating asm-File from C-Source (ARM-only):" 138 139 140 ALLSRC=$(CSRCS) $(ASRCS) # 所有代码文件详细的名称 141 ALLSRCBASE = $(notdir $(basename $(ALLSRC))) #去除了路径及后缀的所有文件名 142 143 144 ALLSRCBASE = $(notdir $(basename $(ALLSRC))) 145 146 # Define all object files. 147 ALLOBJ = $(addprefix $(OUTDIR)/, $(addsuffix .o, $(ALLSRCBASE))) 148 149 # Define all listing files (used for make clean). 150 LSTFILES = $(addprefix $(OUTDIR)/, $(addsuffix .lst, $(ALLSRCBASE))) 151 # Define all depedency-files (used for make clean). 152 DEPFILES = $(addprefix $(OUTDIR)/dep/, $(addsuffix .o.d, $(ALLSRCBASE))) 153 154 elf: $(OUTDIR)/$(TARGET).elf 155 lss: $(OUTDIR)/$(TARGET).lss 156 sym: $(OUTDIR)/$(TARGET).sym 157 hex: $(OUTDIR)/$(TARGET).hex 158 bin: $(OUTDIR)/$(TARGET).bin 159 160 # Default target 161 all: begin gccversion build sizeafter end 162 163 ifeq ($(TARGET_FORMAT),ihex) 164 build: elf hex lss sym 165 else 166 ifeq ($(TARGET_FORMAT),binary) 167 build: elf bin lss sym 168 else 169 ifeq ($(TARGET_FORMAT),both) 170 build: elf hex bin lss sym 171 else 172 $(error "$(MSG_FORMATERROR) $(TARGET_FORMAT)") 173 endif 174 endif 175 endif 176 177 178 # Eye candy. 179 begin: 180 @echo $(MSG_BEGIN) 181 @echo $(ALLOBJ) 182 183 end: 184 @echo $(MSG_END) 185 ELFSIZE = $(SIZE) -A $(OUTDIR)/$(TARGET).elf 186 187 sizeafter: 188 @echo $(MSG_SIZE_AFTER) 189 $(ELFSIZE) 190 191 # Display compiler version information. 192 gccversion : 193 @$(CC) --version 194 @echo $(ALLOBJ) 195 196 197 # Create final output file (.hex) from ELF output file. 198 %.hex: %.elf 199 @echo $(MSG_LOAD_FILE) $@ 200 $(OBJCOPY) -O ihex $< $@ 201 202 # Create final output file (.bin) from ELF output file. 203 %.bin: %.elf 204 @echo $(MSG_LOAD_FILE) $@ 205 $(OBJCOPY) -O binary $< $@ 206 207 # Create extended listing file/disassambly from ELF output file. 208 # using objdump testing: option -C 209 %.lss: %.elf 210 @echo $(MSG_EXTENDED_LISTING) $@ 211 $(OBJDUMP) -h -S -C -r $< > $@ 212 213 # Create a symbol table from ELF output file. 214 %.sym: %.elf 215 @echo $(MSG_SYMBOL_TABLE) $@ 216 $(NM) -n $< > $@ 217 218 # Link: create ELF output file from object files. 219 .SECONDARY : $(TARGET).elf 220 .PRECIOUS : $(ALLOBJ) 221 %.elf: $(ALLOBJ) 222 @echo $(MSG_LINKING) $@ 223 $(CC) $(THUMB) $(CFLAGS) $(ALLOBJ) --output $@ $(LDFLAGS) 224 225 226 227 # Assemble: create object files from assembler source files. 228 define ASSEMBLE_TEMPLATE 229 $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) 230 @echo $(MSG_ASSEMBLING) $$< "->" $$@ 231 $(CC) -c $(THUMB) $$(ASFLAGS) $$< -o $$@ 232 endef 233 $(foreach src, $(ASRCS), $(eval $(call ASSEMBLE_TEMPLATE, $(src)))) 234 235 # Compile: create object files from C source files. 236 # 函数 生成.C的所有.O文件 237 define COMPILE_C_TEMPLATE 238 $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) 239 @echo $(MSG_COMPILING) $$< "->" $$@ 240 $(CC) -c $(THUMB) $$(CFLAGS) $$< -o $$@ 241 endef 242 $(foreach src, $(CSRCS), $(eval $(call COMPILE_C_TEMPLATE, $(src)))) 243 244 245 # Compile: create assembler files from C source files. ARM/Thumb 246 # 函数 生成汇编文件 247 $(SRC:.c=.s) : %.s : %.c 248 @echo $(MSG_ASMFROMC) $< to $@ 249 $(CC) $(THUMB) -S $(CFLAGS) $< -o $@ 250 251 # Target: clean project. 252 clean: begin clean_list end 253 254 clean_list : 255 ## @echo 256 @echo $(MSG_CLEANING) 257 $(REMOVE) $(OUTDIR)$(TARGET).map 258 $(REMOVE) $(OUTDIR)$(TARGET).elf 259 $(REMOVE) $(OUTDIR)$(TARGET).hex 260 $(REMOVE) $(OUTDIR)$(TARGET).bin 261 $(REMOVE) $(OUTDIR)$(TARGET).sym 262 $(REMOVE) $(OUTDIR)$(TARGET).lss 263 $(REMOVE) $(OUTDIR)*.* 264 $(REMOVE) $(LSTFILES) 265 $(REMOVE) $(DEPFILES) 266 $(REMOVE) $(SRC:.c=.s) 267 268 269 # Create output files directory 270 $(shell mkdir $(OUTDIR) 2>/dev/null) 271 #$(shell mkdir $(OUTDIR) 2>NUL) 272 273 # Include the dependency files. 274 -include $(shell mkdir $(OUTDIR)/dep 2>/dev/null) $(wildcard $(OUTDIR)/dep/*) 275 #-include $(shell mkdir $(OUTDIR)/dep 2>NUL) $(wildcard $(OUTDIR)/dep/*) 276 277 278 # Listing of phony targets. 279 .PHONY : all begin finish end sizebefore sizeafter gccversion 280 build elf hex bin lss sym clean clean_list program