Pixhawk飞控源码目录结构及编译流程分析

(PS:这是第一次写博客,以前也有记录一些经验总结心得什么的,不过都是手写笔记或者记在word上,csdn看了好久,总觉的只索取不付出心里有些过意不去,以后尽量都写到这吧,也会搬一些以前记在word里的东西过来,大家不要嫌弃就好……)


源码目录结构(获取源码的方法这里就不多说了,官网或者百度都找得到,用git工具 或者直接上github 下载都可以,推荐还是通过git工具去载, 毕竟在调用make编译之前其实还会通过git去载一些缺少模块,我的是vmware下的Ubuntu的环境。这博客在win下写吧,贴代码好像不是很方便,ubuntu下吧截图工具没有又qq截图来得好用,感觉博客写起来有点蛋疼,不知道你们都是咋写的……然后我关注的也是Copter部分,别的就没有深入了解也就不多说……)

 

一、Vehicle directory:ArduCopter(多旋翼)ArduPlane(固定翼)、APMrover2(巡逻车)、AntennaTracker(天线追踪站台?)

二、AP_HAL:硬件抽象层

三、Libraries:库文件

四、Tools directory: Tools/scripts/install-prereqs-ubuntu.sh//运行这个shell脚本会自动安装ubuntu环境下编译固件所需要工具,下面看下该文件的内容

     5    BASE_PKGS="gawk make git arduino-core curl"
     6    PYTHON_PKGS="pymavlink MAVProxy droneapi catkin_pkg"
     7    PX4_PKGS="python-serial python-argparse openocd flex bison libncurses5-dev \
     8              autoconf texinfo build-essential libftdi-dev libtool zlib1g-dev \
     9              zip genromfs python-empy"
    10    BEBOP_PKGS="g++-arm-linux-gnueabihf"
    11    SITL_PKGS="g++ python-pip python-setuptools python-matplotlib python-serial python-scipy python-opencv python-numpy python-pyparsing ccache realpath"
   。//这里列出了需要的一些外部库文件,

   。 

    66   $APT_GET install $BASE_PKGS $SITL_PKGS $PX4_PKGS $BEBOP_PKGS
    67    sudo pip2 -q install $PYTHON_PKGS
   。//这里将对上面列出的需要的库进行安装,当然如果已经装了,会自动跳过,这就是apt-get智能的一面

   101    apt-cache search arm-none-eabi
   102    
   103    (
   104     cd $ARDUPILOT_ROOT   
   105     git submodule init
   106     git submodule update
   107    )//自动下载或者更新飞控点某些模块

五、External support code:PX4Nuttx(板载实时系统)、PX4Firmware(px4固件源码目录)、mavlink(飞控与地面站通信协议)、uavcan(飞行器can总线通信协议)


编译流程

    了解了大致的目录结构,我们来看看Arduopter主目录下的Makefile(Makefile 见过很多了,简单的、复杂点都看过,最复杂的应该莫过于内核Makefile了吧,这里的Makefile也算比较复杂了)

linux@ubuntu:~/src/ardupilot/ArduCopter$ cat Makefile -n
     1    include ../mk/apm.mk
     2    

  好了,就一行……来看看apm.mk是什么名堂,(有点长,我们直接看关键部分)

linux@ubuntu:~/src/ardupilot/ArduCopter$ cat -n  ../mk/apm.mk
。。。

    22    # common makefile components
    23    include $(MK_DIR)/targets.mk
    24    include $(MK_DIR)/sketch_sources.mk
。。。

    36    
    37    ifeq ($(HAL_BOARD),HAL_BOARD_PX4)
    38    include $(MK_DIR)/board_px4.mk
    39    endif
    40    

。。。target.mk描述了所有平台下的编译目标,我们用不着,这里我们先看看具有针对性px4平台的board_px4.mk文件

linux@ubuntu:~/src/ardupilot/mk$ cat -n board_px4.mk
     1    TOOLCHAIN = NATIVE
     2    include $(MK_DIR)/find_tools.mk
     3    include $(MK_DIR)/px4_targets.mk

find_tools.mk从名字就可以知道他干的啥了,而这里的px4_targets.mk中描述的就是px4-v1、px4-v2....等等编译目标,内容比较多,我就不全贴了,反正到这里就明白了,

px4_targets.mk(注意px4_targets.mk  != target.mk)中声明的就是我们的编译目标,及烧写的命令(ardupilot官网编译教程中的,编译px4的时候make px4-v1,编译pixhawk的时候make px4-v2,烧写时make  xxx-upload)

。。。

    48    # we have different config files for V1 and V2
    49    PX4_V1_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v1_APM.mk
    50    PX4_V2_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v2_APM.mk  //这文件包含了编译目标的依赖,也就是具体编译的那些模块哪些驱动
    51    PX4_V4_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v4_APM.mk

