在树莓派Raspbian系统上使用的编译工具链为 arm-linux-gnueabihf,而Payload_SDK_V2.0.0-build.138是支持arm-linux-gnueabi 平台的,并提供有该平台的lib文件。
但需要注意Raspbian上使用的编译工具链默认采用的是硬件浮点方式,因此如果直接在树莓派上对PSDK2.0进行本地编译会有如下报错信息:
“error ... uses VFP register arguments ... does not”
虽然 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别只不过是 gcc 编译选项 -mfloat-abi 的默认值不同,但如果在编译选项CFLAG中增加 “ -mfloat-abi=softfp ”(使用软件浮点方式进行编译),会产生新的报错:
“/usr/include/arm-linux-gnueabihf/gnu/stubs.h:7:11: fatal error: gnu/stubs-soft.h:
没有那个文件或目录 # include <gnu/stubs-soft.h>”
意思是,缺少stubs-soft.h文件无法进行软件浮点编译,定位该目录下你会发现的确找不到该文件,问题原因可能在于树莓派的Raspbian自带的arm-linux-gnueabihf不是完整版(根本原因可能需要再做进一步探讨)。
问题原因找到了,最方便快捷的解决方法就是使用arm-linux-gnueabi的编译工具链编译PSDK2.0,编译后的代码同样支持在树莓派2上运行。该编译工具链可以在linaro平台上获取, https://releases.linaro.org/components/toolchain/binaries/
关于GCC的-mfloat-abi编译选项
gcc的选项-mfloat-abi有三种值soft,softfp,hard,其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容。
soft |
不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。 |
softfp |
armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。 |
hard |
armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。 |
编译方法
具体编译方法可以参考如下(使用x86_64架构的Ubuntu主机进行交叉编译)
- 到 https://releases.linaro.org/components/toolchain/binaries/ 选择编译工具链的版本/类型,比如 gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi
- 解压编译工具链到某个目录,比如 /opt/toolchain/
- 下载 Payload SDK V2.0.0-build.138 开发包到X86_64的ubuntu主机中
- 进入到 sample linux 目录下执行 “cp -a manifold2 raspberryPi2MbV1.1_armv7l_eabi”
- 修改 CMakeLists.txt (绿色字体为修改和新增的内容)
第一处 |
set(CMAKE_C_COMPILER /opt/toolchain/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc) set(CMAKE_CXX_COMPILER /opt/toolchain/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++) |
第二处 |
## Srcs file(GLOB_RECURSE APP_SRC ../../raspberryPi2MbV1.1_armv7l_eabi/application/*.c ../../raspberryPi2MbV1.1_armv7l_eabi/hal/*.c) file(GLOB_RECURSE COMMON_SRC ../../common/*.c) file(GLOB_RECURSE SAMPLE_SRC ../../../../api_sample/*.c) |
第三处 |
## Include directories and library ## if (DEVICE_SYSTEM_ID MATCHES x86_64) ## link_directories(${CMAKE_CURRENT_LIST_DIR}/../../../../../psdk_lib/lib/x86_64-linux-gnu-gcc) ## link_libraries(${CMAKE_CURRENT_LIST_DIR}/../../../../../psdk_lib/lib/x86_64-linux-gnu-gcc/libpayloadsdk.a) ## elseif (DEVICE_SYSTEM_ID MATCHES aarch64) ## link_directories(${CMAKE_CURRENT_LIST_DIR}/../../../../../psdk_lib/lib/aarch64-linux-gnu-gcc) ## link_libraries(${CMAKE_CURRENT_LIST_DIR}/../../../../../psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a) ## endif () link_directories(${CMAKE_CURRENT_LIST_DIR}/../../../../../psdk_lib/lib/arm-linux-gnueabi-gcc) link_libraries(${CMAKE_CURRENT_LIST_DIR}/../../../../../psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a) |
- 修改串口编号,填写APP信息
- 编译
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
8. 上传编译后的可执行程序到树莓派
chmod 775 文件名
sudo chmod 777 /dev/xxx
执行!
此篇文章分享自 Bruce,如果您有什么疑问或者建议欢迎回复讨论~ 欢迎点赞哦!
评论
2 条评论
PSDK3.2版本的代码,按照上述方法依然cmake报错
Dear Bruce Cheung, dear DJI,
I'm currently on the PSDK version 3.5. I followed your compilation process modifying the corresponding files CMakeLists.txt.
I'm compiling on the Raspberry Pi 4 model b,
I've been trying the gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi.tar.xz, gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz.
- With aarch64-linux-gnu-gcc, after running the command : make --> I'm getting the following error :
/usr/bin/ld: ../../../../../../samples/sample_c/platform/linux/raspberryPi2MbV1.1_armv7l_eabi/../../../../../psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a: error adding symbols: file format not recognized
- With arm-linux-gnueabi-gcc/, after running the command : make --> I'm getting the following error :
/usr/bin/ld: error: ../../../../../bin/dji_sdk_demo_linux uses VFP register arguments, ../../../../../../samples/sample_c/platform/linux/raspberryPi2MbV1.1_armv7l_eabi/../../../../../psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a(dji_flight_controller_param_config.c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../../../../../../samples/sample_c/platform/linux/raspberryPi2MbV1.1_armv7l_eabi/../../../../../psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a(dji_flight_controller_param_config.c.o)
I look forward to your reply,
Respectfully,
DURAND Hugo
请登录写评论。