研究基于PX4平台的Ardupilot代码工程的makefile结构

本文主要探讨了Ardupilot软件架构中的makefile使用,特别是针对 PX4 平台的编译规则。通过分析位于“ArduCopter”路径下的makefile和相关mk文件,揭示了如何根据命令行参数确定HAL_BOARD,以及如何根据不同硬件平台选择对应的编译规则。文章详细解释了从make px4-v2指令开始,如何依次执行各个makefile文件,包括help.mk、targets.mk、sketch_sources.mk和board_px4.mk,从而完成编译过程。
摘要由CSDN通过智能技术生成

最近有空,于是想花时间好好研究下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 (
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值