Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379394
  • 博文数量: 61
  • 博客积分: 4650
  • 博客等级: 上校
  • 技术积分: 786
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 21:07
个人简介

少抱怨,多实干;

文章分类

全部博文(61)

文章存档

2017年(1)

2016年(13)

2015年(1)

2013年(2)

2011年(1)

2010年(3)

2009年(23)

2008年(17)

我的朋友

分类: 嵌入式

2016-10-11 17:15:09


该说明,是在windows平台下,ardupilot的版本是3.5.3;
使用eclipse来编译的;编译的时候,要先在eclipse的Make Target窗口中的Ardupilot/ArduCopter目录下
新建编译目标:px4-v2. 编译的时候,双击该px4-v2即可以开始编译.

ArduPlane下面执行 make px4-v2
-> ../mk/apm.mk -> environ.mk
apm.mk中首先加载设置环境变量的mk文件(environ.mk),及其它相关的一个mk文件;
然后再依据被编译的目标对像来调用对应的makefile文件.


***apm.mk =====1.设置MK_DIR变量为源码下面的mk目录.
                     MK_DIR = ../mk
               2.include一些mk文件
               3.依据编译目标include下面这些mk文件

environ.mk ----用来配置上面提到的环境变量.
                针对px4-v2来说,变量值如下:
                EXTRAFLAGS=-DGIT_VERSION="\"b8461671\""
                SRCROOT   = /d/AutoPilot/Firmware/Ardupilot/ArduCopter
                SKETCHBOOK= /d/AutoPilot/Firmware/Ardupilot
                SKETCH    = ArduCopter
                BUILDROOT = Build.ArduCopter
                HAL_BOARD = HAL_BOARD_PX4

configure.mk --用来响应make configure指令;
help.mk -------用来响应 make help指令,显示帮助信息.

targets.mk ----用来执行目标程序的编译动作,脚本会依据BOARDS和FRAMES
               变量定义的关键字来在make的命令行里查找目标,然后编译它;
               该文件用来动态生成一个编译依赖关系,通过eval函数;
               同时,clean 的动作在此定义;
               脚本会include modules.mk和mavgen.mk两个文件;
        modules.mk -->用来从git服务器检索子模块源码的完整性,并下载这些子模块;
                      make module-update 命令在此定义;
                      所以,如果没有网络,想做离线编译,可以将该mk模块注释掉;
        mavgen.mk --->生成MAVLINK消息模块,并设置如下变量:
                    MAVLINK_HEADERS
                     
        
sketch_sources.mk ---加载所有类型项目的源文件到指定变量,并设置其目标obj文件,
                     这两个变量为 SKETCHSRCS 和 SKETCHOBJS;
                     并加载make.inc文件中的列表目录到变量 LIBTOKENS 中,然后同去
                     添加具体平台相关的库目录;脚本设置如下一些变量:
                    SKETCHLIBS ----------所有库文件路径列表(绝对路径);
                    SKETCHLIBNAMES ------所有库文件路径列表(相对路径);
                    SKETCHLIBSRCDIRS-----为SKETCHLIBS列表中每一项添加/utility子路径,
                                         因为有些库目录下面还有utility子目录;
                    SKETCHLIBSRCS--------所有库源文件绝对路径;
                    SKETCHLIBOBJS--------SKETCHLIBSRCS对应的.o文件,路径在Build目录下面;
                    SKETCHLIBINCLUDES----所有依据路径(libraries),和GCS_MAVLink路径;
                    SKETCHLIBSRCSRELATIVE--SKETCHLIBSRCS的相对路径;
                
