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
~/.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用的。把这个文件传到板子上就能跑了。
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工具链我一般装在这里 |
/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
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 本章小结
这一章的内容,说白了就是三板斧:
- 交叉编译链:让你的电脑能编译出V853能跑的程序
- 文件系统结构:知道东西该放哪儿、去哪儿找
- 调试命令:adb和串口,两条路都能和板子沟通
这三样东西,你花一天时间配好、练熟,后面所有章节都会顺风顺水。要是偷懒跳过,后面每章都会回来找你麻烦。我自己带项目时,第一件事就是让团队把交叉编译环境统一配好,省得后面互相扯皮。
下一章,咱们开始真正接触V853的AI硬件——NPU。到时候你会看到,这玩意儿跑神经网络,比CPU快几十倍。准备好了吗?