3. 开发环境搭建

开发环境搭建,说白了就是给你的边缘设备“装系统”和“配工具”。这一步搞不定,后面所有算法都跑不起来。我见过不少团队,算法在PC上跑得飞起,一到边缘端就各种报错,十有八九是环境没配好。

这一章,我们聚焦三件事:交叉编译环境、系统烧录、远程连接。这三板斧抡圆了,你就能在工位上舒舒服服地调试边缘设备了。

3.1 交叉编译环境配置

边缘设备通常算力有限,没法直接在板子上编译大型项目。所以我们在PC上编译,生成目标设备能运行的二进制文件——这就是交叉编译。

3.1.1 工具链安装

以我们课程使用的RK3588平台为例,工具链是aarch64-linux-gnu-系列。我个人习惯用Linaro的预编译版本,稳定且社区活跃。

# 下载工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/

# 配置环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
小提示: 建议把环境变量写入 ~/.bashrc 或 ~/.zshrc,避免每次开终端都要重新 export。我一般还会写个 setenv_rk3588.sh 脚本,方便切换不同平台。

3.1.2 验证工具链

装完别急着走,先验证一下。写个简单的C程序,交叉编译看看。

# 编写测试文件
echo '#include <stdio.h>
int main() { printf("Hello, Edge AI!\n"); return 0; }' > test.c

# 交叉编译
aarch64-linux-gnu-gcc test.c -o test_arm

# 查看生成文件的架构
file test_arm
# 输出应为:test_arm: ELF 64-bit LSB executable, ARM aarch64, ...

看到ARM aarch64字样,说明工具链工作正常。我曾经遇到过工具链版本不对,编译出来的程序在板子上段错误,折腾了两天才发现是glibc版本不匹配。嗯,这里要注意:工具链的glibc版本必须与板子上的系统一致。

3.1.3 第三方库交叉编译

工业缺陷检测离不开OpenCV、TensorFlow Lite这些库。它们也需要交叉编译。

库名称 交叉编译关键参数 常见坑点
OpenCV -DCMAKE_TOOLCHAIN_FILE=... -DWITH_GTK=OFF NEON优化默认开启,但需确认编译器支持
TensorFlow Lite -DTFLITE_ENABLE_XNNPACK=ON 需手动指定--target_arch=aarch64
FFmpeg --cross-prefix=aarch64-linux-gnu- --enable-cross-compile 依赖库如x264也需要交叉编译
避坑指南: 我曾经在交叉编译OpenCV时,忘记关闭GTK支持,结果编译出来的库在板子上缺少GTK运行时,直接崩溃。工业场景下,我们一般用Qt或直接操作FrameBuffer,所以 WITH_GTK=OFF 是必选项。

3.2 刷机与系统烧录

交叉编译环境配好了,接下来要给板子装系统。这一步就像给手机刷ROM,搞不好就变砖。别怕,按步骤来。

3.2.1 准备工作

  • 硬件: 开发板(RK3588)、USB Type-C数据线、电源适配器、MicroSD卡(可选)
  • 软件: RKDevTool(瑞芯微官方烧录工具)、系统镜像(.img文件)

你想想看,烧录最怕什么?怕断电。所以电源一定要稳,我一般用实验室的稳压电源,不用USB口供电。

3.2.2 烧录步骤

  1. 进入烧录模式: 按住板子上的RECOVERY键,再按一下RESET键,然后松开RECOVERY键。板子会进入Loader模式。
  2. 连接PC: 用USB Type-C线连接板子和电脑。打开RKDevTool,如果看到“发现一个Loader设备”,说明连接成功。
  3. 选择镜像: 在RKDevTool中,点击“固件”按钮,选择你的系统镜像文件(比如RK3588_Ubuntu_22.04.img)。
  4. 开始烧录: 点击“升级”按钮。进度条走完,板子会自动重启。
核心要点: 烧录过程中不要拔线,不要断电。如果进度条卡住超过5分钟,大概率是镜像文件损坏或USB线有问题。换根线试试,我遇到过劣质线导致烧录失败的情况。

3.2.3 系统验证

烧录完成后,板子重启。接上HDMI显示器和键盘,你会看到Ubuntu的登录界面。默认用户名和密码通常是root或rockchip,具体看镜像说明。

# 登录后查看系统信息
uname -a
# 输出类似:Linux rk3588 5.10.66 #1 SMP ... aarch64 GNU/Linux

# 查看CPU信息
lscpu | grep Architecture
# 输出:Architecture: aarch64

看到aarch64,说明系统跑起来了。这时候你可以插上网线,准备远程连接。

3.3 SSH远程连接与文件传输

工业现场,你不可能每次都抱着显示器和键盘去接板子。SSH远程连接是必备技能。

3.3.1 开启SSH服务

大多数Ubuntu镜像默认没开SSH服务。我们手动开启一下。

# 更新软件源
apt update

# 安装SSH服务
apt install openssh-server -y

# 启动SSH服务
systemctl start sshd
systemctl enable sshd

# 查看IP地址
ip addr show

记下板子的IP地址,比如192.168.1.100。然后在你的PC上连接。

# PC终端执行
ssh root@192.168.1.100

输入密码,你就进入了板子的终端。从现在开始,你可以像操作本地服务器一样操作板子了。

小技巧: 配置SSH密钥登录,省去每次输密码的麻烦。用 ssh-keygen 生成密钥对,然后把公钥传到板子上:ssh-copy-id root@192.168.1.100。我所有边缘设备都配了密钥,批量管理时特别方便。

3.3.2 文件传输

交叉编译好的程序怎么传到板子上?我常用两种方式。

工具 命令示例 适用场景
scp scp test_arm root@192.168.1.100:/home/ 单个文件或小批量传输
rsync rsync -avz ./build/ root@192.168.1.100:/opt/app/ 目录同步、增量传输、大项目部署

我个人更推荐rsync。它支持断点续传,而且只传变化的部分。有一次我部署一个200MB的模型,网络不稳定断了三次,rsync每次都能接着传,省了不少时间。

3.3.3 远程调试

文件传过去了,怎么调试?我一般用gdb的远程调试模式。在板子上运行gdbserver,在PC上连接。

# 板子上执行
gdbserver :2345 ./test_arm

# PC上执行
aarch64-linux-gnu-gdb test_arm
(gdb) target remote 192.168.1.100:2345
(gdb) continue

这样你就可以在PC上打断点、查看变量、单步执行。工业场景下,很多bug只在板子上复现,远程调试是救命稻草。

避坑指南: 我曾经在远程调试时,发现板子上的gdbserver版本和PC上的gdb版本不匹配,导致断点无效。解决办法:用交叉编译工具链自带的gdbserver,不要用板子系统自带的。

3.4 本章知识体系

下面这张图,帮你理清开发环境搭建的整体脉络。

开发环境搭建知识体系 开发环境搭建核心流程 交叉编译环境 系统烧录 远程连接 工具链安装 第三方库编译 进入Loader模式 烧录镜像 SSH连接 文件传输 核心原则:工具链版本与板子系统版本严格匹配 烧录过程不断电、不拔线;远程连接优先配置密钥认证 典型工作流 PC端交叉编译 传输到板子 板端运行调试 图:开发环境搭建知识体系与典型工作流

这张图把三个核心模块串起来了。从左到右,从PC到板子,形成一个完整的闭环。你照着这个流程走一遍,环境搭建基本不会出大问题。