当前位置: 首页 > article >正文

保姆级教程:在Ubuntu 18.04上为Firefly RK3399 ProC交叉编译Python 3.7.10(含zlib、numpy、pyserial)

嵌入式开发实战为Firefly RK3399 ProC构建定制Python 3.7环境当你在Firefly RK3399 ProC开发板上尝试运行Python科学计算脚本时是否遇到过性能瓶颈或依赖缺失的困扰不同于x86平台的即装即用ARM架构的嵌入式设备往往需要从源码开始构建完整的Python运行环境。本文将带你深入实践从零开始为这块高性能开发板交叉编译包含关键科学计算库的Python 3.7.10环境。1. 交叉编译基础环境搭建在Ubuntu 18.04主机上我们需要先配置完整的交叉编译工具链。Firefly官方推荐的gcc-linaro-7.5.0工具链已经针对RK3399的Cortex-A72/A53架构进行了优化wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz sudo tar -xJf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt配置环境变量时建议将以下内容添加到~/.bashrc中export PATH/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH export CROSS_COMPILEaarch64-linux-gnu- export CC${CROSS_COMPILE}gcc export CXX${CROSS_COMPILE}g验证工具链是否生效aarch64-linux-gnu-gcc --version2. 关键依赖库的交叉编译2.1 zlib库的编译技巧zlib作为Python的基础依赖其交叉编译需要特别注意ABI兼容性问题。以下是针对RK3399的优化配置./configure --prefix/opt/rk3399/zlib \ --shared \ --archs-marcharmv8-acrc -mtunecortex-a72.cortex-a53修改Makefile关键参数CCaarch64-linux-gnu-gcc ARaarch64-linux-gnu-ar rc RANLIBaarch64-linux-gnu-ranlib CFLAGS-O3 -fPIC -D_LARGEFILE64_SOURCE12.2 libffi的隐藏陷阱许多开发者遇到的_ctypes模块缺失问题根源在于libffi的交叉编译配置不当。正确的编译姿势是./configure --hostaarch64-linux-gnu \ --prefix/opt/rk3399/libffi \ --enable-shared \ --disable-multi-os-directory编译完成后需要检查生成的.so文件架构file /opt/rk3399/libffi/lib/libffi.so.7.1.03. Python 3.7.10的深度定制编译3.1 配置阶段的黄金参数针对嵌入式场景的Python编译这些配置选项值得特别关注./configure CC${CROSS_COMPILE}gcc \ CXX${CROSS_COMPILE}g \ AR${CROSS_COMPILE}ar \ RANLIB${CROSS_COMPILE}ranlib \ --hostaarch64-linux-gnu \ --buildx86_64-linux-gnu \ --prefix/opt/python3.7 \ --enable-shared \ --with-system-ffi/opt/rk3399/libffi \ --with-ensurepipinstall \ ac_cv_file__dev_ptmxyes \ ac_cv_file__dev_ptcyes关键参数解析--enable-shared生成动态库而非静态链接ac_cv_file__dev_ptmx绕过伪终端设备检查--with-system-ffi指定交叉编译的libffi路径3.2 Modules/Setup.dist的魔法修改要使zlib支持正常工作需要取消以下注释并修改路径#zlib zlibmodule.c -I/opt/rk3399/zlib/include -L/opt/rk3399/zlib/lib -lz对于嵌入式开发建议禁用不需要的模块以减小体积#_csv _csv.c #_curses _cursesmodule.c -lcurses -ltermcap4. 科学计算生态的构建4.1 NumPy的交叉编译艺术交叉编译NumPy需要特殊的编译标志和host-python配合export BLASNone LAPACKNone ATLASNone export NPY_DISABLE_SVML1 export _PYTHON_HOST_PLATFORMlinux-aarch64 python3 setup.py build --cross-compile \ --plat-namelinux-aarch64 \ install --prefix/opt/python3.7常见问题处理如果遇到numpy/core/src/umath/loops.c.src编译错误尝试export CFLAGS-O1 -fno-tree-vectorize4.2 PySerial的轻量级集成串口通信库的交叉编译相对简单但需要注意ABI兼容性检查export PYTHONPATH/opt/python3.7/lib/python3.7/site-packages python3 setup.py install --prefix/opt/python3.7验证生成的egg文件架构unzip -l pyserial-3.4-py3.7.egg | grep .so5. 部署与优化实战5.1 文件系统的精简化处理使用以下命令可以显著减小部署包体积find /opt/python3.7 -name *.pyc -delete find /opt/python3.7 -name __pycache__ -exec rm -rf {} strip /opt/python3.7/bin/python3.75.2 环境变量的智能配置开发板上的/etc/profile应包含export PYTHONHOME/opt/python3.7 export PATH$PYTHONHOME/bin:$PATH export LD_LIBRARY_PATH$PYTHONHOME/lib:$LD_LIBRARY_PATH5.3 性能调优参数在/opt/python3.7/lib/python3.7/siteconfig.py中添加import sys sys.setrecursionlimit(2000) sys.setcheckinterval(100)6. 验证与调试技巧6.1 基础功能测试创建test.py脚本验证核心功能import numpy as np import serial print(NumPy array:, np.random.rand(3,3)) print(PySerial version:, serial.__version__)6.2 常见问题排查指南现象可能原因解决方案ImportError: libpython3.7m.so not found库路径未配置检查LD_LIBRARY_PATHModuleNotFoundError: _ctypeslibffi未正确链接重新编译带libffi支持的Pythonnumpy导入段错误编译参数不匹配使用-O1优化而非-O36.3 性能对比测试在RK3399 ProC上运行矩阵运算测试import time import numpy as np start time.time() a np.random.rand(1000,1000) b np.random.rand(1000,1000) np.dot(a, b) print(Time:, time.time()-start)典型结果应优于2秒若性能异常需检查CPU频率是否锁定在性能模式是否启用了NEON指令集内存分配是否正常7. 扩展应用场景7.1 机器学习框架支持对于TensorFlow Lite等框架需要额外编译以下依赖# 编译Cython export PYTHONHOME/opt/python3.7 python3 setup.py install --prefix$PYTHONHOME7.2 硬件加速集成利用RK3399的NPU加速可通过修改NumPy的BLAS实现import os os.environ[OPENBLAS_CORETYPE] ARMV87.3 容器化部署方案创建最小化DockerfileFROM arm64v8/ubuntu:18.04 COPY python3.7 /opt/python3.7 ENV PYTHONHOME/opt/python3.78. 进阶技巧与替代方案8.1 交叉编译缓存优化通过ccache加速重复编译sudo apt install ccache export CCccache aarch64-linux-gnu-gcc8.2 多版本Python共存方案使用update-alternatives管理多版本sudo update-alternatives --install /usr/bin/python python /opt/python3.7/bin/python3.7 18.3 Buildroot集成方案对于量产环境建议在Buildroot中集成PYTHON3_VERSION 3.7.10 PYTHON3_SITE https://www.python.org/ftp/python/$(PYTHON3_VERSION) PYTHON3_DEPENDENCIES host-python3 libffi zlib实际部署中发现在RK3399 ProC上运行科学计算任务时适当限制CPU核心数反而能获得更稳定的性能表现。这可能是由于ARM big.LITTLE架构的调度特性所致。建议关键任务绑定到大核执行import os os.sched_setaffinity(0, {4,5}) # 绑定到Cortex-A72核心

