AliOS Things Mqtt 啟動(dòng)分析 -- 1

1宛官,工程構(gòu)建

參見:https://github.com/alibaba/AliOS-Things/wiki/AliOS-Things-build-system

注意最新的AliOS Things 3.0版本如果使用VSCode IDE編譯葫松,需要安裝AliOS Studio插件和aos-cube。

當(dāng)在VSCODE中執(zhí)行AliOS-Studio:Build的時(shí)候底洗,會(huì)調(diào)用aos make app@board腋么,比如這里我選擇mqtt@stm32f429zi-nucleo,則會(huì)調(diào)用aos make mqtt@stm32f429zi-nucleo.

下面我們分析一下具體都做了什么。

1)亥揖,調(diào)用關(guān)系:

aos make helloworld@linuxhost

????|--?make()

????????|--?make_build()

????????????|--?_run_make(arg_list)

????????????????|--?popen(make_cmd_str,?shell=True,?cwd=os.getcwd())


2)./build/Makefile

變量的值:build_dir = 'BUILD_DIR=./out/'app_dir = 'APPDIR=./'make_args = helloworld@linuxhostarg_list = ['-e', '-f build/Makefile', make_args, app_dir, build_dir]make_cmd = ./build/cmd/linux64/makemake_cmd_str = make_cmd + 'HOST_OS=Linux64' + 'TOOLS_ROOT=./build' + + list(arg_list)

其中珊擂,popen是Python的標(biāo)準(zhǔn)庫中的subprocess包的類,用來fork一個(gè)子進(jìn)程并運(yùn)行一個(gè)外部程序,進(jìn)入 ./build/Makefile

3)Makefile中最主要的是aos_target_config.mk,定義了構(gòu)建關(guān)系摧扇。

由aos_target_config.mk生成所有組件的config.mk(包含組件源文件以來關(guān)系等信息)圣贸,然后在編譯、鏈接的時(shí)候由aos_target_build.mk依次調(diào)用扳剿,最終生成./out里面的可執(zhí)行文件旁趟。

config.mk依賴于aos_target_config.mk來生成:

$(OUTPUT_DIR)/config.mk:?$(MAKEFILES_PATH)/aos_target_config.mk $(MAKEFILES_PATH)/aos_host_cmd.mk

4)Makefile中的輸出為main_app,以及out/config.mk中定義的輸出和aos_target_build.mk中定義的輸出,以及init-build-env創(chuàng)建的文件夾庇绽。

main_app:?prebuild?$(OUTPUT_DIR)/config.mk?$(YOS_SDK_PRE_APP_BUILDS)?$(MAKEFILES_PATH)/aos_target_build.mk?init-build-env

????$(if?$(MBINS_ERROR),?$(call?MBINS_EXIT))

????$(QUIET)$(ECHO)?Build?AOS?Now

????$(QUIET)$(ECHO)?TOOLCHAIN_PATH=$(TOOLCHAIN_PATH)

????$(QUIET)$(MAKE)?-r?$(JOBSNO)?$(SILENT)?-f?$(MAKEFILES_PATH)/aos_target_build.mk?$(CLEANED_BUILD_STRING)?$(PASSDOWN_TARGETS)

????$(QUIET)$(ECHO)?Build?complete:?$(BUILD_STRING)

5)board\stm32f429zi-nucleo\aos.mk舉例mk文件內(nèi)容說明

NAME?:=?board_stm32f429zi-nucleo

#編譯硬件board基本信息锡搜;

$(NAME)_MBINS_TYPE?:=?kernel

$(NAME)_VERSION????:=?1.0.1.1

$(NAME)_SUMMARY????:=?configuration?for?board?stm32f429zi-nucleo

MODULE?????????????:=?1062

HOST_ARCH??????????:=?Cortex-M4

HOST_MCU_FAMILY????:=?mcu_stm32f4xx_cube

SUPPORT_MBINS???????:=?no

HOST_MCU_NAME??????:=?STM32F429ZIT6

ENABLE_VFP?????????:=?1

# 組件添加kernel_init?netmgr兩個(gè)組件,位于kernel/init,和network/netmgr瞧掺,具體可以

# 參考這兩個(gè)位置的*.mk文件獲取編譯加入了哪些源文件耕餐;

