日本JAZZ亚洲护士在线观看_亚欧成人中文字幕一区_码亚洲中文无码av在线_日本熟妇xxxxx乱_国产成人精品三级麻豆

?
投資 干貨 消費 評論 學(xué)院 滾動
風(fēng)投 科技 創(chuàng)業(yè) 業(yè)內(nèi) 要聞
每日熱點:STM32裸機編程的基礎(chǔ)知識(4)
發(fā)布日期: 2023-06-28 16:29:39 來源: FunIO

Makefile:構(gòu)建自動化

我們可以用 make命令行工具替代手動敲入 “編譯”、“鏈接”、“燒寫” 這些命令,自動完成整個過程。make工具使用一個名為 Makefile的配置文件,從中讀取執(zhí)行動作的指令。這種自動化方式非常棒,因為這樣可以把構(gòu)建固件的過程、使用了哪些編譯標(biāo)記等也文檔化。

在 https://makefiletutorial.com 上有一個非常好的給初學(xué)者的 Makefile 教程,強烈建議看一下。下面我將列出一些非常必要的概念以理解我們所使用的 Makefile。對于已經(jīng)很熟悉 make的朋友,可以跳過這一部分。


(資料圖片)

其實 Makefile的格式并不復(fù)雜:

action1:command ...     # Comments cango after hash symbolcommand ....    # IMPORTANT: command must be preceded with the TAB characteraction2:command ...     # Don"t forget about TAB. Spaces won"t work!

現(xiàn)在我們可以跟動作名(也被稱作目標(biāo))一起調(diào)用 make來執(zhí)行相應(yīng)的動作:

$ make action1

當(dāng)然,也可以在命令中定義和使用變量,動作也可以是需要創(chuàng)建的文件名:

firmware.elf:COMPILATION COMMAND .....

任何動作都可以有一個依賴列表。例如,firmware.elf依賴源文件 main.c,當(dāng) main.c改變時,make build就會重新構(gòu)建 firmware.elf:

build: firmware.elffirmware.elf: main.cCOMPILATION COMMAND

我們已經(jīng)準(zhǔn)備好為固件編寫 Makefile,定義一個 build動作 / 目標(biāo):

CFLAGS  ?=  -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -Wformat-truncation -fno-common -Wconversion -g3 -Os -ffunction-sections -fdata-sections -I. -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 $(EXTRA_CFLAGS)LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.mapSOURCES = main.cbuild: firmware.elffirmware.elf: $(SOURCES)arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@

在這里我們定義了一些編譯標(biāo)記。?=表示這是默認值,我們可以在命令行中覆蓋它們,像這樣:

$ make build CFLAGS="-O2 ...."

上面的 Makefile文件中定義了 CFLAGSLDFLAGS、SOURCES變量,然后我們告訴 make,當(dāng)要 build時創(chuàng)建 firmware.elf文件,它依賴 main.c文件,使用 arm-none-eabi-gcc編譯器和給定的編譯標(biāo)記生成它。$@特殊變量會被展開成動作 / 目標(biāo)名,在這個例子中是 firmware.elf。

現(xiàn)在調(diào)用 make試一下:

$ make buildarm-none-eabi-gcc main.c  -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -Wformat-truncation -fno-common -Wconversion -g3 -Os -ffunction-sections -fdata-sections -I. -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16  -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=firmware.elf.map -o firmware.elf

如果我們再次運行:

$ make buildmake: Nothing to be done for `build".

make會檢查 firmware.elf和依賴項 main.c的修改時間,如果是它們是最新的,則什么都不做。如果我們修改下 main.c,則會重新構(gòu)建:

$ touch main.c # Simulate changes in main.c$ make build

現(xiàn)在,還剩下 “燒寫” 這個動作 / 目標(biāo):

firmware.bin: firmware.elfarm-none-eabi-objcopy -O binary $<  $@flash: firmware.binst-flash --reset write $(TARGET).bin 0x8000000

OK,現(xiàn)在從終端中執(zhí)行命令 make flash就會創(chuàng)建 firmware.bin文件,然后通過 st-link燒入板子。當(dāng) main.c改變時,這個命令也會重新構(gòu)建,因為 firmware.bin依賴 firmware.elf,firmware.elf又依賴 main.c。所以我們的開發(fā)循環(huán)就是這樣的兩步:

# Develop code in main.c$ make flash

還有一個良好實踐就是在 Makefile中添加 clean動作,以刪除構(gòu)建生成的文件:

clean:rm -rffirmware.*
								
關(guān)鍵詞:
24小時熱點 精彩推薦
資訊新聞
?