相关文章:

保姆级教程:在Ubuntu 18.04上为Firefly RK3399 ProC交叉编译Python 3.7.10(含zlib、numpy、pyserial)

嵌入式开发实战:为Firefly RK3399 ProC构建定制Python 3.7环境 当你在Firefly RK3399 ProC开发板上尝试运行Python科学计算脚本时,是否遇到过性能瓶颈或依赖缺失的困扰?不同于x86平台的即装即用,ARM架构的嵌入式设备往往需要从源码…...

从‘炼丹’到‘工程’:复盘InceptionV3论文中那些被验证与‘打脸’的设计(附代码对比)

从‘炼丹’到‘工程’:InceptionV3设计思想的现代验证与技术启示 当我们在2023年回望2015年问世的InceptionV3架构,会发现它像一座横跨深度学习"炼丹时代"与"工程时代"的桥梁。这篇论文最珍贵的遗产不是某个具体模块,而是…...

Inspirit Capital将收购Kaplan Languages Group

专注于企业分拆业务投资的Inspirit Capital欣然宣布,计划从Kaplan手中收购全球领先的语言教育平台KLG Kaplan Languages Group (“KLG”)。本次出售的所有条件均已达成,预计交易将于5月1日完成。 KLG旗下拥有Kaplan International Languages、Alpadia L…...

别再混淆了!用Keil MDK调试Cortex-M3/M4时,MSP和PSP到底怎么切换的?

