文件过多,工程复杂
将文件分开存放,结构清晰
注:imu6ul.h仅起到包含imx6ul其它库函数的作用,而被各个bsp的头文件调用
obj用来存放编译后生成的.o中间文件
Makefile
#编译器名CROSS_COMPILE ?= arm-linux-gnueabihf-#目标名TARGET ?= bsp#编译流程名CC := $(CROSS_COMPILE)gccLD := $(CROSS_COMPILE)ldOBJCOPY := $(CROSS_COMPILE)objcopyOBJDUMP := $(CROSS_COMPILE)objdump#头文件路径集合 “\”换行INCDIRS := imx6ul \bsp/clk \bsp/led \bsp/delay#源文件路径集合(.c/.S)SRCDIRS := project \bsp/clk \bsp/led \bsp/delay#使用patsubst函数,给变量INCDIRS添加一个"-I"#加“I”是因为Makefile语法要求指明头文件目录的时候需要加上“-I”INCLUDE := $(patsubst %, -I %, $(INCDIRS))#SFILES保存工程中所有.S汇编文件(包含绝对路径)#变量SRCDIRS已经存放了工程中所有的.S和.c文件,仅需要挑出.S即可#借助了函数foreach和wildcard#最终SFILES := project/start.SSFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))#CFILES保存工程中所有.c汇编文件(包含绝对路径)#变量SRCDIRS已经存放了工程中所有的.S和.c文件,仅需要挑出.c即可#借助了函数foreach和wildcard#最终CFILES := project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.cCFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))#去掉了SFILES和CFILES的路径部分,仅保留了文件名SFILENDIR := $(notdir $(SFILES))CFILENDIR := $(notdir $(CFILES))#变量SOBJS和COBJS是.S和.c文件编译以后对应的.o文件目录#SOBJS = obj/start.o#COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.oSOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))OBJS := $(SOBJS) $(COBJS)#VPATH 指定搜索目录,当编译的时候所需的.S和.c文件会在SRCDIRS中指定的目录中查找VPATH := $(SRCDIRS).PHONY: clean$(TARGET).bin : $(OBJS)$(LD) -Timx6ul.lds -o $(TARGET).elf $^#$^ 所有依赖文件的集合$(OBJCOPY) -O binary -S $(TARGET).elf $@#$@ 所有目标的集合$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis$(SOBJS) : obj/%.o : %.S$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<#$< 依赖文件集合中的第一个文件,如果依赖文件是以模式%定义的,那么$<就是一系列符合模式的文件集合#-Wall 使GCC产生尽可能多的警告信息#-c 只编译,不链接成可执行文件,通常用于编译不含主程序的子程序#-O2 比-O更好的优化编译、链接$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<clean:rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)





编译烧录流程同之前一样
