1. 程式人生 > 其它 >bsp工程管理

bsp工程管理

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)

主要是給自己看的,所以肯定會出現很多錯誤哈哈哈哈哈