3、Linux系统基础:交叉编译链配置、文件系统结构、常用调试命令(adb、串口)

好,咱们进入第三章。这一章我把它叫做「地基工程」。为什么这么说?因为交叉编译链、文件系统、调试命令,这三样东西你搞不定,后面所有AI视觉的代码都跑不起来。我自己带过不少新人,发现很多人一上来就急着写算法,结果连个hello world都交叉编译不过去,卡了一整天。嗯,咱们今天就把这些坑填平。

3.1 交叉编译链配置:为什么你的电脑跑不了V853的程序?

先问个问题:你电脑是x86架构对吧?V853是ARM架构。你直接在电脑上gcc编译出来的程序,V853不认识。这就好比你把中文说明书寄给一个只懂英文的人——完全没法交流。

所以我们需要交叉编译链。说白了,就是在你的x86电脑上,装一个能生成ARM机器码的编译器。

3.1.1 获取交叉编译链

全志官方提供了SDK,里面自带交叉编译链。我个人习惯把它放在 /opt/ 目录下,方便管理。

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量(建议写到 ~/.bashrc 里)
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
小提示: 我建议你把这三行export写到 ~/.bashrc 里,然后 source ~/.bashrc。不然每次开新终端都要重新敲一遍,烦得很。

3.1.2 验证是否配置成功

arm-linux-gnueabihf-gcc --version

如果能看到版本号,恭喜你,第一步走通了。我曾经见过有人配了一天没配好,最后发现是路径写错了——多了一个斜杠。嗯,细节决定成败。

3.1.3 编译一个简单的测试程序

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

int main() {
    printf("Hello from V853!\n");
    return 0;
}
# 交叉编译
arm-linux-gnueabihf-gcc -o hello hello.c

# 查看文件信息
file hello
# 输出应该包含:ELF 32-bit LSB executable, ARM, ...

看到 ARM 字样,说明编译出来的程序是给V853用的。把这个文件传到板子上就能跑了。

注意: 千万别在电脑上直接运行这个hello文件!它是ARM指令集,你的x86 CPU会报「无法执行二进制文件」的错误。我刚开始学的时候犯过这个傻,还以为是编译器坏了。

3.2 文件系统结构:V853的「家」长什么样?

V853跑的是Linux系统,文件系统结构和我们电脑上的Ubuntu差不多。但有几个关键目录,做AI视觉开发时必须搞清楚。

目录 作用 我的经验
/ 根目录,一切从这里开始 别乱动
/bin 用户命令(ls、cp等) 够用就行
/sbin 系统管理命令(ifconfig等) 调试网络时常用
/etc 配置文件 改网络配置、开机启动脚本都在这里
/dev 设备文件(摄像头、串口等) 做AI视觉时,摄像头设备通常叫 /dev/video0
/proc 内核和进程信息 查CPU占用、内存信息的好地方
/sys 内核对象和驱动信息 调试硬件驱动时经常要看这里
/mnt 挂载点(U盘、SD卡等) 我习惯把算法模型放在这里
/opt 第三方软件 全志的AI工具链我一般装在这里
重点: 做AI视觉识别时,你最常打交道的是 /dev(摄像头)、/sys(驱动参数)、/mnt(模型文件)。记住这三个就够了。

3.3 常用调试命令:adb和串口

板子跑起来了,怎么和它沟通?两种方式:adb(网络/USB)和串口(物理线缆)。

3.3.1 adb调试

adb全称Android Debug Bridge,虽然名字带Android,但V853的Linux系统也支持。我个人觉得adb比串口方便,因为不用接线。

# 连接设备
adb connect 192.168.1.100:5555

# 进入板子的shell
adb shell

# 上传文件到板子
adb push hello /mnt/

# 从板子下载文件
adb pull /mnt/result.txt ./

# 安装APK(如果是Android系统)
adb install app.apk
小技巧: 我经常用 adb shell 进去之后,再用 top 命令看CPU占用。如果AI模型推理时CPU飙到100%,说明没用到NPU加速——这时候就要检查驱动了。

3.3.2 串口调试

串口是最后的保底手段。哪怕系统起不来,只要bootloader还在,串口就能看到输出。我遇到过好几次网络连不上,全靠串口救场。

硬件连接:V853的串口一般是UART0,3.3V电平。用USB转串口模块(比如CH340)连接:

  • GND → GND
  • TX → RX(交叉连接)
  • RX → TX(交叉连接)

电脑端配置(以minicom为例):

# 安装minicom
sudo apt-get install minicom

# 配置串口(115200波特率,8N1)
minicom -D /dev/ttyUSB0 -b 115200
避坑指南: 我曾经因为TX和RX接反了,折腾了半小时没输出。后来用万用表一量,才发现接反了。记住:TX接RX,RX接TX,GND接GND。别问我怎么知道的。

3.3.3 常用调试命令汇总

不管用adb还是串口,进去之后这些命令最常用:

# 查看系统信息
uname -a
cat /proc/cpuinfo
free -m

# 查看进程
ps aux
top

# 查看网络
ifconfig
ping 8.8.8.8

# 查看设备
ls /dev/video*
ls /dev/tty*

# 查看驱动
lsmod
dmesg | tail -20

嗯,这些命令我每天都要敲好几遍。尤其是 dmesg,驱动加载失败、硬件报错,都会在这里留下线索。有一次摄像头不出图,我查了半天代码,最后 dmesg 一看,原来是电源没给够——驱动直接罢工了。

3.4 本章小结

这一章的内容,说白了就是三板斧:

  1. 交叉编译链:让你的电脑能编译出V853能跑的程序
  2. 文件系统结构:知道东西该放哪儿、去哪儿找
  3. 调试命令:adb和串口,两条路都能和板子沟通

这三样东西,你花一天时间配好、练熟,后面所有章节都会顺风顺水。要是偷懒跳过,后面每章都会回来找你麻烦。我自己带项目时,第一件事就是让团队把交叉编译环境统一配好,省得后面互相扯皮。

下一章,咱们开始真正接触V853的AI硬件——NPU。到时候你会看到,这玩意儿跑神经网络,比CPU快几十倍。准备好了吗?