{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "编译", "command": "make -j4 all", "problemMatcher": [] }, { "type": "shell", "label": "清理", "command": "make -j4 clean", "problemMatcher": [] }, { "type": "shell", "label": "下载", "command": "openocd", "args": [ "-f", "interface/cmsis-dap.cfg", "-f", "target/stm32f1x.cfg", "-c", "program build/led.elf verify reset exit" ], "group": "build", "problemMatcher": [] } ] }
{ "configurations": [ { "cwd": "${workspaceRoot}", "executable": "build/led.elf", "name": "Debug Microcontroller", "request": "launch", "type": "cortex-debug", "showDevDebugOutput": "none", "servertype": "openocd", "configFiles": [ "interface/cmsis-dap.cfg", "target/stm32f1x.cfg" ] } ] }
# 工程文件夹 TARGET = led # c编译生成文件夹 BUILD_DIR = build # C源文件 C_SOURCES = \ Libraries/CMSIS/core_cm3.c \ Libraries/CMSIS/system_stm32f10x.c \ Libraries/FWlib/src/misc.c \ Libraries\FWlib\src\stm32f10x_adc.c \ Libraries\FWlib\src\stm32f10x_bkp.c \ Libraries\FWlib\src\stm32f10x_can.c \ Libraries\FWlib\src\stm32f10x_cec.c \ Libraries\FWlib\src\stm32f10x_crc.c \ Libraries\FWlib\src\stm32f10x_dac.c \ Libraries\FWlib\src\stm32f10x_dbgmcu.c \ Libraries\FWlib\src\stm32f10x_dma.c \ Libraries\FWlib\src\stm32f10x_exti.c \ Libraries\FWlib\src\stm32f10x_flash.c \ Libraries\FWlib\src\stm32f10x_fsmc.c \ Libraries\FWlib\src\stm32f10x_gpio.c \ Libraries\FWlib\src\stm32f10x_i2c.c \ Libraries\FWlib\src\stm32f10x_iwdg.c \ Libraries\FWlib\src\stm32f10x_pwr.c \ Libraries\FWlib\src\stm32f10x_rcc.c \ Libraries\FWlib\src\stm32f10x_rtc.c \ Libraries\FWlib\src\stm32f10x_sdio.c \ Libraries\FWlib\src\stm32f10x_spi.c \ Libraries\FWlib\src\stm32f10x_tim.c \ Libraries\FWlib\src\stm32f10x_usart.c \ Libraries\FWlib\src\stm32f10x_wwdg.c \ User/stm32f10x_it.c \ User/main.c \ User/HARDWARE/led/bsp_led.c \ User/HARDWARE/key/bsp_key.c \ ###################################### # ASM sources #/* 工程所有需要编译的汇编文件: 指定需要编译的汇编文件名称相对路径。*/ ASM_SOURCES = Libraries/CMSIS/startup/startup_stm32f10x_hd.s ###################################### # building variables ###################################### # debug build # 编译选项:是否debug模式,如果DEBUG=1,则可以后续使用调试软件gdb等工具进行在线调试 #如果DEBUG=0,则不能支持在线调试, #且DEBUG=1,生成的文件比DEBUG=0大,因为里面包含了调试信息。 DEBUG = 1 # optimization #/* 编译选项:优化等级 #-O0:无任何优化, #-O1:1级优化, #-O2: 2级优化, #-Os: 2.5级优化, #-O3: 最高级优化。 */ OPT = -Og ####################################### # binaries ####################################### #/* 工程使用编译的类型: arm-none-eabi-是基于arm芯片开发的编译器, #none表示无操作系统,eabi表示交叉编译器,即在linux上编译嵌入式arm芯片的代码 #生成可烧写文件。*/ PREFIX = arm-none-eabi- #/* 编译器路径宏:表示arm-none-eabi-gcc在linux中调用是否需要带路径, #一般情况安装好arm-none-eabi-gcc后,系统将安装的可执行程序路径放在了系统的环境变量中, #无需要路径即可执行,所以GCC_PATH不用定义。*/ ifdef GCC_PATH CC = $(GCC_PATH)/$(PREFIX)gcc AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp CP = $(GCC_PATH)/$(PREFIX)objcopy SZ = $(GCC_PATH)/$(PREFIX)size else #/* 编译C语言文件编译器选型 :arm-none-eabi-gcc */ CC = $(PREFIX)gcc #/* 编译汇编语言文件编译器选型 :arm-none-eabi-gcc -x assembler-with-cpp #-x:表示指定编译语言的选型,包含c cpp ObJECT-C assembler go assemble-with-cpp等不用语言 */ AS = $(PREFIX)gcc -x assembler-with-cpp #/* 编译器将可执行文件elf(linux中可执行文件常见格式)转换成其他格式的工具:arm-none-eabi-objcopy */ CP = $(PREFIX)objcopy #/* 编译器计算可执行文件中存储分配的工具:arm-none-eabi-size */ SZ = $(PREFIX)size endif #/* elf文件转换成HEX文件:arm-none-eabi-objcopy -O ihex */ HEX = $(CP) -O ihex #/* elf文件转换成bin文件:arm-none-eabi-objcopy -O binary -S */ BIN = $(CP) -O binary -S ####################################### # CFLAGS ####################################### #/* 编译选型:CPU类型,只STM32芯片的内核是cortex-m3,指定该内核对应的寄存器库 */ # cpu CPU = -mcpu=cortex-m3 #/* 编译选型:FPU浮点计算器 */ # fpu # NONE for Cortex-M0/M0+/M3 # float-abi #/* 编译MCU总选项: M3内核,精简指令集mthumb , 浮点运算 ,浮点计算采用硬件浮点计算器 */ # mcu MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) #/* 汇编编译宏定义:该Makefile宏定义将在汇编代码中有效 */ # macros for gcc # AS defines AS_DEFS = #/* C文件编译宏定义:该Makefile宏定义将在C代码中有效,\符号表示Makefile同1条指令换行 */ # C defines宏定义标志 C_DEFS = \ -DUSE_STDPERIPH_DRIVER \ -DSTM32F10X_HD # AS includes /* 汇编头文件路径:编译过程中文件内的头文件搜索路径 */ AS_INCLUDES = #/* C文件的头文件路径:编译过程中文件内的头文件搜索路径 */ # C includesC头文件路径 C_INCLUDES = \ -ILibraries/CMSIS \ -ILibraries/FWlib/inc \ -IUser \ -IUser/HARDWARE/led \ -IUser/HARDWARE/key # compile gcc flags #/* 汇编编译选型:s汇编文件编译成Obj文件需要的设置选项 */ ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections #/* C编译选型:C文件编译成Obj文件需要的设置选项 */ CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections #/* Debug模式下的C编译选型:仅仅在开启DEBUG模式下有效 */ ifeq ($(DEBUG), 1) CFLAGS += -g -gdwarf-2 endif # Generate dependency information CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" ####################################### # LDFLAGS ####################################### # link script 链接配置文件 #/* 可执行文件链接脚本: stm32_flash.ld #文件中详细给出了芯片的RAM和ROM片区分类区间与大小, #代码、全局变量、常数、堆栈等的分配区间。*/ LDSCRIPT = Libraries/CMSIS/startup/linker/stm32_flash.ld # libraries #LIBS = -lc -lm -lnosys #/* 编译选型: 依赖的标准库*/ LIBS = -lc #/* 编译选型: 依赖的指定路径库,.a库文件(window中的lib文件需要转换成.a文件才能识别)*/ LIBDIR = #/* 链接工具的总选项: #MCU 芯片类型, #-specs=nano.specs 精简版C库 , #-T$(LDSCRIPT)依赖的可执行文件链接脚本, #$(LIBDIR) 标准库文件 , $(LIBS) 指定库文件 , #-Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref 生成map文件 , #-Wl,--gc-sections 链接使用的分段方式,需要配合C文件/汇编生成obj的时候同样选型分段方式,好处是链接的时候源文件中的未使用变量和未调用函数将不会被链接到elf文件中,最终可执行文件elf会很精简。 #*/ LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections #LDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections # default action: build all /* Makefile总目标: 这是伪目标,在第一依赖关系位置,输入make指令时必定指令该目标 #可执行文件elf , hex 和 bin 是arm的常用烧写文件 。*/ all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin ####################################### # build the application ####################################### # list of objects #/* 将所有C文件获取OBJ文件: 将待编译的所有C文件生成OBJ文件集 #$(notdir $(C_SOURCES:.c=.o)):将源文件集中所有c文件的后缀替换成o文件,并去除所有路径信息, #addprefix函数 :将无路径的o文件集(字符串)添加制定路径前缀信息,生成最终的目标obj文件的路径和名称集合。*/ OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) #/* 指定C文件的搜索路径: $(sort $(dir $(C_SOURCES))) #$(dir $(C_SOURCES)):所有源文件只保留文件路径, #sort:对所有路径排序 ,‘d g a’ -> 'a d g' */ vpath %.c $(sort $(dir $(C_SOURCES))) # list of ASM program objects #/* 将所有汇编文件获取OBJ文件: 将待编译的所有汇编文件生成OBJ文件集 #$(notdir $(ASM_SOURCES:.s=.o)) :将源文件集中所有编译文件后缀替换成o文件,并去除所有路径信息, #addprefix函数 :将无路径的o文件集(字符串)添加制定路径前缀信息,生成最终的目标obj文件的路径和名称集合。*/ OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) #/* 指定汇编文件的搜索路径: $(sort $(dir $(ASM_SOURCES))) #$(dir $(C_SOURCES)):所有汇编文件只保留文件路径, #sort:对所有路径排序 ,‘d g a’ -> 'a d g' */ vpath %.s $(sort $(dir $(ASM_SOURCES))) #/* 通配符指定所有c文件编译成OBJ文件: #$(BUILD_DIR)/%.o: 生成OBJ文件的路径固定不变,在BUILD_DIR文件夹, #%.c:依赖源文件C文件,地址未指定,Makefile将在本地目录和vpath %c目录下搜索源文件, #Makefile :Makefile文件自己也是生成obj文件的依赖文件,Makefile文件变化时会重新编译, #| $(BUILD_DIR): 竖线坐标的依赖文件是正常依赖文件,竖线右边的依赖文件是命令提前的依赖文件,即BUILD_DIR会自动执行,编译生成OBJ前生成build文件夹。 #-Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)):生成临时中间文件 #-c:仅编译不链接 [ DISCUZ_CODE_15 ]lt;:第一个依赖文件即C文件 $[url=home.php?mod=space&uid=72445]@[/url] 目标文件 */ $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) [ DISCUZ_CODE_15 ]lt; -o $@ #/* 通配符指定所有汇编文件编译成OBJ文件: #$(BUILD_DIR)/%.o: 生成OBJ文件的路径固定不变,在BUILD_DIR文件夹, #%.c:依赖源文件C文件,地址未指定,Makefile将在本地目录和vpath %c目录下搜索源文件, #Makefile :Makefile文件自己也是生成obj文件的依赖文件,Makefile文件变化时会重新编译, #| $(BUILD_DIR): 竖线坐标的依赖文件是正常依赖文件,竖线右边的依赖文件是命令提前的依赖文件, #-c:仅编译不链接 [ DISCUZ_CODE_15 ]lt;:第一个依赖文件即C文件 $[url=home.php?mod=space&uid=72445]@[/url] 目标文件 */ $(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) $(AS) -c $(CFLAGS) [ DISCUZ_CODE_15 ]lt; -o $@ #/* 生成可执行文件ELF文件:依赖于所有OBJ文件 #$(CC) $(OBJECTS) $(LDFLAGS) -o $@:生成elf文件 #$(SZ) $@:计算和打印elf文件的存储分配信息 。*/ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile $(CC) $(OBJECTS) $(LDFLAGS) -o $@ $(SZ) $@ #/* 生成HEX文件:依赖于elf文件和build文件夹,build文件:优先于目标,直接执行*/ $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(HEX) [ DISCUZ_CODE_15 ]lt; $@ #/* 生成BIN文件:依赖于elf文件和build文件夹,build文件:优先于目标,直接执行*/ $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(BIN) [ DISCUZ_CODE_15 ]lt; $@ #/* 生成build文件夹:伪指令通过上面的优先依赖关系生成。*/ $(BUILD_DIR): mkdir $@ ####################################### # clean up /* 清除编译结果:将build文件中所有文件和子文件夹删除。*/ ####################################### clean: -rm -fR $(BUILD_DIR) ####################################### # dependencies ####################################### #/* 添加所有.d依赖文件:include 添加其他makefile文件 #-include 表示如果无d文件不报错继续执行makefile命令, #wildcard函数:表示在函数中让通配符生效,即在include 选型中让‘*’生效,搜索到build文件中所有d文件。 #最终生成所有c文件的依赖关系, #make工具将依赖关系与上面定义的 %.o:%.c makefile 显性目标关系合并, #make工具将合并后的执行。*/ -include $(wildcard $(BUILD_DIR)/*.d) # *** EOF ***
使用特权
yangjiaxu 发表于 2022-7-31 11:38 vscode开发ST的时候,挺简单的,可以把VScode当成编辑器使用,然后用keil或者IAR当成编译器。如果要是自己 ...
发表回复 本版积分规则 回帖后跳转到最后一页
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号