AliOS Things Mqtt 启动分析 -- 1

1,工程构建

参见:https://github.com/alibaba/AliOS-Things/wiki/AliOS-Things-build-system

注意最新的AliOS Things 3.0版本如果使用VSCode IDE编译,需要安装AliOS Studio插件和aos-cube。

当在VSCODE中执行AliOS-Studio:Build的时候,会调用aos make app@board,比如这里我选择mqtt@stm32f429zi-nucleo,则会调用aos make mqtt@stm32f429zi-nucleo.

下面我们分析一下具体都做了什么。

1),调用关系:

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的标准库中的subprocess包的类,用来fork一个子进程并运行一个外部程序,进入 ./build/Makefile

3)Makefile中最主要的是aos_target_config.mk,定义了构建关系。

由aos_target_config.mk生成所有组件的config.mk(包含组件源文件以来关系等信息),然后在编译、链接的时候由aos_target_build.mk依次调用,最终生成./out里面的可执行文件。

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创建的文件夹。

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文件内容说明

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两个组件,位于kernel/init,和network/netmgr,具体可以

# 参考这两个位置的*.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


可以看到一个mk文件的基本组成为:


其中全局是指编译所有组件时都要用到的设置,局部是指仅在编译本组件时用到。一个mk文件就是描述了一个组件的配置信息。其实配置的设定都可以在 _CFLAGS 和 _LDFLAGS中指定,包括链接使用的链接脚本。


具体实现说明

下面按照上面所说的要素来展开说明构建体系的具体实现,相关关键代码等:

1)工具链选择

宿主平台在aos.py中设置。辅助命令工具在 aos_host_cmd.mk 中设置,目前主要支持 windows 和 linux64 上两种编译宿主机平台。

编译工具链的设置,在aos_target_xx.mk和 aos_library_xx.mk中会设置。

2)找到源文件

编译命令通常是app名@board名,app和board即为查找所有依赖的两个入口组件。

依赖查找过程递归实现。

事实上上面的查找除了找到源文件之外还会解析出mk中定义编译选项等信息,实际上是在递归解析组件的mk文件。为后面的编译链接步骤做好准备。

3)config.mk生成

将上面递归解析出的mk中的信息存储在config.mk中:

config.mk其实就是把所有组件 mk 中的信息汇总到一起。而后面产生的opts文件则是针对每个组件把config.mk中信息重新组合到一起产生的一个独立的文件。

4)编译

编译命令, aos_target_build.mk中,每个组件的编译选项产生, aos_target_config.mk中。

5)链接

链接命令, aos_target_build.mk中

链接选项的产生, aos_target_config.mk中

二进制及其他处理

统一进行的二进制处理如strip等

关键宏调用关系梳理

FIND_COMPONENT --找到所有需要的组件 参数:所有基本组件,递归调用

​PREPROCESS_TEST_COMPONENT  --将所有测试所需的组件也加入到组件中,无参数

PROCESS_COMPONENT --解析每个组件的 mk,参数:所有组件

​PROCESS_ONE_COMPONENT  --解析一个组件,参数:某一个组件

WRITE_FILE_CREATE --在config.mk中写入所有相关信息,包括写入所有编译,链接选项到opts文件中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容