别再混淆了!用Keil MDK调试Cortex-M3/M4时,MSP和PSP到底怎么切换的? 调试嵌入式系统时,堆栈指针的切换问题常常让开发者头疼。特别是在RTOS环境下,MSP(主堆栈指针)和PSP(进程堆栈指针…...

文科生逆袭!零基础转行AI,我靠AI工具直接涨薪50%!

本文分享了作者从文科背景转行AI的成功经验。作者首先打破文科生不适合进入AI行业的误区,选定AI产品和提示词工程师作为切入点。接着,作者通过大量使用AI工具建立AI体感,并制作了一个轻量级的项目作品集,展示了如何利用AI工具梳理…...

告别书签混乱:3步打造你的Chrome浏览器高效书签管理系统

告别书签混乱:3步打造你的Chrome浏览器高效书签管理系统 【免费下载链接】neat-bookmarks A neat bookmarks tree popup extension for Chrome [DISCONTINUED] 项目地址: https://gitcode.com/gh_mirrors/ne/neat-bookmarks 你是否经常在浏览器中迷失方向&am…...

废旧元件DIY太阳能光控LED灯串设计

1. 项目概述这个用废旧零件拼凑起来的模拟电路项目,完美诠释了"变废为宝"的DIY精神。它由太阳能板、锂电池和几颗白光LED组成,打造出了一串既环保又充满魅力的装饰灯串。在这个被各种专用芯片和微控制器统治的时代,这个项目提醒我们…...

别再被老视频的“毛边”困扰了!手把手教你用TW9912芯片搞定隔行转逐行(附原理详解)

告别隔行扫描困扰:TW9912芯片实战指南与画质优化 想象一下,当你翻出珍藏多年的家庭录像带,满怀期待地将其数字化后,却发现播放时画面布满锯齿和闪烁——这种失落感恐怕只有经历过的人才能体会。隔行扫描技术曾是电视黄金时代的基石…...

Cadence Virtuoso 新手避坑指南:从原理图到版图,手把手搞定 AMI 0.6u 工艺下的 MOS 管仿真

Cadence Virtuoso 新手避坑指南:从原理图到版图,手把手搞定 AMI 0.6u 工艺下的 MOS 管仿真 第一次打开 Cadence Virtuoso 时,复杂的界面和密密麻麻的菜单栏让不少集成电路专业的学生望而生畏。尤其是当教授要求用 AMI 0.6u 工艺完成 MOS 管仿…...

从调光到伽马校正:手把手教你用ILI9341命令优化TFT屏幕显示效果(实战避坑)

从调光到伽马校正:手把手教你用ILI9341命令优化TFT屏幕显示效果(实战避坑) 在嵌入式开发中,TFT屏幕的显示效果往往直接影响用户体验。许多开发者在使用ILI9341驱动芯片时,虽然能够完成基础显示功能,却常常忽…...

拆解一块TFT-LCD屏幕:聊聊驱动板上那颗Power IC是怎么‘发电’的

拆解一块TFT-LCD屏幕:驱动板上那颗Power IC的电力魔法 站在电子爱好者的视角,拆解一块TFT-LCD屏幕总能带来意想不到的惊喜。当我们小心翼翼地剥离背光模组和偏光片,露出那块布满精密电路的PCB时,最引人注目的往往是那颗被众多电容…...

用MPX4115气压传感器和51单片机做个简易气压计(附完整代码与电路图)

从零构建基于MPX4115的智能气压监测系统:硬件连接、代码解析与实战调试 气压监测在气象观测、无人机高度控制、工业设备监控等领域有着广泛应用。今天我们将使用经典的51单片机(以STC89C52为例)和MPX4115气压传感器,打造一个具备实…...

智能补光灯DIY:用STM32和BH1750传感器自动调节LED亮度(含PID算法)

智能补光灯DIY:用STM32和BH1750传感器实现闭环调光系统 深夜伏案工作时,你是否经常因为环境光线不足导致眼睛疲劳?传统台灯需要手动调节亮度,而市面上的智能灯具价格昂贵且功能单一。今天我们将用STM32单片机和BH1750光照传感器&a…...

AI智能体的正确打开方式

先说结论2026年,AI不再只是"你问我答"的聊天框,而是能自己干活、自己决策的智能体。不会用智能体的人,就像有驾照却只会骑自行车。这个东西是什么想象一下:你有一个实习生,你不用手把手教他每一步&#xff0…...

别再乱打拍了!从亚稳态到异步FIFO,手把手教你搞定FPGA跨时钟域信号处理

从亚稳态到异步FIFO:FPGA跨时钟域信号处理实战指南 在FPGA和数字IC设计中,跨时钟域信号处理是一个永恒的话题。每当项目进度紧张、调试压力增大时,工程师们最不愿看到的就是时序报告里那些令人头疼的违例警告。我曾在一个高速数据采集项目中…...

你的FOC电机为啥抖?可能是电角度算错了!聊聊编码器安装与极对数那些坑

你的FOC电机为啥抖?可能是电角度算错了!聊聊编码器安装与极对数那些坑 调试FOC电机时,最让人头疼的莫过于电机运行时抖动、噪音大甚至无法启动。很多工程师在搭建完FOC系统后,发现电机运行效果远不如预期,这时候问题往…...

告别手动输入!用ABAP OOALV事件给报表字段加个“智能下拉框”

告别手动输入!用ABAP OOALV事件给报表字段加个"智能下拉框" 在SAP系统的日常操作中,物料编码、供应商编号等字段的输入是高频且容易出错的操作环节。传统的手工输入不仅效率低下,还容易因记忆偏差导致数据错误。本文将深入探讨如何…...

保姆级教程:用示波器和CAN分析仪抓取并解析错误帧(附波形图)

实战指南:用示波器与CAN分析仪精准捕获错误帧的完整流程 在汽车电子和工业控制领域,CAN总线就像神经系统的传导通路,而错误帧则是这条通路上最需要警惕的异常信号。想象一下,当你驾驶的汽车突然出现仪表盘闪烁或动力系统报警&…...

统信UOS桌面效率翻倍秘籍:用好工作区和窗口分屏,告别杂乱无章的桌面

统信UOS桌面效率革命:工作区与分屏的进阶玩法 刚接触统信UOS的Windows/macOS用户,面对全新的桌面环境往往手足无措——浏览器、文档、聊天软件窗口杂乱堆叠,频繁切换导致效率低下。其实,UOS内置的工作区(虚拟桌面&…...

统信UOS蓝牙管理实战:从服务控制到硬件开关

1. 统信UOS蓝牙管理入门指南 第一次接触统信UOS的蓝牙管理时,我完全被各种专业术语搞晕了。后来才发现,其实掌握几个核心命令就能解决90%的日常问题。作为国产操作系统的代表,统信UOS在蓝牙管理方面提供了完整的命令行工具链,特别…...

用户习惯报告:UG/NX用户使用习惯与模块偏好分析

又抢不到软件许可了?别急,别急,我来跟你唠唠过往在项目上线前,我跟团队蹲在机房门口,眼巴巴看着别人用着许可,自己这边却偏偏连个空位都抢不到。你说心塞不?这一年的加班,一半是赶进…...

Autolabel:如何用3步流程解决数据标注的世纪难题?

Autolabel:如何用3步流程解决数据标注的世纪难题? 【免费下载链接】autolabel Label, clean and enrich text datasets with LLMs. 项目地址: https://gitcode.com/gh_mirrors/au/autolabel 想象一下,你的机器学习团队正在构建一个银行…...

WindowResizer:如何轻松强制调整任何Windows窗口尺寸的完整指南

WindowResizer:如何轻松强制调整任何Windows窗口尺寸的完整指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽调整大小的应用程序窗口而烦恼吗&am…...

【WRF-DART第2.5期】准备观测数据 (Prepare observations)

目录 1. 教程捷径 vs. 实际应用 2. DART 观测处理的核心概念 3. 核心实操:PREPBUFR 数据的两阶段转换流程 Step3.1-下载原始数据并解压 Step3.2-安装文本转换工具 Step3.3-执行数据转换 4. 官方建议与替代方案 (Hint) 参考 在数据同化(Data Assimilation)中,模型需要摄入真…...

【PCIe】深入解析 Scaled Flow Control:如何通过 Scaling Factor 突破流控瓶颈

1. 为什么我们需要Scaled Flow Control? 我第一次接触PCIe流控机制时,被一个看似简单的数字难住了——为什么Header Credit最大只能到127?这个问题困扰了我整整两周。直到在某个芯片调试现场,亲眼看到RX Buffer溢出的红色告警灯亮…...

实战指南:如何用Code2Prompt将代码库转换为AI可理解的高质量提示

实战指南:如何用Code2Prompt将代码库转换为AI可理解的高质量提示 【免费下载链接】code2prompt A CLI tool to convert your codebase into a single LLM prompt with source tree, prompt templating, and token counting. 项目地址: https://gitcode.com/GitHub…...

告别繁琐模拟器:在Windows上直接运行Android应用的终极指南

告别繁琐模拟器:在Windows上直接运行Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾在电脑上运行Android应用时&#xff0c…...

从TOPS到DMIPS:解码芯片算力指标的实战指南

1. 算力指标:从概念到实战的认知地图 第一次拿到芯片规格书时,我被满屏的TOPS、DMIPS、FLOPs绕晕了——这些字母组合就像加密电报,明明每个字母都认识,连起来却完全看不懂。后来在智能驾驶芯片选型项目中踩过几次坑才明白&#xf…...

医疗信息化转型的微服务架构实践:基于Spring Cloud的智慧医疗平台建设

医疗信息化转型的微服务架构实践:基于Spring Cloud的智慧医疗平台建设 【免费下载链接】HIS HIS英文全称 hospital information system(医疗信息就诊系统),系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务…...

从Dropdown展开方向,聊聊Unity UGUI RectTransform锚点与轴心点的那些“坑”与最佳实践

从Dropdown展开方向剖析RectTransform的锚点与轴心点设计哲学 在Unity UGUI开发中,Dropdown控件的展开方向问题就像一面镜子,照出了许多开发者对RectTransform系统的理解盲区。我曾亲眼目睹一个资深开发者在调整下拉菜单方向时,反复修改Pos Y…...