ArduCopter编译流程
ArduCopter编译流程
转自 ByJone.海龙 Time 2017.7.25
Apm代码的编译规则、编译顺序、程序文件包含和调用关系通过makefile文件定义。
想看apm的编译流程可以直接看ardupilot文件夹下的mk文件夹,目录如下:

ArduCopter的编译就是调用的上面的apm.mk文件
在ArduCopter文件夹下有makefile文件,里面就一行
然而并没有这么简单,后面就略复杂了。先来看apm.mk文件。
一、apm.mk
在执行make px4-v2编译指令后,首先加载apm.mk文件,主要完成两个功能:
1、判断编译系统类型,确定当前mk文件目录变量(MK_DIR)。

2、include包含其它文件,依次编译。

下面简单说下包含的都是干啥的,其实可以直接跳到board_px4.mk,毕竟我们的硬件是px4。
二、Environ.mk
配置环境变量GIT_VERSION、SRCROOT、SKETCHBOOK、SKETCH、BUILDROOT、HAL_BOARD
BUILDROOT环境变量的配置解释了成功编译程序后生产build.ArduCopter文件夹在哪。
三、Configure.mk
直接上截图

新的固件已经不需要这个了。(那还包含干啥)
四、Help.mk
Help.mk用于打印帮助信息。
五、Targets.mk
1、通过BOARDS和FRAMES变量定义的关键字解析编译指令。

2、通过eval函数动态生成一个程序编译依赖关系。

3、定义了make clean编译指令

4、调用moudules.mk和mavgen.mk两个文件。

六、moudules.mk
1、其中moudules.mk针对飞控源码中子程序模块的完整性在git服务器中进行检索。

2、定义了make modules-update命令。

七、mavgen.mk
mavgen.mk用于生成MAVLINK消息模块
1、设置关于mavlink头文件、输出路径等一系列变量。

2、配置使用python工具生成mavlink协议。

八、sketch_sources.mk
加载程序中所有源文件到指定变量LIBTOKENS,并配置目标文件(obj)。
1、将解析make.inc文件而得到的库目录列表赋值到LIBTOKENS中;

我们编译arducopter时是在该文件夹下,所以解析时也就解析该文件夹下的make.inc。
该文件也就是apm库里的了

2、根据特定的编译平台加载相应的硬件抽象层(AP_HAL_AVR、AP_HALPX4等),并更新到LIBTOKENS变量中;

3、解析所有库文件路径列表(绝对路径和相对路径)、所有库源文件绝对路径等,并赋值到相应变量。

根据Environ.mk配置的环境变量可得HAL_BOARD=HAL_BOARD_PX4

故加载board_px4.mk。
九、board_px4.mk 重头戏,上面说可以直接跳这。
定义了TOOLCHAIN=NATIVE,并加载find_tools.mk和px4_targets.mk两个文件。

十、find_tools.mk
find_tools.mk配置了编译过程中所需要的工具所在的路径和名称,包括CXX、CC、AS、AR、LD、GDB、OBJCOPE


其中CCACHE变量应该是用于加快编译速度的全局临时变量。

十一、px4_targets.mk(主要)
px4_targets.mk最终执行编译的地方。
定义PX4FIRMWARE、PX4NUTTX以及UAVCAN文件路径,并解析其版本。

配置变量PX4_V2_CONFIG_FILE=mk/PX4/config_px4fmu-v2_APM.mk,

该.mk文件指定了固件编译需要哪些驱动及任务模块;

并包含了px4_common.mk文件,文件指定固件编译所有px4fmu(v1、v2、v4)需要的驱动及任务模块。
在这个文件里也定义了make的具体指令,编译的时候make px4-v2。

烧录固件时make px4-v2-upload,哈哈。

那么假如写make px4-v2写烦了,可以把这个里改成px4-hai long is a good boy,
输入指令 make px4-hai long is a goodboy,就可以编译了。

十二、px4_common.mk
该文件是指定固件编译所有px4fmu(v1、v2、v4)需要的驱动及任务模块。

到这就差不多了,其实我就想让APM编译自己添加的驱动文件,好费劲的说。
浙公网安备 33010602011771号