接下来,apm.mk会依据编译目标(HAL_BOARD)的不同来加载不同的mk文件,以px4-v2为例,会加载:
board_px4.mk ---- 1.设置变量 TOOLCHAIN = NATIVE
                  2.加载 find_tools.mk
                  3.加载px4_targets.mk
        find_tools.mk --> 配置编译中所使和到工具的路径及名称,使用的都是绝对路径,如px4-v2
                        ARM_CXX     :=  $(call FIND_TOOL,arm-none-eabi-g++)
                        ARM_CC      :=  $(call FIND_TOOL,arm-none-eabi-gcc)
                        ARM_AS      :=  $(call FIND_TOOL,arm-none-eabi-gcc)
                        ARM_AR      :=  $(call FIND_TOOL,arm-none-eabi-ar)
                        ARM_LD      :=  $(call FIND_TOOL,arm-none-eabi-g++)
                        ARM_GDB     :=  $(call FIND_TOOL,arm-none-eabi-gdb)
                        ARM_OBJCOPY :=  $(call FIND_TOOL,arm-none-eabi-objcopy)
                    上面指令,通过FIND_TOOL宏来设置工具的绝对路径,从$PATH中找;而最终的编译工具
                    由下面变量表示:
                        CXX = $(CCACHE) $($(TOOLCHAIN)_CXX)
                        CC = $(CCACHE) $($(TOOLCHAIN)_CC)
                        AS = $($(TOOLCHAIN)_AS)
                        AR = $($(TOOLCHAIN)_AR)
                        LD = $($(TOOLCHAIN)_LD)
                        GDB = $($(TOOLCHAIN)_GDB)
                        OBJCOPY = $($(TOOLCHAIN)_OBJCOPY)
                        
                    这里有一个全局临时变量 : CCACHE ,用来加快编译速度,通过export CCACHE来声名;
                        
        ***px4_targets.mk--->这个才是最终执行编译的地方;
                    1.先设置变量:
                       PX4FIRMWARE_DIRECTORY = modules/PX4Firmware
                       PX4NUTTX_DIRECTORY    = modules/PX4NuttX
                       UAVCAN_DIRECTORY      = modules/uavcan
                       PX4_ROOT              = modules/PX4Firmware
                       NUTTX_ROOT            = modules/PX4Nuttx
                       NUTTX_SRC             = modules/PX4Nuttx/nuttx/
                       UAVCAN_DIR            = modules/uavcan/
                       还有其它一些编译器相关参数;
                       
                    2.获取GIT版本,并存储到变量 EXTRAFLAGS中,最终的EXTRAFLAGS值为(针对版本3.5.3):
                       EXTRAFLAGS=-DGIT_VERSION="\"b8461671\"" -DNUTTX_GIT_VERSION="\"a5146c68\"" -DPX4_GIT_VERSION="\"4e5cccf6\"" -DUAVCAN=1
                       可以看出,这里一共设置了三个版本值(为了离线编译,本人将版本设成了固定值),且使能了UAVCAN功能:
                           GIT_VERSION=b8461671
                           NUTTX_GIT_VERSION =a5146c68
                           PX4_GIT_VERSION = 4e5cccf6
                           UAVCAN=1
                       
                    3.设置phthon脚本位置,并导出为临时环境变量:
                       PYTHONPATH=/mk/PX4/Tools/genmsg/src:/mk/PX4/Tools/gencpp/src
                       
                    4.PX4_MAKE_ARCHIVES变量用来生成内核库文件,执行modules/PX4Firmware下的
                      Makefile.make,具体指令为:
                      modules/PX4Firmware/Makefile.make NUTTX_SRC=modules/PX4Nuttx/nuttx/ CCACHE=ccache archives MAXOPTIMIZATION="-Os"
                    5.PX4_MAKE用来生成PX4平台的目标固件;
                      $(MAKE) -C $(SKETCHBOOK) -f $(PX4_ROOT)/Makefile.make
                                EXTRADEFINES="$(SKETCHFLAGS) $(WARNFLAGS)
                                $(OPTFLAGS) "'$(EXTRAFLAGS)' APM_MODULE_DIR=$(SKETCHBOOK)
                                SKETCHBOOK=$(SKETCHBOOK) CCACHE=$(CCACHE)
                                PX4_ROOT=$(PX4_ROOT) NUTTX_SRC=$(NUTTX_SRC)
                                MAXOPTIMIZATION="-Os" UAVCAN_DIR=$(UAVCAN_DIR)
                      通过-C参数来将make的工作目录切换到源码的顶层目录下,然后指定的makefile文件
                      为modules/PX4Firmware/Makefile.make
                   

阅读(3290) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~