2. 开发环境搭建:交叉编译工具链安装、刷机与系统烧录、SSH远程连接与文件传输

说实话,做工业缺陷检测模型移植,最怕的不是模型本身,而是环境搭不起来。我见过太多人卡在第一步——工具链装不上,板子刷不进去,连SSH都连不通。今天咱们就把这些基础活干利索。

2.1 交叉编译工具链安装

先说说交叉编译。你想想看,我们的模型最终要跑在嵌入式设备上,比如ARM架构的盒子。但开发是在x86的PC上。这就需要一个“翻译官”——交叉编译工具链。

为什么不用本地编译?嵌入式设备性能有限,编译个OpenCV可能要等半小时。在PC上交叉编译,几分钟搞定。

2.1.1 工具链的选择

我常用的几款工具链,列个表给你参考:

目标平台 工具链名称 下载来源
ARM Cortex-A系列 gcc-arm-linux-gnueabihf Linaro官网 / 芯片厂商SDK
ARM Cortex-M系列 gcc-arm-none-eabi ARM官网
RISC-V riscv64-unknown-linux-gnu SiFive / 芯片厂商
海思Hi35xx系列 arm-himix200-linux 海思SDK包内

我个人习惯用Linaro的版本,社区活跃,更新也及时。你在项目中遇到最多的是哪种?我猜是ARM Cortex-A,因为工业相机和边缘盒子大多用这个。

2.1.2 安装步骤

以ARM 32位工具链为例,操作很简单:

# 1. 下载工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 2. 解压到指定目录
tar -xvf gcc-linaro-*.tar.xz -C /opt/

# 3. 配置环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc

# 4. 验证安装
arm-linux-gnueabihf-gcc --version
我的小技巧: 别把工具链装到系统目录(如/usr/bin),万一要换版本会很麻烦。放/opt下,用软链接管理版本,切换起来特别方便。

2.1.3 避坑指南

我曾经遇到过一个问题:工具链装好了,但编译出来的程序在板子上跑不起来。后来发现是glibc版本不匹配。PC上的工具链glibc是2.27,板子上是2.23,直接报错。

解决办法有两个:

  • 用板子厂商提供的工具链(最稳妥)
  • 或者编译时静态链接:-static 参数
注意: 静态链接会让二进制文件变大,但省去了动态库依赖的麻烦。工业场景下,我建议能用静态就用静态,稳定第一。

2.2 刷机与系统烧录

环境搭好了,接下来要把系统装到板子上。这一步叫“刷机”或“烧录”。说白了,就是把操作系统镜像写到板子的存储里。

2.2.1 准备工作

你需要准备三样东西:

  1. 烧录工具:不同芯片厂家有不同工具。海思用HiTool,瑞芯微用RKDevTool,全志用PhoenixCard。
  2. 系统镜像:通常是.img或.uboot文件。可以从厂商官网下载,也可以自己用Buildroot/Yocto编译。
  3. 硬件连接:USB线、串口线(TTL转USB)、电源线。

2.2.2 以海思Hi3516DV300为例

我记得第一次给海思板子刷机,折腾了一下午。后来总结出标准流程:

# 步骤1:安装HiTool
# 从海思SDK中解压HiTool,双击运行(Windows环境)

# 步骤2:连接板子
# USB线连PC,串口线连板子的调试口
# 板子上电,按住复位键

# 步骤3:烧录
# HiTool中选择“烧写eMMC”模式
# 加载uboot、kernel、rootfs三个镜像
# 点击“烧写”,等待进度条走完

# 步骤4:验证
# 串口终端看到启动日志,说明烧录成功

关键点: 烧录时千万别断电!我有个同事就是烧到一半断电,板子直接变砖,后来用JTAG才救回来。

2.2.3 系统烧录后的检查

刷完机别急着高兴,先做几个检查:

  • 串口输出是否正常?有没有卡在某个驱动加载处?
  • 网络接口能不能获取IP?ifconfig 看一下
  • 存储空间够不够?df -h 确认一下

嗯,这里要注意:很多工业板子默认不开SSH服务,需要手动启动。我们下一节就讲这个。

2.3 SSH远程连接与文件传输

板子刷好了,总不能每次都插着串口线操作吧?SSH就是你的远程遥控器。有了它,你可以像操作本地电脑一样操作板子。

2.3.1 开启SSH服务

大多数嵌入式Linux默认用Dropbear(轻量级SSH服务器)。检查并启动:

# 检查SSH服务状态
ps | grep dropbear

# 如果没有启动,手动启动
/etc/init.d/dropbear start

# 设置开机自启
update-rc.d dropbear defaults

如果你用的是Buildroot编译的系统,记得在配置里勾选 BR2_PACKAGE_DROPBEAR。我刚开始做的时候老忘,每次都要重新编译,烦得很。

2.3.2 连接板子

PC端操作:

# 基本连接
ssh root@192.168.1.100

# 如果端口不是默认的22
ssh -p 2222 root@192.168.1.100

# 第一次连接会提示确认指纹,输入yes即可
实用技巧: 在 ~/.ssh/config 里配置主机别名,以后直接 ssh myboard 就行:
Host myboard
    HostName 192.168.1.100
    User root
    Port 22

2.3.3 文件传输

模型移植过程中,文件传输是家常便饭。我常用的三种方式:

工具 适用场景 命令示例
scp 单个文件或小批量 scp model.kmodel root@192.168.1.100:/home/
rsync 大量文件、增量传输 rsync -avz ./models/ root@192.168.1.100:/home/models/
nfs 开发调试阶段 挂载PC目录到板子,实时同步

我个人最常用rsync。为什么?因为模型文件经常改,rsync只传变化的部分,省时间。有一次我传一个300MB的模型文件,用scp要等2分钟,用rsync第一次传完,后面改几行代码再传,几秒钟就搞定。

2.3.4 常见问题

连不上SSH? 先ping一下板子IP,能ping通说明网络没问题。再看板子上有没有开SSH服务,用串口进去查。

传文件很慢? 检查一下网线是不是百兆的。工业现场经常有人用劣质网线,跑不满千兆。换个六类线试试。

权限被拒绝? 看看目标目录的权限。我习惯把文件传到 /tmp/home 下,这两个目录一般都有写权限。

安全提醒: 工业现场的内网环境,很多人图方便用root账户+空密码。千万别这么干!至少设个密码,或者用密钥认证。我见过有人被黑了板子,模型文件被删,教训深刻。

小结

好了,开发环境这块就讲这么多。总结一下:

  • 交叉编译工具链要选对版本,最好用厂商提供的
  • 刷机时注意不要断电,变砖很麻烦
  • SSH和文件传输是日常操作,rsync比scp更高效

下一章我们开始讲模型转换和量化,那才是真正的重头戏。环境搭好了,后面就顺了。有什么问题,咱们群里聊。

公众号:蓝海资料掘金营,微信deep3321