bsp工程管理
阿新 • • 發佈:2021-11-18
1. bsp工程管理的目的
模組化專案,使得專案清晰
2. 程式碼
拷貝原來工程
建立資料夾
- bsp就是工程驅動檔案
- imx6ull是和晶片有關的檔案
- obj是生成檔案的資料夾
- project 工程檔案 start.s main.c
建立對應的驅動檔案
和上一節一樣的驅動檔案
主要是給自己看的,所以肯定會出現很多錯誤哈哈哈哈哈# ?= 沒有賦值的話就賦值 CROSS_COMPILE ?= arm-linux-gnueabihf- TARGET ?= bsp # :=覆蓋之前的值 GCC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdump # INCDIRS 包含整個工程的.h 標頭檔案目錄 \是換行符 INCDIRS := imx6ull \ bsp/clk \ bsp/led \ bsp/delay # SRCDIRS 包含整個工程的.s .c檔案目錄 SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay # patsubst的作用是給INCDIRS中的每個目錄前面加一個 -I,指明標頭檔案目錄時必須加 # -I imx6ull -I bsp/clk -I bsp/led -I bsp/delay INCLUDE := $(patsubst %, -I %, $(INCDIRS)) # foreach dir對每個dir都執行一次,SRCDIRS中dir, 即上面的資料夾 # wildcard 取出資料夾內所有檔案 # 比如bsp/clk/bsp_clk.c SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) # notdir 上面取出來之後去掉目錄 SFILENDIR := $(notdir $(SFILES)) CFILENDIR := $(notdir $(CFILES)) # 把所有的.s和.c都變成點o檔案,並在前面加上obj 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 # -Wall 編譯後顯示所有警告 # -nostdlib 不連線系統標準啟動檔案和標準庫檔案,只把指定的檔案傳遞給聯結器。 # 這個選項常用於編譯核心、bootloader等程式,它們不需要啟動檔案、標準庫檔案 # -O2 是比O1更高階的選項,進行更多的優化。 # Gcc將執行幾乎所有的不包含時間和空間折中的優化。 # 當設定O2選項時,編譯器並不進行迴圈開啟()loop unrolling以及函式內聯。 # 與O1比較而言,O2優化增加了編譯時間的基礎上,提高了生成程式碼的執行效率。 # 這樣還能帶著.h檔案一起編譯 $(SOBJS) : obj/%.o : %.S $(GCC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< $(COBJS) : obj/%.o : %.c $(GCC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)