(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 。。。。
这些就给出了编译的各个模块!!
好了,先写到这吧……