參考學習:https://www.bilibili.com/video/BV1yE411h7uQ?p=20&vd_source=432ba293ecfc949a4174ab91ccc526d6
便於bsp工程管理,將工程進行分類管理,如下圖
Makefile編譯指令碼檔案
bsp資料夾存所寫的bsp驅動
imx6ul資料夾存放imx6ull官方sdk檔案
imx6ul.lds是連結指令碼
obj資料夾存在生成的.o檔案
project存放main.c和start.S
Makefile編寫:
CROSS_COMPILE ?= arm-linux-gnueabihf- TARGET ?= bsp CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdump INCDIRS := imx6ul \ bsp/clk \ bsp/led \ bsp/delay SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay INCLUDE := $(patsubst %, -I %, $(INCDIRS)) SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) SFILENDIR := $(notdir $(SFILES)) CFILENDIR := $(notdir $(CFILES)) SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) OBJS := $(SOBJS) $(COBJS) 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 $@ $< $(COBJS) : obj/%.o : %.c $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
Makefile逐行分析:
- CROSS_COMPILE ?= arm-linux-gnueabihf-:定義了交叉編譯工具鏈的字首,預設使用 arm-linux-gnueabihf-。
- TARGET ?= bsp:定義了目標檔名為 bsp。
- CC := $(CROSS_COMPILE)gcc:定義了 C 編譯器。
- LD := $(CROSS_COMPILE)ld:定義了連結器。
- OBJCOPY := $(CROSS_COMPILE)objcopy:定義了目標檔案複製工具。
- OBJDUMP := $(CROSS_COMPILE)objdump:定義了目標檔案反彙編工具。
- INCDIRS := imx6ul \ bsp/clk \ bsp/led \ bsp/delay:定義了標頭檔案目錄。
- SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay:定義了原始檔目錄。
- INCLUDE := $(patsubst %, -I %, $(INCDIRS)):將標頭檔案目錄轉換成 -I 引數形式。
- SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)):查詢所有的彙編檔案。
- CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)):查詢所有的 C 檔案。
- SFILENDIR := $(notdir $(SFILES)):獲取彙編檔案的檔名部分。
- CFILENDIR := $(notdir $(CFILES)):獲取 C 檔案的檔名部分。
- SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)):生成彙編檔案對應的目標檔案路徑。
- COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)):生成 C 檔案對應的目標檔案路徑。
- OBJS := $(SOBJS) $(COBJS):所有目標檔案列表。
- VPATH := $(SRCDIRS):設定原始檔搜尋路徑。
- .PHONY: clean:宣告 clean 為一個偽目標。
- $(TARGET).bin : $(OBJS):生成目標檔案 $(TARGET).bin 的規則。
- $(LD) -Timx6ul.lds -o $(TARGET).elf $^:連結生成 ELF 可執行檔案。
- $(OBJCOPY) -O binary -S $(TARGET).elf $@:將 ELF 檔案轉換成二進位制檔案。
- $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis:反彙編生成 dis 檔案。
- $(SOBJS) : obj/%.o : %.S:彙編檔案編譯規則。
- $(COBJS) : obj/%.o : %.c:C 檔案編譯規則。
- clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS):清理規則,刪除生成的檔案。