研究基于PX4平台的Ardupilot代码工程的makefile结构

2023-05-16

最近有空,于是想花时间好好研究下ardupilot的软件架构,经过对ardupilot一段时间的熟悉和使用后,对其软件架构已经有了一定的理解,但还称不上特别完备,所以想把每一部分的细节都弄清楚。

makefile定义了一个软件工程的编译规则,以便于其实现自动化编译,这也就是为什么我们在命令行中输入指令:

make px4-v2

就可以自动完成整个工程的编译。
看似简单的一条命令,其中makefile完成了很多工作。

然后ardupilot工程那么繁杂,命名为makefile的文件也很多,我们应该从哪个文件开始分析起呢。
回想我们编译的过程,以旋翼机型为例,我们首先是打开“\ardupilot\ArduCopter”路径,那么在这个路径下有没有我们要找的makefile呢,答案是肯定的。
这个makefile中只有一条指令:

include ../mk/apm.mk

然后我们对应地找到apm.mk文件,这个文件的内容就比较多了。一行行地分析,首先看开头几行:

SYSTYPE         :=  $(shell uname)

ifneq ($(findstring CYGWIN, $(SYSTYPE)),) 
  MK_DIR := $(shell cygpath -m ../mk)
else
  MK_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
endif

这几行代码是要确定MK_DIR,这个在下面查找mk文件时都会用到,根据我们电脑的操作系统类型确定,如果是Windows应该是执行第一个指令,所以 MK_DIR = “../mk”。也就是“…\ardupilot\mk”文件夹,该文件夹中有许多mk文件,有好多都是我们后面要用到的。

继续往下看:

include $(MK_DIR)/environ.mk

打开environ.mk,该文件主要是确定一些编译相关的变量:EXTRAFLAGS,SRCROOT,SKETCHBOOK,BUILDROOT以及HAL_BOARD等,这些变量在后面都会用到。我们重点看下HAL_BOARD的确定,APM代码支持多种硬件平台,HAL_BOARD就代表了我们指定运行的硬件平台。关于HAL_BOARD有一长段的if语气对其进行赋值, 其中我们有找到这样一句:

ifneq ($(findstring px4, $(MAKECMDGOALS)),)
HAL_BOARD = HAL_BOARD_PX4
endif

MAKECMDGOALS代表命令行参数列表,如果我们在命令行中输入“make px4-v2”则MAKECMDGOALS就是“px4-v2”,包含px4字符段,所以if语句会执行该条件,HAL_BOARD = HAL_BOARD_PX4。从这里就可以看到我们在命令行中的指令对于编译条件的影响了,后续我们会看到HAL_BOARD的作用。

我们回到APM.mk中,继续往下看:

# short-circuit build for the configure target
ifeq ($(MAKECMDGOALS),configure)
include $(MK_DIR)/configure.mk

else

# short-circuit build for the help target
include $(MK_DIR)/help.mk

# common makefile components
include $(MK_DIR)/targets.mk
include $(MK_DIR)/sketch_sources.mk

ifneq ($(MAKECMDGOALS),clean)
# board specific includes
ifeq ($(HAL_BOARD),HAL_BOARD_APM1)
include $(MK_DIR)/board_avr.mk
endif

ifeq ($(HAL_BOARD),HAL_BOARD_APM2)
include $(MK_DIR)/board_avr.mk
endif

ifeq ($(HAL_BOARD),HAL_BOARD_SITL)
include $(MK_DIR)/board_native.mk
endif

ifeq ($(HAL_BOARD),HAL_BOARD_LINUX)
include $(MK_DIR)/board_linux.mk
endif

ifeq ($(HAL_BOARD),HAL_BOARD_PX4)
include $(MK_DIR)/board_px4.mk
endif

ifeq ($(HAL_BOARD),HAL_BOARD_VRBRAIN)
include $(MK_DIR)/board_vrbrain.mk
endif

ifeq ($(HAL_BOARD),HAL_BOARD_FLYMAPLE)
include $(MK_DIR)/board_flymaple.mk
endif

endif

endif

