baremetal bsp工程管理

lethe1203發表於2024-03-16
參考學習:https://www.bilibili.com/video/BV1yE411h7uQ?p=20&vd_source=432ba293ecfc949a4174ab91ccc526d6
便於bsp工程管理,將工程進行分類管理,如下圖
0
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逐行分析:
  1. CROSS_COMPILE ?= arm-linux-gnueabihf-:定義了交叉編譯工具鏈的字首,預設使用 arm-linux-gnueabihf-。
  2. TARGET ?= bsp:定義了目標檔名為 bsp。
  3. CC := $(CROSS_COMPILE)gcc:定義了 C 編譯器。
  4. LD := $(CROSS_COMPILE)ld:定義了連結器。
  5. OBJCOPY := $(CROSS_COMPILE)objcopy:定義了目標檔案複製工具。
  6. OBJDUMP := $(CROSS_COMPILE)objdump:定義了目標檔案反彙編工具。
  7. INCDIRS := imx6ul \ bsp/clk \ bsp/led \ bsp/delay:定義了標頭檔案目錄。
  8. SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay:定義了原始檔目錄。
  9. INCLUDE := $(patsubst %, -I %, $(INCDIRS)):將標頭檔案目錄轉換成 -I 引數形式。
  10. SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)):查詢所有的彙編檔案。
  11. CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)):查詢所有的 C 檔案。
  12. SFILENDIR := $(notdir $(SFILES)):獲取彙編檔案的檔名部分。
  13. CFILENDIR := $(notdir $(CFILES)):獲取 C 檔案的檔名部分。
  14. SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)):生成彙編檔案對應的目標檔案路徑。
  15. COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)):生成 C 檔案對應的目標檔案路徑。
  16. OBJS := $(SOBJS) $(COBJS):所有目標檔案列表。
  17. VPATH := $(SRCDIRS):設定原始檔搜尋路徑。
  18. .PHONY: clean:宣告 clean 為一個偽目標。
  19. $(TARGET).bin : $(OBJS):生成目標檔案 $(TARGET).bin 的規則。
  20. $(LD) -Timx6ul.lds -o $(TARGET).elf $^:連結生成 ELF 可執行檔案。
  21. $(OBJCOPY) -O binary -S $(TARGET).elf $@:將 ELF 檔案轉換成二進位制檔案。
  22. $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis:反彙編生成 dis 檔案。
  23. $(SOBJS) : obj/%.o : %.S:彙編檔案編譯規則。
  24. $(COBJS) : obj/%.o : %.c:C 檔案編譯規則。
  25. clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS):清理規則,刪除生成的檔案。

相關文章