博客介紹
硬件:正點原子linux開發板IM6ULL
開發環境:Ubuntu下的VSCode
功能:使用VSCode對文件使用工程管理方式
參考:正點原子linux
聲明:以下僅爲個人學習認知。如有錯誤,希望提出建議。
爲何使用工程管理模式
對於較大的項目,如果所有文件都放在一個目錄下,那麼工程的可讀性就會很差。爲了提高項目的管理和文件的處理可以使用將相同文件屬性放在同一個文件夾下。
BSP工程管理的目的就是將相同屬性的文件放置在同一文件內,這樣可以通過文件夾知道文件屬性。
使用VSCode代碼管理工具
本例程使用的是VSCod代碼管理工具,VSCode代碼管理工具默認是將工程所在文件夾下的所有文件添加到本項目,對於使用多文件夾存放項目的方式,在VSCode代碼管理工具是不會進行添加其他文件的,對於VSCode如何爲項目添加其他文件夾步驟如下:
1. 創建工作區
打開文件夾
選擇需要創建的文件夾
將工作區另存爲
項目創建成功後自動會在工作區下創建一個 xxxx.code-workspace 文件
2. 添加項目文件夾
打開c_cpp_properties.jsib 文件
1)使用快捷鍵:Ctrl+Shift+P
2)在搜索欄輸入:C/C++:Edit
3)點擊 C/C++:編輯配置(U)
添加項目文件夾,在"includePath": ["${workspaceFolder}/**" ] 中添加相對於與當前工作區的文件夾目錄。
Makefile 文件的編寫
Makefile是一個逆向編寫步驟,首先需要考慮的是你最終需要什麼文件,那不這個文件又是什麼文件派生出來的呢,實際上Makefile文件就只這樣一個反向推導的過程。
就以下面的一個歷程爲例:
需求:生成目標文件 ledc.bin
現有文件:當前工作目錄下的所有.S、.c、.h
多文件夾 Makefile文件編寫步驟:
- 獲取所有頭文件所在文件夾路徑;
獲取所有源碼文件所在問價夾路徑 - 依據所頭文件所在文件夾路徑, 向頭文件所有路徑前面添加 -I
- 依據所有源碼文件的文件夾路徑進行獲取所有源碼文件路徑加源碼源碼文件名;
- 依據第3進行將 所有源碼文件轉換爲所要生成的目標文件名;
- 依據所有目標文件名進行進行對依賴文件編譯;
- 將所有目標文件鏈接爲一個最終目標文件。
項目工作目錄
Makefile文件
CROSS_COMPILE ?= arm-linux-gnueabihf- #定義交叉編譯鏈
TARGET ?= ledc #創建目標文件名變量
CC := $(CROSS_COMPILE)gcc #LD 簡寫交叉編譯變量
LD := $(CROSS_COMPILE)ld #LD 簡寫鏈接變量
OBJCOPY := $(CROSS_COMPILE)objcopy #OBJCOPY 簡寫格式轉換編譯鏈
OBJDUMP := $(CROSS_COMPILE)objdump #OBJcopy 簡寫格式反彙編變量
INCDIRS := project \ #定義包含所有 頭文件(.h) 文件夾路徑 變量
imx6u \
bsp/clk \
bsp/led \
bsp/delay
SRCDIRS := project \ #定義包含所有 源碼文件(.S、.c) 文件夾路徑 變量
bsp/clk \
bsp/led \
bsp/delay
INCLUDE := $(patsubst %, -I %, $(INCDIRS)) #在所有 頭文件(.h) 文件路徑前 添加 -I 作用,在使用在使用gcc編譯的時候作爲連接文件倫將
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) #獲取所有源碼文件夾路徑下的 .S 文件名 幷包含問價夾路徑
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) #獲取所有源碼文件夾路徑下的 .c 文件名 幷包含問價夾路徑
SFILENDIR := $(notdir $(SFILES)) # 將變量名 SFILES 中所有的文件夾路徑去掉, 只保留文件名 .S
CFILENDIR := $(notdir $(CFILES)) # 將變量名 CFILES 中所有的文件夾路徑去掉, 只保留文件名 .c
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) #將變量 SFILENDIR 中所有包含 .S 的字符串轉換爲 .o
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) #將變量 SFILENDIR 中所有包含 .c 的字符串轉換爲 .o
OBJS := $(SOBJS) $(COBJS) #獲取所有 .o文件名
VPATH := $(SRCDIRS) #將Makefile文件執行所有源碼文件路徑
.PHONY: clean #清楚文件
$(TARGET).bin : $(OBJS)
$(LD) -Timx6u.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 $@ #將所有.S文件編譯爲.o文件
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) $< -o $@ #將所有.S文件編譯爲.o文件
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS) #清除項目編譯文件