以指令“px4-v2”为例,会依次包含help.mk,targets.mk,sketch_sources.mk以及board_px4.mk,注意前三个是通用的,而board_px4.mk则是跟硬件平台有关,这里就是依据我们之前确定的HAL_BOARD来选择的。
help.mk中是一些帮助信息,响应“help”指令显示这些帮助信息;
targets.mk是对一些通用目标的响应,主要是支持一些其他类型硬件平台,同时还包含进了module.mk;
module.mk:

# git submodule support

.PHONY: CHECK_MODULES

# PX4 build needs submodules
px4-%: CHECK_MODULES

CHECK_MODULES:
    $(v)$(MK_DIR)/check_modules.sh

module-update:
    git submodule update

这个后面会用到,对于px4平台,由于其代码工程包含子模块,每次编译都会执行CHECK_MODULES。

sketch_sources.mk会基于SRCROOT里面的make.inc文件定义SKETCHLIBS,SKETCHLIBNAMES等变量,如前所述,SRCROOT是在environ.mk中规定的,在此例中,SRCROOT就是“……/ardupilot/arducopter”,在此路径中,可以找到mak.inc文件:

LIBRARIES += AP_Common
LIBRARIES += AP_Progmem
LIBRARIES += AP_Menu
LIBRARIES += AP_Param
LIBRARIES += StorageManager
LIBRARIES += AP_HAL
LIBRARIES += AP_HAL_AVR
LIBRARIES += AP_HAL_SITL
LIBRARIES += AP_HAL_PX4
LIBRARIES += AP_HAL_VRBRAIN
LIBRARIES += AP_HAL_FLYMAPLE
LIBRARIES += AP_HAL_Linux
LIBRARIES += AP_HAL_Empty
LIBRARIES += GCS
LIBRARIES += GCS_MAVLink
....

该文件中定义了LIBRARIES 变量。SKETCHLIBS变量是根据LIBRARIES 定义的。sketch_sources.mk同时也定义了一些指令的响应规则,如(BUILDROOT)/make.flags在后面会用到。

下面到了我们的重点board_px4.mk,该文件一开始首先是对PX4_ROOT,NUTTX_SRC和UAVCAN_DIR进行赋值处理,其实就是Ardupilot用到的三个子模块PX4Firmware、PX4NuttX和uavcan的文件路径。然后就是对EXTRAFLAGS变量进行扩展,EXTRAFLAGS表示附加标示,之前在environ.mk文件中已经对其添加了主模块的git版本,在这里会继续添加三个子模块的git版本号,git版本号用于统一主模块和子模块的版本对应关系,在git管理中应用。
board_px4.mk的重点在很多命令的定义,比如我们用到的px4-v2:

px4-v2: $(BUILDROOT)/make.flags CHECK_MODULES $(PX4_ROOT)/Archives/px4fmu-v2.export $(SKETCHCPP) module_mk px4-io-v2
    $(RULEHDR)
    $(v) rm -f $(PX4_ROOT)/makefiles/$(PX4_V2_CONFIG_FILE)
    $(v) cp $(PX4_V2_CONFIG_FILE) $(PX4_ROOT)/makefiles/nuttx/
    $(PX4_MAKE) px4fmu-v2_APM
    $(v) /bin/rm -f $(SKETCH)-v2.px4
    $(v) cp $(PX4_ROOT)/Images/px4fmu-v2_APM.px4 $(SKETCH)-v2.px4
    $(v) $(SKETCHBOOK)/Tools/scripts/add_git_hashes.py $(HASHADDER_FLAGS) "$(SKETCH)-v2.px4" "$(SKETCH)-v2.px4"
    $(v) echo "PX4 $(SKETCH) Firmware is in $(SKETCH)-v2.px4"

下面逐个分析:
$(BUILDROOT)/make.flags:可以在sketch_sources.mk找到定义:

