2、开发环境搭建:交叉编译链安装、SSH与串口调试、板端系统烧录与初始化

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上两三天。我见过太多人,算法模型都训练好了,最后发现板子连不上、系统跑不起来。嗯,这一章咱们就把这些基础工作一次性搞定。

2.1 交叉编译链:为什么非得用这个?

你想想看,你的电脑是x86架构,而嵌入式板子通常是ARM架构。直接在电脑上编译的程序,板子根本跑不了。交叉编译链,说白了就是一套能在x86电脑上生成ARM可执行文件的工具集。

我个人习惯用Linaro提供的GCC工具链,稳定且社区活跃。以ARM Cortex-A系列为例,安装步骤其实很简单:

# 下载交叉编译链(以gcc-arm-9.2-2019.12为例)
wget https://releases.linaro.org/components/toolchain/binaries/9.2-2019.12/arm-linux-gnueabihf/gcc-arm-9.2-2019.12-x86_64-arm-linux-gnueabihf.tar.xz

# 解压到指定目录
tar -xvf gcc-arm-9.2-2019.12-x86_64-arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量(建议写入~/.bashrc)
export PATH=$PATH:/opt/gcc-arm-9.2-2019.12-x86_64-arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
小提示:配置完环境变量后,记得执行 source ~/.bashrc 使其生效。验证是否安装成功,可以运行 arm-linux-gnueabihf-gcc --version,看到版本信息就对了。

我在项目中遇到过一个问题:下载的交叉编译链版本和板子内核版本不匹配,导致编译出来的程序一运行就段错误。后来我学乖了,每次都会先查一下板子官方推荐的GCC版本。比如全志V3s芯片,官方推荐用gcc-arm-8.3-2019.03,你用9.2就可能出问题。

2.2 SSH与串口调试:两条腿走路

板子拿到手,第一件事就是能跟它“说话”。SSH和串口是两种最常用的方式。我建议两个都配好,因为串口在系统启动阶段就能用,而SSH适合传文件和远程操作。

2.2.1 串口调试:最可靠的救命稻草

串口调试,说白了就是用一根USB转TTL线,把电脑和板子的串口引脚连起来。为什么说它可靠?因为从uboot启动到内核加载,再到文件系统挂载,串口全程都能看到日志。系统崩了?串口还能看最后一条消息。

接线方式很简单:

  • 板子的TX(发送)接USB转TTL的RX(接收)
  • 板子的RX(接收)接USB转TTL的TX(发送)
  • GND接GND(这个千万别忘)
警告:千万不要把USB转TTL的TX和RX直接接5V或3.3V电源!我曾经有一次接反了,瞬间闻到一股焦味,板子直接报废。记住:串口电平通常是3.3V,有些老板子是1.8V,一定要先确认。

电脑端我用的是MobaXterm,它集成了串口终端和SSH客户端,非常方便。配置参数如下:

参数
波特率 115200
数据位 8
停止位 1
校验位
流控

2.2.2 SSH配置:远程操作的利器

系统启动后,串口调试就显得有点慢了。这时候SSH就派上用场。板端一般默认开启了SSH服务,如果没有,手动安装一下:

# 板端执行(假设已联网)
apt-get update
apt-get install openssh-server

# 启动SSH服务
/etc/init.d/ssh start

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

电脑端连接就简单了:

ssh root@192.168.1.100  # 替换为板子的实际IP地址
小技巧:我习惯在电脑的 ~/.ssh/config 文件中配置别名,这样每次只需要输入 ssh myboard 就能连上,省得记IP地址。

2.3 板端系统烧录与初始化

拿到一块新板子,第一件事就是烧录系统。不同芯片的烧录方式不一样,但思路是相通的。我以全志V3s为例,讲一下通用流程。

2.3.1 烧录工具准备

全志芯片用PhoenixCard或者sunxi-fel工具。我个人更推荐sunxi-fel,因为它可以在命令行下操作,适合脚本化部署。

# 安装sunxi-fel(Ubuntu下)
sudo apt-get install sunxi-tools

# 进入FEL模式(按住板子上的FEL键,然后上电)
sudo sunxi-fel version  # 如果能识别到芯片,说明进入FEL模式成功

2.3.2 烧录系统镜像

系统镜像一般包含uboot、内核、设备树和根文件系统。烧录命令如下:

# 烧录uboot到SD卡(假设SD卡设备为/dev/sdb)
sudo dd if=uboot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

# 烧录内核和设备树
sudo sunxi-fel -p spiflash-write 0x00000000 u-boot-sunxi-with-spl.bin
sudo sunxi-fel -p spiflash-write 0x00100000 zImage
sudo sunxi-fel -p spiflash-write 0x00500000 sun8i-v3s-licheepi-zero.dtb
重要提醒:烧录前一定要确认SD卡或SPI Flash的偏移地址是否正确。我见过有人把uboot烧到了内核的位置,结果板子启动后直接黑屏。每个芯片的存储布局都不一样,务必参考官方文档。

2.3.3 系统初始化配置

系统烧录完成后,第一次启动需要进行一些基础配置。我列一个检查清单:

  • 网络配置:设置静态IP或DHCP,确保SSH能连上
  • 时区设置:默认是UTC,改成Asia/Shanghai
  • 软件源更新:换成国内镜像,比如清华源或阿里源
  • 必要工具安装:vim、htop、net-tools、git等
  • 用户密码修改:默认root密码一定要改,安全第一
# 网络配置示例(编辑/etc/network/interfaces)
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8

# 时区设置
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 更换软件源(以Debian为例)
sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
个人经验:我习惯在初始化完成后,用 dd 命令把整个SD卡备份成一个镜像文件。这样万一系统搞坏了,直接恢复就行,不用重新烧录。命令是 sudo dd if=/dev/sdb of=myboard_backup.img bs=4M

嗯,到这里开发环境就基本搭建完成了。你可能会觉得步骤有点多,但相信我,把这些基础工作做扎实了,后面移植算法的时候会顺畅很多。下一章咱们就开始讲如何把训练好的模型转换成板子能跑的格式。