3. 开发环境搭建:交叉编译工具链、SDK安装、SSH远程调试、文件传输
说实话,很多做嵌入式算法的人,最后都栽在了环境搭建上。
不是算法模型跑不通,而是交叉编译链没配好,SDK版本对不上,折腾两天连个hello world都跑不起来。我当年刚入行时,就因为这个被卡了整整一个周末。所以这一章,咱们把地基打牢。
3.1 交叉编译工具链:为什么非它不可?
你想想看,你的开发电脑是x86架构,而门禁设备通常是ARM架构。x86上编译出来的程序,ARM根本看不懂。怎么办?
交叉编译工具链就是干这个的。它让你在x86电脑上,编译出能在ARM上跑的可执行文件。
核心概念:交叉编译 = 在A平台上编译,生成B平台能运行的代码。
我个人习惯用 Linaro 提供的 GCC 工具链。以海思 Hi3516DV300 为例,安装步骤很简单:
# 下载工具链(以arm-himix200-linux为例)
wget https://releases.linaro.org/components/toolchain/binaries/.../arm-himix200-linux.tgz
# 解压到指定目录
tar -xzf arm-himix200-linux.tgz -C /opt/
# 配置环境变量
export PATH=/opt/arm-himix200-linux/bin:$PATH
export CROSS_COMPILE=arm-himix200-linux-
export ARCH=arm
这里有个坑,我曾经踩过:环境变量一定要写到 ~/.bashrc 里,否则每次开新终端都要重新 export。别问我怎么知道的。
小技巧:验证工具链是否安装成功,跑一下 arm-himix200-linux-gcc --version,能看到版本号就对了。
3.2 SDK安装:别小看这一步
SDK 就是芯片厂商给你的一整套开发包。里面包含了驱动库、媒体处理库、神经网络推理库等等。说白了,没有SDK,你连摄像头都打不开。
以瑞芯微 RK3588 的 SDK 为例,安装流程大致如下:
# 1. 解压SDK包
tar -xzf rk3588_linux_sdk_v1.0.tgz
# 2. 进入SDK目录
cd rk3588_linux_sdk
# 3. 安装依赖库(不同厂商不一样)
sudo apt-get install libssl-dev libncurses5-dev
# 4. 编译SDK中的示例工程
cd examples/hello_world
make
# 5. 将编译好的文件传到板子上测试
scp hello_world root@192.168.1.100:/tmp/
嗯,这里要注意:SDK版本一定要和芯片型号严格对应。我见过有人拿RK3399的SDK去编译RK3588的程序,结果跑起来各种段错误,查了两天才发现是SDK版本不对。
| 芯片厂商 | 常见SDK名称 | 关键库 |
|---|---|---|
| 海思 | HiSVP / HiMPP | libive, libnnie |
| 瑞芯微 | RKNN Toolkit / Rockchip Linux SDK | librknnrt, librga |
| 算能 | Sophon SDK | libbmnnsdk, libsophon |
3.3 SSH远程调试:告别串口线
早期做嵌入式开发,都得用串口线连着板子,又慢又麻烦。现在好了,只要板子和电脑在同一个局域网,SSH就能搞定一切。
我个人习惯用 SSH + tmux 的组合。SSH负责远程连接,tmux负责在板子上开多个终端窗口,一边看日志,一边跑程序,互不干扰。
# 电脑端连接板子
ssh root@192.168.1.100
# 输入密码后,你就进入了板子的终端
# 然后启动tmux
tmux new -s debug
# 按 Ctrl+B 然后 % 可以分屏
# 左边跑程序,右边看top
注意:第一次SSH连接时,会提示确认主机密钥。输入yes即可。如果板子IP变了,记得删掉 ~/.ssh/known_hosts 里对应的旧记录,否则连不上。
为什么会这样?因为SSH会记录每台设备的指纹,IP变了但指纹没变,它就会认为有人冒充服务器,直接拒绝连接。
3.4 文件传输:scp vs rsync vs nfs
代码写好了,怎么传到板子上?三种方式,各有千秋。
- scp:最直接,适合传小文件。命令简单:
scp main root@192.168.1.100:/home/ - rsync:增量传输,适合传大工程。第一次慢,后面只传改动部分,快得很。
- nfs:网络文件系统。把电脑上的目录直接挂载到板子上,开发时最方便,不用来回传文件。
我推荐开发阶段用 nfs,部署阶段用 rsync。
nfs 配置也不复杂:
# 电脑端(服务器)
sudo apt-get install nfs-kernel-server
sudo mkdir -p /srv/nfs/face_recognition
sudo chown nobody:nogroup /srv/nfs/face_recognition
# 编辑 /etc/exports,添加一行:
/srv/nfs/face_recognition 192.168.1.0/24(rw,sync,no_subtree_check)
sudo systemctl restart nfs-kernel-server
# 板子端(客户端)
mount -t nfs 192.168.1.2:/srv/nfs/face_recognition /mnt
挂载成功后,你在电脑上修改代码,板子上直接就能看到更新。编译也简单:电脑上交叉编译,生成的可执行文件直接放到nfs目录,板子上就能跑。
避坑指南:我曾经因为nfs的权限问题折腾了半天。记住,板子上的uid/gid要和电脑端一致,否则会报"Permission denied"。最简单的办法:电脑端用root用户共享目录。
3.5 实战:一条龙测试
环境搭好了,咱们跑个简单的测试,验证整个链路是否通畅。
// test.c
#include <stdio.h>
int main() {
printf("Hello, 嵌入式门禁!\n");
printf("交叉编译环境搭建成功!\n");
return 0;
}
# 交叉编译
arm-himix200-linux-gcc test.c -o test_arm
# 传到板子(假设用scp)
scp test_arm root@192.168.1.100:/tmp/
# SSH登录板子,运行
ssh root@192.168.1.100
cd /tmp
./test_arm
如果看到 "Hello, 嵌入式门禁!" 打印出来,恭喜你,环境搭建成功了。
嗯,这一章的内容就这些。说白了,环境搭建就是个熟练活,多配几次就顺手了。下一章咱们开始搞人脸检测算法的移植,那才是真正的好戏。