最近有空,于是想花时间好好研究下ardupilot的软件架构,经过对ardupilot一段时间的熟悉和使用后,对其软件架构已经有了一定的理解,但还称不上特别完备,所以想把每一部分的细节都弄清楚。
makefile定义了一个软件工程的编译规则,以便于其实现自动化编译,这也就是为什么我们在命令行中输入指令:
make px4-v2
就可以自动完成整个工程的编译。
看似简单的一条命令,其中makefile完成了很多工作。
然后ardupilot工程那么繁杂,命名为makefile的文件也很多,我们应该从哪个文件开始分析起呢。
回想我们编译的过程,以旋翼机型为例,我们首先是打开“\ardupilot\ArduCopter”路径,那么在这个路径下有没有我们要找的makefile呢,答案是肯定的。
这个makefile中只有一条指令:
include ../mk/apm.mk
然后我们对应地找到apm.mk文件,这个文件的内容就比较多了。一行行地分析,首先看开头几行:
SYSTYPE := $(shell uname)
ifneq ($(findstring CYGWIN, $(SYSTYPE)),)
MK_DIR := $(shell cygpath -m ../mk)
else
MK_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
endif
这几行代码是要确定MK_DIR,这个在下面查找mk文件时都会用到,根据我们电脑的操作系统类型确定,如果是Windows应该是执行第一个指令,所以 MK_DIR = “../mk”。也就是“…\ardupilot\mk”文件夹,该文件夹中有许多mk文件,有好多都是我们后面要用到的。
继续往下看:
include $(MK_DIR)/environ.mk
打开environ.mk,该文件主要是确定一些编译相关的变量:EXTRAFLAGS,SRCROOT,SKETCHBOOK,BUILDROOT以及HAL_BOARD等,这些变量在后面都会用到。我们重点看下HAL_BOARD的确定,APM代码支持多种硬件平台,HAL_BOARD就代表了我们指定运行的硬件平台。关于HAL_BOARD有一长段的if语气对其进行赋值, 其中我们有找到这样一句:
ifneq ($(findstring px4, $(MAKECMDGOALS)),)
HAL_BOARD = HAL_BOARD_PX4
endif
MAKECMDGOALS代表命令行参数列表,如果我们在命令行中输入“make px4-v2”则MAKECMDGOALS就是“px4-v2”,包含px4字符段,所以if语句会执行该条件,HAL_BOARD = HAL_BOARD_PX4。从这里就可以看到我们在命令行中的指令对于编译条件的影响了,后续我们会看到HAL_BOARD的作用。
我们回到APM.mk中,继续往下看:
# short-circuit build for the configure target
ifeq ($(MAKECMDGOALS),configure)
include $(MK_DIR)/configure.mk
else
# short-circuit build for the help target
include $(MK_DIR)/help.mk
# common makefile components
include $(MK_DIR)/targets.mk
include $(MK_DIR)/sketch_sources.mk
ifneq ($(MAKECMDGOALS),clean)
# board specific includes
ifeq ($(HAL_BOARD),HAL_BOARD_APM1)
include $(MK_DIR)/board_avr.mk
endif
ifeq ($(HAL_BOARD),HAL_BOARD_APM2)
include $(MK_DIR)/board_avr.mk
endif
ifeq ($(HAL_BOARD),HAL_BOARD_SITL)
include $(MK_DIR)/board_native.mk
endif
ifeq ($(HAL_BOARD),HAL_BOARD_LINUX)
include $(MK_DIR)/board_linux.mk
endif
ifeq (