第二章:嵌入式系统基础——嵌入式处理器选型、开发板介绍与交叉编译环境搭建
各位同学,大家好。上一章我们聊了嵌入式视觉在农田里的应用场景,今天咱们来点实在的——选芯片、挑板子、搭环境。这三件事,说白了就是给我们的“农田眼睛”选个靠谱的大脑和骨架。
我做了这么多年嵌入式,见过太多项目死在选型这一步。选错了处理器,后面跑算法跑不动;选错了开发板,调试起来想砸电脑。所以这一章,咱们把坑提前踩一遍。
2.1 嵌入式处理器选型:ARM vs RISC-V
先问个问题:为什么农田里的视觉系统不能直接用电脑上的i7处理器?
原因很简单——功耗、成本、体积。你想想看,一台拖拉机上的摄像头模块,总不能背个台式机跑吧?所以嵌入式处理器才是正解。
2.1.1 ARM处理器——老牌劲旅
ARM架构在嵌入式领域,基本就是“默认选项”。我最早接触ARM是十几年前的ARM9,那时候跑个Linux都费劲。现在呢?Cortex-A系列已经能跑深度学习推理了。
在农田障碍检测这个场景里,ARM的优势很明显:
- 生态成熟:Linux、ROS、OpenCV,全都有现成的移植版本。你不需要从零开始写驱动。
- 工具链完善:GCC、LLVM、各种调试器,随便挑。
- 性能稳定:Cortex-A72、A76这些核心,跑个轻量级YOLO完全没问题。
我个人习惯,如果项目周期紧、团队经验一般,优先选ARM。因为遇到问题,网上随便一搜就有答案。我在一个果园避障项目里用过树莓派CM4,从拿到板子到跑通目标检测,只花了两天。
重要提醒:ARM虽然好,但授权费贵。如果你做的是量产产品,每颗芯片都要交版税。这也是为什么RISC-V开始火起来的原因。
2.1.2 RISC-V——后起之秀
RISC-V这几年热度很高。我去年参加一个农业机器人展会,发现已经有厂商在用RISC-V做边缘计算模块了。
它的核心优势就两个字:开源。指令集完全开放,你想怎么改都行。对于农田视觉这种需要定制化的场景,其实挺合适的。
但说实话,目前RISC-V在视觉处理上还有短板:
- SIMD(单指令多数据)指令还不够强,跑卷积运算效率不如ARM的NEON。
- 生态还在建设中,很多库需要自己编译。
- 高性能芯片选择少,能跑Linux的RISC-V开发板目前也就那么几款。
我曾经试过在RISC-V板子上移植OpenCV,折腾了整整一周。嗯,最后还是换回了ARM。但如果你做的是前瞻性研究,或者想避开ARM的授权费,RISC-V值得关注。
| 对比项 | ARM | RISC-V |
|---|---|---|
| 生态成熟度 | 极高 | 中等 |
| 授权费用 | 有 | 无 |
| 视觉库支持 | 完善 | 有限 |
| 适合场景 | 快速落地 | 定制化、低成本 |
2.2 开发板介绍:树莓派 vs Jetson Nano
选好了处理器架构,接下来就是选开发板。我建议初学者直接从这两款入手——树莓派4B和Jetson Nano。它们代表了两种不同的设计思路。
2.2.1 树莓派4B——入门首选
树莓派4B,我估计在座很多人都用过。BCM2711处理器,4核Cortex-A72,跑1.8GHz。配上4GB或8GB内存,对于农田视觉的入门学习完全够用。
它的优点:
- 便宜:几百块钱,坏了不心疼。
- 资料多:从GPIO到摄像头,教程一搜一大把。
- 功耗低:5V/3A供电,用充电宝都能带起来。
但要注意,树莓派跑深度学习推理比较吃力。我试过在树莓派4B上跑YOLOv4-tiny,帧率只有5-8fps。做静态障碍物检测还行,动态的就别想了。
我的建议:如果你刚开始学嵌入式视觉,先买树莓派。把Linux、OpenCV、摄像头驱动这些基础打牢。等需要跑模型了,再升级到Jetson。
2.2.2 Jetson Nano——性能担当
Jetson Nano是NVIDIA推出的边缘AI计算平台。128个CUDA核心,专门为深度学习推理优化。我在农田项目里用过它跑YOLOv5s,能跑到25-30fps,基本满足实时检测需求。
它的优势:
- GPU加速:TensorRT优化后,推理速度能翻倍。
- 硬件编解码:H.264/H.265硬编码,处理高清视频不卡顿。
- 接口丰富:CSI摄像头接口、GPIO、I2C、SPI,接各种传感器很方便。
但Jetson Nano也有缺点:功耗高(5V/4A起步),发热大,必须加散热片或风扇。我曾经在夏天户外测试,没加散热,跑了半小时直接过热降频。
避坑指南:我曾经在Jetson Nano上直接插USB摄像头,结果供电不足导致系统反复重启。后来换了CSI接口的摄像头才稳定。所以,用Jetson Nano一定要算好总功耗。
2.3 交叉编译环境搭建
好,板子选好了,接下来就是搭环境。这里我要强调一个概念——交叉编译。
为什么需要交叉编译?因为开发板性能有限,直接在板子上编译大型项目(比如OpenCV、TensorFlow)会等到你怀疑人生。所以我们在性能强劲的PC上编译,生成目标板能运行的二进制文件,再传过去。
2.3.1 安装交叉编译工具链
以树莓派为例,我们在Ubuntu PC上安装ARM交叉编译工具链:
# 安装ARM64交叉编译工具
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 验证安装
aarch64-linux-gnu-gcc --version
如果是Jetson Nano,它本身就是ARM64架构,所以工具链和树莓派通用。但Jetson Nano的官方系统是Ubuntu,你也可以直接在板子上编译——如果你有耐心的话。
2.3.2 编写一个简单的测试程序
我们来写一个简单的Hello World,验证交叉编译环境是否正常:
// hello_vision.c
#include <stdio.h>
int main() {
printf("Hello, Embedded Vision!\n");
printf("This is for farmland obstacle detection.\n");
return 0;
}
编译命令:
aarch64-linux-gnu-gcc -o hello_vision hello_vision.c
编译完成后,用file命令查看生成的文件:
file hello_vision
# 输出:ELF 64-bit LSB executable, ARM aarch64
看到“ARM aarch64”就说明编译成功了。把这个文件传到树莓派或Jetson Nano上,直接运行即可。
2.3.3 交叉编译OpenCV(重点)
在农田视觉项目里,OpenCV是绕不开的库。交叉编译OpenCV是个大工程,我给大家总结一个精简流程:
- 安装依赖:在PC上安装交叉编译所需的依赖库(zlib、libjpeg、libpng等)。
- 下载OpenCV源码:建议用4.5.x版本,对ARM支持最好。
- 配置CMake:指定交叉编译工具链和安装路径。
- 编译:用make -j4并行编译,大概需要30分钟到1小时。
- 安装:make install,把编译好的库文件复制到目标板。
核心CMake配置示例:
cmake -DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
-DCMAKE_INSTALL_PREFIX=/opt/opencv-arm64 \
-DWITH_GTK=OFF \
-DWITH_V4L=ON \
..
这里要注意,WITH_GTK=OFF是因为GTK在嵌入式板上很难配置,我们一般用Qt或者直接不显示窗口。而WITH_V4L=ON是打开Video4Linux支持,这样才能用摄像头。
我的经验:第一次交叉编译OpenCV,十有八九会报错。别慌,大部分错误都是缺少依赖库。我建议你先把所有依赖库的交叉编译版本都装好,再编译OpenCV。或者直接用Linaro提供的预编译工具链,能省不少事。
2.3.4 文件传输与调试
编译好的程序怎么传到板子上?我常用两种方式:
- SCP:
scp hello_vision pi@192.168.1.100:/home/pi/ - NFS挂载:在PC上共享目录,板子通过网络挂载,调试时直接运行共享目录里的程序。
我个人更推荐NFS方式。因为开发过程中要反复修改代码、重新编译、测试。用NFS的话,PC上编译完,板子上直接就能跑,省去了每次传文件的麻烦。
好了,这一章的内容就到这里。总结一下:
- ARM适合快速落地,RISC-V适合定制化需求。
- 树莓派适合入门学习,Jetson Nano适合跑深度学习模型。
- 交叉编译是嵌入式开发的必备技能,一定要亲手搭一遍。
下一章,我们会正式进入视觉处理部分——摄像头选型与图像采集。到时候我会讲讲怎么给农田里的摄像头选镜头,以及怎么处理那些恼人的光照变化。咱们下章见。