ByJone.海龙 Time 2017.7.25
发现错误的大神欢迎加微信 Zhaohailong123455432
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编译自己添加的驱动文件,好费劲的说。
长按识别图中二维码关注我们!