3. 开发环境搭建:交叉编译环境配置、刷机与系统烧录、SSH远程连接与文件传输
开发环境搭建,说白了就是给你的边缘设备“装系统”和“配工具”。这一步搞不定,后面所有算法都跑不起来。我见过不少团队,算法在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也需要交叉编译 |
WITH_GTK=OFF 是必选项。
3.2 刷机与系统烧录
交叉编译环境配好了,接下来要给板子装系统。这一步就像给手机刷ROM,搞不好就变砖。别怕,按步骤来。
3.2.1 准备工作
- 硬件: 开发板(RK3588)、USB Type-C数据线、电源适配器、MicroSD卡(可选)
- 软件: RKDevTool(瑞芯微官方烧录工具)、系统镜像(.img文件)
你想想看,烧录最怕什么?怕断电。所以电源一定要稳,我一般用实验室的稳压电源,不用USB口供电。
3.2.2 烧录步骤
- 进入烧录模式: 按住板子上的
RECOVERY键,再按一下RESET键,然后松开RECOVERY键。板子会进入Loader模式。 - 连接PC: 用USB Type-C线连接板子和电脑。打开RKDevTool,如果看到“发现一个Loader设备”,说明连接成功。
- 选择镜像: 在RKDevTool中,点击“固件”按钮,选择你的系统镜像文件(比如
RK3588_Ubuntu_22.04.img)。 - 开始烧录: 点击“升级”按钮。进度条走完,板子会自动重启。
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-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 本章知识体系
下面这张图,帮你理清开发环境搭建的整体脉络。
这张图把三个核心模块串起来了。从左到右,从PC到板子,形成一个完整的闭环。你照着这个流程走一遍,环境搭建基本不会出大问题。