PX4开源工程开发/发布版本一致性核对

1. 源由

研发过程中,通常可以分为两类固件:

  1. 工程师版本(Debug)
  2. 产品/项目版本(Release)

如何确认工程师版本和产品/项目版本的一致性问题,对于发布版本管理来说至关重要。

若稍有不慎,将会带来灾难!

2. 编译步骤

2.1 安装 Python 虚拟环境工具

$ sudo apt install python3-venv

注:如果没有安装过虚拟环境。

2.2 初始化PX4-Autopilot编译环境

$ git clone git@github.com:PX4/PX4-Autopilot.git
$ cd PX4-Autopilot
$ ./Tools/setup/ubuntu.sh

2.3 创建并激活虚拟环境

$ python3 -m venv ~/px4-python-env
$ source ~/px4-python-env/bin/activate

注:例如在 home 目录下安装了虚拟环境。

2.4 后续使用 PX4 工具时,需要先激活虚拟环境

$ source ~/px4-python-env/bin/activate
$ cd PX4-Autopilot
$ git submodule update --init --recursive

2.5 编译代码

2.5.1 仿真环境

$ make px4_sitl gz_x500

2.5.2 mRo Pixracer

$ make px4_fmu-v4_default

2.5.3 mRo Pixhawk Flight Controller (Pixhawk 1)

$ make px4_fmu-v3_default

2.6 退出虚拟环境

$ deactivate

4. 构建目标

PX4开源工程结构简明介绍角度看,真实构建的目的是获取:

$ ls build/holybro_kakutef7_default/holybro_kakutef7_default.* -lhs
852K -rwxrwxr-x 1 daniel daniel 852K Jul  1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.bin
 19M -rwxrwxr-x 1 daniel daniel  19M Jul  1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.elf
3.9M -rw-rw-r-- 1 daniel daniel 3.9M Jul  1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.map
788K -rw-rw-r-- 1 daniel daniel 787K Jul  1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.px4

打包内容以上四个文件将会是一个不错的选择,方便后续调试定位。

3. 问题分析

实际在gcc编译过程中,会引入一些时间、编译用户等一些环境信息,这些信息会导致编译出来的二进制MD5SUm值不一致。

从而导致研发和版本发布之间造成不小的一致性问题。

3.1 方法一

采用以下步骤,从另一个维护来保证一致性:

$ make distclean
$ rm -rf build
$ export SOURCE_DATE_EPOCH=1700000000
$ make px4_fmu-v3_default

从实际测试的结果看,本地编译,不同时间点,编译结果一致。

daniel@daniel-P15v:~/Work/PX4-Autopilot$ strings build/px4_fmu-v3_default/px4_fmu-v3_default.bin | grep daniel
/home/daniel/Work/PX4-Autopilot/src/drivers/px4io/px4io_uploader.cpp
/home/daniel/Work/PX4-Autopilot/src/systemcmds/hardfault_log/hardfault_log.c
/home/daniel/Work/PX4-Autopilot/platforms/nuttx/src/px4/stm/stm32_common/adc/adc.cpp
/home/daniel/Work/PX4-Autopilot/src/drivers/uavcan/uavcan_drivers/stm32/driver/src/uc_stm32_can.cpp
/home/daniel/Work/PX4-Autopilot/platforms/nuttx/src/px4/stm/stm32_common/spi/spi.cpp

但仍然存在其他环境变量,比如:用户名

3.2 方法二

在方法一的基础上,采用机器指令对比分析:

$ make distclean
$ rm -rf build
$ export SOURCE_DATE_EPOCH=1700000000
$ make px4_fmu-v3_default
$ arm-none-eabi-objdump -d build/px4_fmu-v3_default/px4_fmu-v3_default.elf > px4_fmu-v3_default.asm
daniel@daniel-P15v:~/Work/PX4-Autopilot$ strings px4_fmu-v3_default.asm |grep daniel
 8191c08:       6e61642f 2f6c6569 6b726f57 3458502f     /daniel/Work/PX4
 81add14:       696e6164 572f6c65 2f6b726f 2d345850     daniel/Work/PX4-
 81dcc88:       696e6164 572f6c65 2f6b726f 2d345850     daniel/Work/PX4-
 81f18f8:       0801d3c3 6d6f682f 61642f65 6c65696e     ..../home/daniel

从上面可以看到一些与文件路径相关的内容,可能是__FILE__或者环境变量引入的内容。

3.3 方法三

在方法一或二的基础上,再增加同样的编译路径,确保输出编译结果的一致性。

4. 总结

总体来说,通过以下三点,基本上能够使用传统的md5sum进行对比。

  • 固定编译时间点 export SOURCE_DATE_EPOCH=1700000000
  • 固定编译相对路径

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4开源工程结构简明介绍
【3】PX4开发环境搭建–模拟器编译及QGroundControl & RC遥控模拟配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值