亚洲精品无码AⅤ片青青在线观看_国产在线播放不卡一区二区三区_无码中文字幕视频一区二区三区_久久夜色精品亚洲av三区_国产综合欧美无毒不卡怡红院

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

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

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

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


(資料圖片)

其實(shí) 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)在我們可以跟動(dòng)作名(也被稱作目標(biāo))一起調(diào)用 make來(lái)執(zhí)行相應(yīng)的動(dòng)作:

$ make action1

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

firmware.elf:COMPILATION COMMAND .....

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

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

我們已經(jīng)準(zhǔn)備好為固件編寫(xiě) Makefile,定義一個(gè) build動(dòng)作 / 目標(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)記。?=表示這是默認(rèn)值,我們可以在命令行中覆蓋它們,像這樣:

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

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

如果我們?cè)俅芜\(yùn)行:

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

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

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

現(xiàn)在,還剩下 “燒寫(xiě)” 這個(gè)動(dòng)作 / 目標(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就會(huì)創(chuàng)建 firmware.bin文件,然后通過(guò) st-link燒入板子。當(dāng) main.c改變時(shí),這個(gè)命令也會(huì)重新構(gòu)建,因?yàn)?firmware.bin依賴 firmware.elffirmware.elf又依賴 main.c。所以我們的開(kāi)發(fā)循環(huán)就是這樣的兩步:

# Develop code in main.c$ make flash

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

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