$(NAME)_COMPONENTS?+=?$(HOST_MCU_FAMILY)?kernel_init?netmgr

# 添加源文件;

$(NAME)_SOURCES?+=?aos/board_partition.c?\

???????????????????aos/soc_init.c????????\

???????????????????mbmaster_hal/port_serial.c


$(NAME)_SOURCES?+=?Src/stm32f4xx_hal_msp.c?\

???????????????????Src/can.c???????????????\

???????????????????Src/timer.c?????????????\

???????????????????Src/i2c.c???????????????\

???????????????????Src/eth.c???????????????\

???????????????????Src/gpio.c??????????????\

???????????????????Src/usart.c?????????????\

???????????????????Src/usb_otg.c???????????\

???????????????????Src/dma.c???????????????\

???????????????????Src/main.c


$(NAME)_SOURCES?+=?drv/board_drv_led.c

ywss_support?????=?0


GLOBAL_DEFINES?+=?KV_CONFIG_TOTAL_SIZE=32768?#32kb

GLOBAL_DEFINES?+=?KV_CONFIG_BLOCK_SIZE_BITS=14?#(1?<<?14)?=?16kb


#depends?on?sal?module?if?select?sal?function?via?build?option?"AOS_NETWORK_SAL=y"

AOS_NETWORK_SAL?????=?n

ifeq?(y,$(AOS_NETWORK_SAL))

$(NAME)_COMPONENTS?+=?sal

module??????????????=?wifi.mk3060

else

HTTPD_ENABLED??=?y

$(NAME)_SOURCES????+=?ethernetif.c

$(NAME)_SOURCES????+=?httpserver-netconn.c

$(NAME)_COMPONENTS?+=?lwip

endif


ifeq?($(COMPILER),?armcc)

$(NAME)_SOURCES????+=?startup_stm32f429xx_keil.s

$(NAME)_LINK_FILES?:=?startup_stm32f429xx_keil.o

else?ifeq?($(COMPILER),?iar)

$(NAME)_SOURCES????+=?startup_stm32f429xx_iar.s

else

$(NAME)_SOURCES????+=?startup_stm32f429xx.s

endif


GLOBAL_INCLUDES?+=?.????\

???????????????????aos/?\

???????????????????Inc/


GLOBAL_CFLAGS??+=?-DSTM32F429xx?-DCENTRALIZE_MAPPING


ifeq?($(COMPILER),armcc)

GLOBAL_LDFLAGS?+=?-L?--scatter=board/stm32f429zi-nucleo/STM32F429ZITx.sct

else?ifeq?($(COMPILER),iar)

GLOBAL_LDFLAGS?+=?--config?board/stm32f429zi-nucleo/STM32F429.icf

else

GLOBAL_LDFLAGS?+=?-T?board/stm32f429zi-nucleo/STM32F429ZITx_FLASH.ld

endif


CONFIG_SYSINFO_PRODUCT_MODEL?:=?ALI_AOS_f429-nucleo

CONFIG_SYSINFO_DEVICE_NAME???:=?f429-nucleo


GLOBAL_CFLAGS?+=?-DSYSINFO_PRODUCT_MODEL=\"$(CONFIG_SYSINFO_PRODUCT_MODEL)\"

GLOBAL_CFLAGS?+=?-DSYSINFO_DEVICE_NAME=\"$(CONFIG_SYSINFO_DEVICE_NAME)\"


#?Keil?project?support

$(NAME)_KEIL_VENDOR?=?STMicroelectronics

$(NAME)_KEIL_DEVICE?=?STM32F429ZITx


可以看到一個(gè)mk文件的基本組成為:


其中全局是指編譯所有組件時(shí)都要用到的設(shè)置辟狈,局部是指僅在編譯本組件時(shí)用到肠缔。一個(gè)mk文件就是描述了一個(gè)組件的配置信息。其實(shí)配置的設(shè)定都可以在 _CFLAGS 和 _LDFLAGS中指定哼转,包括鏈接使用的鏈接腳本明未。


具體實(shí)現(xiàn)說明

下面按照上面所說的要素來展開說明構(gòu)建體系的具體實(shí)現(xiàn),相關(guān)關(guān)鍵代碼等:

