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(这个千万别忘)
电脑端我用的是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
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。
嗯,到这里开发环境就基本搭建完成了。你可能会觉得步骤有点多,但相信我,把这些基础工作做扎实了,后面移植算法的时候会顺畅很多。下一章咱们就开始讲如何把训练好的模型转换成板子能跑的格式。