$(BUILDROOT)/make.flags: FORCE
    @mkdir -p $(BUILDROOT)
    @echo "// BUILDROOT=$(BUILDROOT) HAL_BOARD=$(HAL_BOARD) HAL_BOARD_SUBTYPE=$(HAL_BOARD_SUBTYPE) TOOLCHAIN=$(TOOLCHAIN) EXTRAFLAGS=$(EXTRAFLAGS)" > $(BUILDROOT)/make.flags.new
    @cmp $(BUILDROOT)/make.flags $(BUILDROOT)/make.flags.new > /dev/null 2>&1 || rm -f $(SRCROOT)/*.o
    @cmp $(BUILDROOT)/make.flags $(BUILDROOT)/make.flags.new > /dev/null 2>&1 || mv $(BUILDROOT)/make.flags.new $(BUILDROOT)/make.flags
    @rm -f $(BUILDROOT)/make.flags.new
    @cat $(BUILDROOT)/make.flags

该指令会在命令行中打印一些基本信息,并且将这些信息存放在
“…\Ardupilot\Build.ArduCopter\make.flags”文件中。

CHECK_MODULES在modules.mk中定义:

CHECK_MODULES:
    $(v)$(MK_DIR)/check_modules.sh

调用脚本文件check_modules.sh进行子模块检测。

$(PX4_ROOT)/Archives/px4fmu-v2.export是文件。

$(SKETCHCPP)是文件arducopter.cpp。

module_mk:

module_mk:
    $(v) echo "Building $(SKETCHBOOK)/module.mk"
    $(RULEHDR)
    $(v) echo "# Auto-generated file - do not edit" > $(SKETCHBOOK)/module.mk.new
    $(v) echo "MODULE_COMMAND = ArduPilot" >> $(SKETCHBOOK)/module.mk.new
    $(v) echo "SRCS = $(wildcard $(SRCROOT)/*.cpp) $(SKETCHLIBSRCSRELATIVE)" >> $(SKETCHBOOK)/module.mk.new
    $(v) echo "MODULE_STACKSIZE = 8192" >> $(SKETCHBOOK)/module.mk.new
    $(v) echo "EXTRACXXFLAGS = -Wframe-larger-than=1200" >> $(SKETCHBOOK)/module.mk.new
    $(v) cmp $(SKETCHBOOK)/module.mk $(SKETCHBOOK)/module.mk.new 2>/dev/null || mv $(SKETCHBOOK)/module.mk.new $(SKETCHBOOK)/module.mk
    $(v) rm -f $(SKETCHBOOK)/module.mk.new

该指令会在Ardupilot主目录下生成一个module.mk文件。

px4-io-v2:

px4-io-v2: $(PX4_ROOT)/Archives/px4io-v2.export
    $(v)+ $(MAKE) -C $(PX4_ROOT) px4io-v2_default
    $(v) /bin/rm -f px4io-v2.bin
    $(v) cp $(PX4_ROOT)/Build/px4io-v2_default.build/firmware.bin px4io-v2.bin
    $(v) cp $(PX4_ROOT)/Images/px4io-v2_default.bin px4io-v2.bin
    $(v) cp $(PX4_ROOT)/Build/px4io-v2_default.build/firmware.elf px4io-v2.elf
    $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/px4io/
    $(v) rm -f $(MK_DIR)/PX4/ROMFS/px4io/px4io.bin
    $(v) cp px4io-v2.bin $(MK_DIR)/PX4/ROMFS/px4io/px4io.bin
    $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/bootloader/
    $(v) rm -f $(MK_DIR)/PX4/ROMFS/bootloader/fmu_bl.bin
    $(v) cp $(SKETCHBOOK)/mk/PX4/bootloader/px4fmuv2_bl.bin $(MK_DIR)/PX4/ROMFS/bootloader/fmu_bl.bin
    $(v) echo "PX4IOv2 Firmware is in px4io-v2.bin"

(v)+ (MAKE) -C $(PX4_ROOT) px4io-v2_default会根据子模块PX4Firmware中的makefile来执行,涉及到PX4Firmware中的多个makefile,具体暂不讨论。接下来的指令就是将生成px4io-v2.bin等文件复制到相应的文件路径中去。

$(RULEHDR),RULEHDR是在sketch_sources.mk中定义的:

# common header for rules, prints what is being built
define RULEHDR
    @echo %% $(subst $(BUILDROOT)/,,$@)
    @mkdir -p $(dir $@)
endef

它会在命令行中打印:%% px4-v2。

接下来的:

$(v) rm -f $(PX4_ROOT)/makefiles/$(PX4_V2_CONFIG_FILE) 
$(v) cp $(PX4_V2_CONFIG_FILE) $(PX4_ROOT)/makefiles/nuttx/

这两句是用“…\Ardupilot\mk\PX4\config_px4fmu-v2_APM.mk”替换掉“…、Ardupilot\modules\PX4Firmware\makefiles\nuttx\config_px4fmu-v2_APM.mk”。

$(PX4_MAKE) px4fmu-v2_APM完成目标编译,同样与子模块的makefile有关,后续再做详细分析。
剩下来的指令就是完成arducopter-v2.px4文件的复制和存放。至此,make px4-v2”指令的分析就到此结束,后续会对子模块px4firmware的makefile做进一步分析。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

研究基于PX4平台的Ardupilot代码工程的makefile结构 的相关文章

  • <视觉>——单目相机的标定(简单原理+Opencv实现)

    单目相机的标定原理大致如下 xff1a 世界坐标到像素坐标的转换 期间的参数有S尺度因子 xff0c 内参矩阵K xff0c 旋转矩阵R xff0c 平移矩阵T xff0c 一共八个未知数 在Opencv中我们可以方便的根据相机拍摄不同位姿
  • Python入门自学进阶-Web框架——4、HttpRequest和HttpResponse及模板

    HTTP请求中产生两个核心的对象 xff1a http请求 xff1a HttpRequest对象 http响应 xff1a HttpResponse对象 所在位置django http xff0c 前边用的reques就是HttpRequ
  • 维修杜邦线(母头)

    在一个研发团体中 xff0c 即使有某一位或几位财大气粗的 xff0c 也难免有其他成员借设备使用的 xff0c 研发过程中使用的电子设备在底层通讯之间大都采用杜邦线连接 xff0c 大家都熟悉 xff0c 优点就不说了 xff0c 先说说
  • 【酷毙了】野火新版fireTools多功能调试助手,有Windows和Linux版本,就问你喜不喜欢。...

    01 软件简介 野火fireTools 多功能调试助手 xff0c 是一款使用QT开发 xff0c 可以在Windows和Linux环境下完美运行的绿色客户端 xff0c 不需要安装 xff0c 双击即可运行 xff0c 其功能包括 xff
  • 结合模型,视频动态演示PID三个参数的作用!

    PID控制器 xff08 比例 积分 微分控制器 xff09 xff0c 由比例单元 xff08 P xff09 积分单元 xff08 I xff09 和微分单元 xff08 D xff09 组成 可以通过调整这三个单元的增益Kp xff0
  • 单片机数字滤波算法如何实现?(附代码)

    ID xff1a 技术让梦想更伟大 整理 xff1a 李肖遥 单片机主要作用是控制外围的器件 xff0c 并实现一定的通信和数据处理 但在某些特定场合 xff0c 不可避免地要用到数学运算 xff0c 尽管单片机并不擅长实现算法和进行复杂的
  • HNU软件能力实训2-9. 字符串压缩

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 给定一个由n个小写字母组成的字符串s xff0c 需要使用最少数量的钱币来压缩它 压缩该字符串 xff0c 必须将s表示为多个相互连接的
  • HNU软件能力实训2-21. 新型冠状病毒(COVID19)传播

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 防控新冠病毒 xff0c 必须时刻引起大家的足够重视 xff0c 特别是人员集中活动场所 xff0c 保持好社交距离 然而 xff0c
  • HNU软件能力实训3-8. ab串

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 给定一个由字符 a 和字符 b 组成的字符串 xff0c 可以删除若干字符 xff0c 使得剩下来的字符串满足前后段为a xff0c 中
  • HNU软件能力实训3-9. 占座位

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 一个人可以去占多个座位 xff0c 而且一定是要连续的座位 xff0c 如果占不到他所要求的这么多座位 xff0c 那么他就一个座位也不
  • ROS编程入门(C++ 及 思路)

    使用Autolabor官方入门教程 xff0c 笔记内容为注意事项 首页 Autolabor开源ROS机器人底盘 官方网站 一 ROS通信机制的解释 例如在生活中 xff0c 我们在家里有一个放零食的箱子 xff0c 而操作服务器就是这个箱
  • HNU软件能力实训4-5. 小希的数表

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 Gardon 昨天给小希布置了一道作业 xff0c 即根据一张由不超过 5000 的 N 3 lt 61 N lt 61 100 个正整
  • HNU软件能力实训4-12. 疫情期间

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 正值新冠疫情期间 xff0c 阿迪没法返回学校学习 xff0c 他希望通过参加一些比赛来提高一下编程技能 xff0c 同时做做运动 他收
  • HNU软件能力实训4-14. 组个最小数

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 给定数字0 9各若干个 你可以以任意顺序排列这些数字 xff0c 但必须全部使用 目标是使得最后得到的数尽可能小 xff08 注意0不能
  • CMakeLists.txt的编写

    首先是编写好的CMakeLists txt文件 span class token function cmake minimum required span span class token punctuation span VERSION
  • 第一课 神经网络与深度学习 第二周 神经网络基础(已完结(虽然有坑))

    视频地址 二分分类 怎么说 xff0c 第一段话就颠覆了我的想象 xff0c 遍历m个样本不需要用for循环 这里是介绍了图片的预处理 xff0c 将图片切分为rgb三个颜色空间 xff08 这个我熟 xff09 xff0c 然后将所有的分
  • leetcode 1200. 最小绝对差

    1200 最小绝对差 span class token keyword class span span class token class name Solution span span class token punctuation sp
  • 648. 单词替换

    648 单词替换 span class token keyword class span span class token class name Solution span span class token punctuation span
  • 1217. 玩筹码

    1217 玩筹码 span class token comment 由题目描述可知 xff0c 移动1步成本为1 移动2步没有成本 那么我们可以不耗费成本的将不同奇数位置的筹码移动到某一个奇数位置 此时的成本为0 同理 也可以将不同偶数位置
  • dronekit控制实体无人机起飞降落

    摘要 xff1a 本文基于dronekit在实体无人机上实现最基本的起飞和降落 xff0c 测试了这一过程中速度的变化以及起落位置的偏移 实体实验环境 树莓派4BUbuntu mate 20 04飞控Pixhawk 2 4 8飞控固件APM

随机推荐

  • Gazebo中针对Gazebo软件或生成模型出现process has died问题的参考方案

    在基于ROS机器人仿真时 xff0c 打开Gazebo经常出现一些问题 xff0c 比如Gazebo窗口打开了 xff0c 终端却显示gazebo进程已死 本文记录了一次遇到的类似问题 xff0c 并给出了在部分情况下能够适用的参考方案 问
  • ROS 入门 (launch文件)

    本章主要内容介绍在ROS中上述问题的解决策略 见本章目录 xff0c 预期达成学习目标也与上述问题对应 xff1a 掌握元功能包使用语法 xff1b 掌握launch文件的使用语法 xff1b 理解什么是ROS工作空间覆盖 xff0c 以及
  • 报错:Multiple annotations found at this line: - user cannot be resolved

    问题 xff1a Multiple annotations found at this line user cannot be resolved 第一步 xff1a 右键找到Build Path 点击Configure Build Path
  • Nuxt 生命周期

    目录 服务端生命周期1 nuxtServerInit nuxt中第一个运行的生命周期 2 RouteMiddleware 第二个 xff1a 中间键 xff0c 路由导航守卫 4 validate 是用来校验url参数符不符合5 async
  • 使用ESP-idf-4.23一次编译通过ESP32-Drone四旋翼无人机代码

    为了编译ESP32 Drone四旋翼无人机代码 xff0c 试用了几种编译环境 xff0c 折腾一个上午 xff0c 最后使用ESP idf 4 23一次性编译通过 记录一下过程 1 获取ESP32 Drone四旋翼无人机项目源代码 xff
  • 基于ESP32四旋翼无人机如何根据PID算法进行电机的PWM duty补偿

    1 计算模型 电机位置和补偿输出的关系 xff0c 需要求解的是C1 C2 C3 C4的电机输出补偿值 分别对应M1 M2 M3 M4四个电机 2 推导过程 xff08 可以跳过不看 xff0c 直接到第三步 xff09 3 四个电机的PI
  • 基于ESP32四旋翼无人机的MPU6050姿态数据采集和处理方式

    1 MPU6050姿态数据采集和处理 在DMP任务里面采集MPU6050的四元数的姿态数据 xff0c 然后解算出机体坐标系的三个角姿态角 dmp task任务通过消息队列将姿态角发送给姿态控制程序 dmp task gt dandelio
  • 基于ESP32四旋翼无人机同蓝牙遥控器通信处理方式

    1 蓝牙初始化 在app main调用函数初始化蓝牙 inf ble gatt init 2 判断蓝牙是否链接 在dandelion task中调用函数inf ble gatt connected 判断蓝牙是否链接 xff0c 进而调用da
  • 论文Handheld Multi-Frame Super-Resolution的相关学习笔记

    导语 这里汇总了阅读这篇论文可能会参考到的相关知识汇总 xff0c 这篇主要为了让自己查找方便 但是也希望阅读这篇博文的你能够通过我的笔记更快理解 上手这篇论文 文章题目 xff1a Hand held Multi frame super
  • ASP读EXCEL2000的文章!!!

    由于工作需要 要用ASP读取EXCEL的工资单 所以在网上找了些资料 写了以下程序 送给大家 xff1a xff09 lt 39 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • Linux下软件安装方法

    对于Linux初学者来说 xff0c 安装一个很小的软件恐怕都是一件很让人头疼的事 xff0c 因为在Linux下安装软件不像在 Windows中那样简单 在Linux中大多数软件提供的是源代码 xff0c 而不是现成的可执行文件 xff0
  • linux指令大全(二)

    cat cd chmod chown cp cut 名称 xff1a cat 使用权限 xff1a 所有使用者 使用方式 xff1a cat AbeEnstTuv help version fileName 说明 xff1a 把档案串连接后
  • 详解C++STL容器系列(一)—— vector的详细用法和底层原理

    目录 一 介绍二 vector的创建和方法创建vector方法 三 vector的具体用法3 1 遍历vector3 1 1 迭代器访问3 1 2 下标访问3 1 3 范围for循环 3 2 vector 容量和大小3 3 vector 常
  • FTP的命令行格式

    From LinuxSir org 非常感谢javalee大哥 FTP的命令行格式为 xff1a ftp v d i n g 主机名 xff0c 其中 v 显示远程服务器的所有响应信息 xff1b n 限制ftp的自动登录 xff0c 即不
  • 一句话问答(网络无关篇+网络相关篇)

    一句话问答 网络无关篇 43 网络相关篇 网络无关篇 0001 修改主机名 vi etc sysconfig network xff0c 修改HOSTNAME一行为HOSTNAME 61 主机名 xff0c 重启后也能生效 0002 Ret
  • linux下各种分区的自动挂载和卸载.

    目前实现分区自动挂载 卸载的方法 我知道的 有两种 一种是supermount 一种是automount supermount要重新编译内核 而且不稳定 这里就不介绍了 我介绍一下automount的使用方法 首先确认你的linux已经安装
  • Linux 挂载文件系统

    1 挂载点必须是一个目录 2 一个分区挂载在一个已存在的目录上 xff0c 这个目录可以不为空 xff0c 但挂载后这个目录下以前的内容将不可用 对于其他操作系统建立的文件系统的挂载也是这样 但是需要理解的是 xff1a 光盘 软盘 其他操
  • 新浪网人力资源总监段冬聊企业对人才的需求

    http edu sina com cn l 2004 12 02 ba93631 shtml 新浪网人力资源总监段冬聊企业对人才的需求 http www sina com cn 2004 12 02 21 03 新浪教育 图为新浪网人力资
  • RESIN FAQ

    RESIN FAQ 环境变量设置 CLASSPATH C j2sdk lib dt jar C j2sdk lib tools jar JAVA HOME C j2sdk PATH C j2sdk bin 61 61 61 61 61 61
  • 研究基于PX4平台的Ardupilot代码工程的makefile结构

    最近有空 xff0c 于是想花时间好好研究下ardupilot的软件架构 xff0c 经过对ardupilot一段时间的熟悉和使用后 xff0c 对其软件架构已经有了一定的理解 xff0c 但还称不上特别完备 xff0c 所以想把每一部分的