1)工具鏈選擇

宿主平臺(tái)在aos.py中設(shè)置壹蔓。輔助命令工具在 aos_host_cmd.mk 中設(shè)置趟妥,目前主要支持 windows 和 linux64 上兩種編譯宿主機(jī)平臺(tái)。

編譯工具鏈的設(shè)置佣蓉,在aos_target_xx.mk和 aos_library_xx.mk中會(huì)設(shè)置披摄。

2)找到源文件

編譯命令通常是app名@board名,app和board即為查找所有依賴的兩個(gè)入口組件勇凭。

依賴查找過程遞歸實(shí)現(xiàn)疚膊。

事實(shí)上上面的查找除了找到源文件之外還會(huì)解析出mk中定義編譯選項(xiàng)等信息,實(shí)際上是在遞歸解析組件的mk文件虾标。為后面的編譯鏈接步驟做好準(zhǔn)備寓盗。

3)config.mk生成

將上面遞歸解析出的mk中的信息存儲(chǔ)在config.mk中:

config.mk其實(shí)就是把所有組件 mk 中的信息匯總到一起。而后面產(chǎn)生的opts文件則是針對(duì)每個(gè)組件把config.mk中信息重新組合到一起產(chǎn)生的一個(gè)獨(dú)立的文件璧函。

4)編譯

編譯命令, aos_target_build.mk中傀蚌,每個(gè)組件的編譯選項(xiàng)產(chǎn)生, aos_target_config.mk中。

5)鏈接

鏈接命令, aos_target_build.mk中

鏈接選項(xiàng)的產(chǎn)生, aos_target_config.mk中

二進(jìn)制及其他處理

統(tǒng)一進(jìn)行的二進(jìn)制處理如strip等

關(guān)鍵宏調(diào)用關(guān)系梳理

FIND_COMPONENT --找到所有需要的組件 參數(shù):所有基本組件柳譬,遞歸調(diào)用

?PREPROCESS_TEST_COMPONENT ?--將所有測試所需的組件也加入到組件中喳张,無參數(shù)

PROCESS_COMPONENT --解析每個(gè)組件的 mk,參數(shù):所有組件

?PROCESS_ONE_COMPONENT ?--解析一個(gè)組件美澳,參數(shù):某一個(gè)組件

WRITE_FILE_CREATE --在config.mk中寫入所有相關(guān)信息销部,包括寫入所有編譯摸航,鏈接選項(xiàng)到opts文件中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舅桩,一起剝皮案震驚了整個(gè)濱河市酱虎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擂涛,老刑警劉巖读串,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撒妈,居然都是意外死亡恢暖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門狰右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杰捂,“玉大人,你說我怎么就攤上這事棋蚌〖藜眩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵谷暮,是天一觀的道長蒿往。 經(jīng)常有香客問我,道長湿弦,這世上最難降的妖魔是什么瓤漏? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮省撑,結(jié)果婚禮上赌蔑,老公的妹妹穿的比我還像新娘俯在。我一直安慰自己竟秫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布跷乐。 她就那樣靜靜地躺著肥败,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愕提。 梳的紋絲不亂的頭發(fā)上馒稍,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音浅侨,去河邊找鬼纽谒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛如输,可吹牛的內(nèi)容都是我干的鼓黔。 我是一名探鬼主播央勒,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澳化!你這毒婦竟也來了崔步?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤缎谷,失蹤者是張志新(化名)和其女友劉穎井濒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列林,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑞你,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了希痴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏悬。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖润梯,靈堂內(nèi)的尸體忽然破棺而出过牙,到底是詐尸還是另有隱情,我是刑警寧澤纺铭,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布寇钉,位于F島的核電站,受9級(jí)特大地震影響舶赔,放射性物質(zhì)發(fā)生泄漏扫倡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一竟纳、第九天 我趴在偏房一處隱蔽的房頂上張望撵溃。 院中可真熱鬧,春花似錦锥累、人聲如沸缘挑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽语淘。三九已至,卻和暖如春际歼,著一層夾襖步出監(jiān)牢的瞬間惶翻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工鹅心, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吕粗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓旭愧,卻偏偏與公主長得像颅筋,于是被迫代替她去往敵國和親虐秋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容