3、开发环境搭建:交叉编译工具链安装、SSH远程调试配置、串口终端工具使用、文件传输方法

好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞的时候也踩了不少坑。你想想看,嵌入式AI模型部署,本质上是在一个资源受限的“小电脑”上跑推理。那你的开发机(一般是x86架构的PC)和这个目标板(ARM、RISC-V之类的)架构不同,这就引出了第一个核心问题——交叉编译。

3.1 交叉编译工具链安装

什么叫交叉编译?说白了,就是在你的PC上编译出能在目标板上运行的二进制文件。我刚开始接触时总觉得别扭,为什么不能直接在板子上编译?后来发现,板子那点算力,编译个Linux内核得等到天荒地老。所以,交叉编译是嵌入式开发的必修课。

我个人习惯把工具链放在 /opt 目录下,方便管理。以ARM Cortex-A系列为例,我们常用的是 gcc-arm-linux-gnueabihf 这个工具链。

安装步骤(以Ubuntu 20.04为例):

# 更新软件源
sudo apt update

# 安装ARM交叉编译工具链
sudo apt install gcc-arm-linux-gnueabihf

# 验证安装
arm-linux-gnueabihf-gcc --version

安装完成后,你可以写一个简单的Hello World测试一下:

// hello.c
#include <stdio.h>

int main() {
    printf("Hello, Embedded AI World!\n");
    return 0;
}

// 编译命令
arm-linux-gnueabihf-gcc hello.c -o hello_arm

// 查看生成的文件架构
file hello_arm
// 输出: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)

看到 ARM 字样,说明编译成功了。嗯,这里要注意:不同的目标板架构不同,比如树莓派用 aarch64-linux-gnu-gcc,STM32系列用 arm-none-eabi-gcc。选错了工具链,编译出来的程序跑都跑不起来。

我曾经犯过的错: 有一次我编译了一个AI推理程序,在板子上运行直接报 Illegal instruction。查了半天,原来是工具链的浮点运算选项(-mfloat-abi)没选对。目标板是硬浮点(hard float),我用了软浮点(soft float)的编译选项。所以,安装前一定要确认目标板的CPU架构和浮点特性。

3.2 SSH远程调试配置

板子放在实验室,你总不能每次都抱着显示器过去吧?SSH就是你的远程救星。我个人习惯用 openssh-server,稳定可靠。

在目标板上安装并启动SSH服务:

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

# 启动SSH服务
sudo systemctl start sshd

# 设置开机自启
sudo systemctl enable sshd

# 查看IP地址
ifconfig

然后在你的PC上连接:

ssh username@192.168.1.100

第一次连接会提示确认指纹,输入 yes 就行。我建议你配置SSH密钥登录,省得每次输密码:

# 在PC上生成密钥
ssh-keygen -t rsa -b 4096

# 将公钥复制到目标板
ssh-copy-id username@192.168.1.100

配置好后,直接 ssh username@192.168.1.100 就能登录,方便得很。

小技巧: 我习惯在 ~/.ssh/config 里配置别名,比如:

Host myboard
    HostName 192.168.1.100
    User username
    Port 22

之后直接 ssh myboard 就能连上,省事。

3.3 串口终端工具使用

SSH虽然方便,但有时候板子网络没配好,或者内核启动阶段需要调试,这时候串口就是最后的救命稻草。我常用的串口工具有 minicomscreen,这里推荐 minicom,功能更全。

安装minicom:

sudo apt install minicom

配置串口参数:

# 进入配置界面
sudo minicom -s

# 选择 "Serial port setup"
# 设置以下参数:
# A - Serial Device: /dev/ttyUSB0 (根据实际设备修改)
# B - Lockfile Location: /var/lock
# E - Bps/Par/Bits: 115200 8N1
# F - Hardware Flow Control: No
# G - Software Flow Control: No

# 保存为默认配置
# 选择 "Save setup as dfl"

配置好后,直接运行 minicom 就能看到板子的启动日志了。你想想看,当板子内核启动时,一串串字符在屏幕上滚动,那种感觉,嗯,很有成就感。

注意: 串口线一定要接对!TX接RX,RX接TX,GND接GND。我刚开始时接反了,折腾了半天没反应,后来才发现是线序问题。另外,有些USB转串口模块需要安装驱动,比如CH340、CP2102之类的。

3.4 文件传输方法

代码写好了,怎么传到板子上?方法有好几种,我根据场景选择不同的方式。

方法 适用场景 命令示例
scp 传输单个文件或小目录 scp file username@ip:/path/
rsync 传输大目录,支持增量同步 rsync -avz dir/ username@ip:/path/
nfs 开发阶段,挂载PC目录到板子 mount -t nfs pc_ip:/path /mnt
tftp uboot阶段传输内核镜像 tftp 0x42000000 uImage

我个人最常用的是 rsync,尤其是传输AI模型文件时,动辄几百MB,rsync支持断点续传,省心。举个例子:

# 将本地的模型目录同步到板子
rsync -avz --progress ./model_dir/ username@192.168.1.100:/home/username/models/

如果你在开发阶段,频繁修改代码,我建议用NFS。把PC上的工程目录挂载到板子上,修改后直接在板子上运行,省去了反复传输的麻烦。

配置NFS的简要步骤:

  1. PC上安装NFS服务器:sudo apt install nfs-kernel-server
  2. 编辑 /etc/exports,添加共享目录:/home/user/project *(rw,sync,no_subtree_check)
  3. 重启NFS服务:sudo systemctl restart nfs-kernel-server
  4. 板子上挂载:mount -t nfs 192.168.1.100:/home/user/project /mnt

好了,开发环境搭建这部分就讲到这里。工具链、SSH、串口、文件传输,这四个东西是嵌入式开发的“四大件”。你把这些配置好,后面的模型部署工作才能顺利开展。下一章,咱们开始真正接触AI模型本身——模型格式转换与量化。