。。。

    98    px4-v2: $(BUILDROOT)/make.flags CHECK_MODULES $(MAVLINK_HEADERS) $(PX4_ROOT)/Archives/px4fmu-v2.export $(SKETCHCPP) module_mk px4-io-v2
    99        $(RULEHDR)
   100        $(v) cp $(PX4_V2_CONFIG_FILE) $(PX4_ROOT)/makefiles/nuttx/
   101        $(PX4_MAKE) px4fmu-v2_APM
   102        $(v) arm-none-eabi-size $(PX4_ROOT)/Build/px4fmu-v2_APM.build/firmware.elf
   103        $(v) cp $(PX4_ROOT)/Images/px4fmu-v2_APM.px4 $(SKETCH)-v2.px4
   104        $(v) $(SKETCHBOOK)/Tools/scripts/add_git_hashes.py $(HASHADDER_FLAGS) "$(SKETCH)-v2.px4" "$(SKETCH)-v2.px4"
   105        $(v) echo "PX4 $(SKETCH) Firmware is in $(SKETCH)-v2.px4"

。。

   139    px4-v2-upload: px4-v2      //烧写命令
   140        $(RULEHDR)
   141        $(v) $(PX4_MAKE) px4fmu-v2_APM upload
   142   

。。

 163    px4-io-v2: $(PX4_ROOT)/Archives/px4io-v2.export
   164        $(v)+ $(MAKE) -C $(PX4_ROOT) -f $(PX4_ROOT)/Makefile.make px4io-v2_default EXTRADEFINES="-DARDUPILOT_BUILD"
   165        $(v) cp $(PX4_ROOT)/Images/px4io-v2_default.bin px4io-v2.bin
   166        $(v) cp $(PX4_ROOT)/Build/px4io-v2_default.build/firmware.elf px4io-v2.elf
   167        $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/px4io/
   168        $(v) cp px4io-v2.bin $(MK_DIR)/PX4/ROMFS/px4io/px4io.bin
   169        $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/bootloader/
   170        $(v) cp $(SKETCHBOOK)/mk/PX4/bootloader/px4fmuv2_bl.bin $(MK_DIR)/PX4/ROMFS/bootloader/fmu_bl.bin
   171        $(v) echo "PX4IOv2 Firmware is in px4io-v2.bin"
   172    

 在第 50  行,   PX4_V2_CONFIG_FILE=$(MK_DIR)/PX4/config_px4fmu-v2_APM.mk  //这文件包含了编译目标的依赖,也就是具体编译的那些模块哪些驱动

     1    #
     2    # Makefile for the px4fmu-v2_APM configuration
     3    #
     4    include $(SKETCHBOOK)/mk/PX4/px4_common.mk
     5    
     6    MODULES        += drivers/lsm303d
     7    MODULES        += drivers/l3gd20
     8    MODULES        += drivers/mpu9250
     9    MODULES        += drivers/boards/px4fmu-v2
    10    MODULES        += drivers/pwm_input
    11    MODULES         += modules/uavcan
    12    MODULES         += lib/mathlib
    13    MODULES        += drivers/px4io
    14    MODULES        += drivers/px4flow
    15    MODULES        += drivers/oreoled


在看px4_common.mk文件,略多,就不全贴了,

    1    #
     2    # common makefile elements for all PX4 boards
     3    #
     4    
     5    #
     6    # Use the configuration's ROMFS.
     7    #
     8    ROMFS_ROOT     = $(SKETCHBOOK)/mk/PX4/ROMFS
     9    MODULES        += $(APM_MODULE_DIR)
    10    
    11    #
    12    # Board support modules
    13    #
    14    MODULES        += drivers/device
    15    MODULES        += drivers/stm32
    16    MODULES        += drivers/stm32/adc
    17    MODULES        += drivers/stm32/tone_alarm
    18    MODULES        += drivers/led
    19    MODULES        += drivers/px4fmu
    20    MODULES        += drivers/rgbled
    21    MODULES        += drivers/mpu6000
    22    MODULES        += drivers/hmc5883
    23    MODULES        += drivers/ms5611
    24    MODULES        += drivers/mb12xx
    25    MODULES        += drivers/ll40ls
    26    MODULES        += drivers/trone
    27    #MODULES    += drivers/gps
    28    #MODULES    += drivers/hil
    29    #MODULES    += drivers/hott_telemetry
    30    #MODULES    += drivers/blinkm
    31    #MODULES    += modules/sensors
    32    MODULES        += drivers/airspeed
    33    MODULES        += drivers/ets_airspeed
    34    MODULES        += drivers/meas_airspeed
    35    MODULES        += drivers/mkblctrl
    36    MODULES        += drivers/batt_smbus
    37    MODULES        += drivers/irlock
    38    。。。。

这些就给出了编译的各个模块!!


好了,先写到这吧……


你可能感兴趣的:(Pixhawk)