嵌入式系统基础:主流边缘设备介绍与交叉编译环境搭建
各位同学,欢迎来到第二章。说实话,每次讲到这一章,我都挺感慨的。十年前我做嵌入式语音识别时,能跑个简单FFT的ARM芯片就算不错了。现在呢?树莓派、Jetson Nano、Coral,随便一个都能跑完整的语音模型。嗯,时代变了。
这一章,我带大家看看目前主流的边缘设备,然后手把手把交叉编译环境搭起来。别急,一步步来。
主流边缘设备:三足鼎立
目前市面上做边缘AI推理的设备,我个人觉得可以分成三派。我分别说说它们的脾气秉性。
1. 树莓派(Raspberry Pi)—— 入门首选,生态最丰富
树莓派4B,我估计在座不少人都摸过。它用的是BCM2711芯片,四核Cortex-A72,主频1.5GHz。内存有1GB、2GB、4GB、8GB可选。
优点:
- 社区资源极其丰富。你遇到过的坑,99%别人都踩过
- GPIO引脚多,外接麦克风阵列、传感器很方便
- 价格亲民,几百块就能玩起来
缺点:
- 没有GPU加速。跑语音模型全靠CPU硬扛
- 算力有限。我试过在上面跑一个中型Transformer模型,推理一次要3秒多...嗯,基本没法用
适合场景:原型验证、教学演示、低功耗唤醒词检测。
2. Jetson Nano —— 带GPU的狠角色
Jetson Nano是NVIDIA家的产品。它集成了128个CUDA核心的Maxwell架构GPU。说实话,我第一次拿到它时,心里想的是:「这小东西能跑GPU?」结果一试,还真行。
优点:
- GPU加速,推理速度比树莓派快一个数量级
- 支持TensorRT,模型优化后性能更猛
- 官方JetPack SDK,包含了CUDA、cuDNN、TensorRT全套工具
缺点:
- 功耗比树莓派高,需要5V 4A电源
- 价格贵一些,官方版要一千多
- 散热是个问题。我有一块Nano,夏天跑模型时温度能飙到80度,得加个小风扇
适合场景:实时语音识别、端侧推理、需要GPU加速的项目。
3. Coral Dev Board —— Google的亲儿子
Coral用的是Google的Edge TPU芯片。这玩意儿专为推理而生。它不跑训练,只做推理,但效率极高。
优点:
- Edge TPU推理速度极快,功耗极低
- 支持TensorFlow Lite模型,转换方便
- 体积小,适合做产品原型
缺点:
- 只支持TensorFlow Lite,PyTorch模型需要先转格式
- 社区资源不如树莓派丰富
- 我遇到过一个问题:某些自定义算子Edge TPU不支持,得自己写...挺折腾的
适合场景:低功耗、高吞吐的推理任务,比如关键词检测。
设备对比一览
为了方便大家选型,我整理了一张表。你想想看,做项目前先看看这张表,能省不少事。
| 特性 | 树莓派4B | Jetson Nano | Coral Dev Board |
|---|---|---|---|
| 处理器 | Cortex-A72 | Cortex-A57 + GPU | Cortex-A53 + Edge TPU |
| AI加速 | 无 | 128 CUDA核心 | 4 TOPS Edge TPU |
| 内存 | 1-8GB LPDDR4 | 4GB LPDDR4 | 1GB LPDDR4 |
| 功耗 | 5W | 10W | 2W |
| 价格 | 约300-800元 | 约1200元 | 约1000元 |
| 语音模型推理 | 慢(CPU) | 快(GPU) | 极快(TPU) |
交叉编译环境搭建
好,设备选完了。接下来是重头戏——交叉编译环境搭建。
为什么要交叉编译?说白了,就是你的开发电脑(x86架构)编译出来的程序,没法直接在ARM架构的边缘设备上跑。你得在PC上编译出ARM能识别的二进制文件。这就是交叉编译。
我在项目中遇到过不少同学,直接在树莓派上编译代码。结果呢?编译一个TensorFlow Lite就要等两个小时...嗯,你想想看,这时间够我喝三杯咖啡了。
第一步:安装交叉编译工具链
以树莓派为例,我们需要安装ARM交叉编译工具链。在Ubuntu系统上,执行:
sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
安装完成后,检查一下:
arm-linux-gnueabihf-gcc --version
看到版本号就说明装好了。
export CC=arm-linux-gnueabihf-gcc
第二步:编写一个简单的测试程序
我们来写一个简单的C程序,验证交叉编译是否成功。
// hello_arm.c
#include <stdio.h>
int main() {
printf("Hello from ARM device!\n");
printf("This is a cross-compiled binary.\n");
return 0;
}
然后交叉编译:
arm-linux-gnueabihf-gcc hello_arm.c -o hello_arm
编译完成后,用file命令查看生成的二进制文件:
file hello_arm
你应该会看到类似这样的输出:
hello_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, not stripped
看到「ARM」字样,说明编译成功了。
第三步:将程序传输到边缘设备
用scp命令把编译好的文件传到树莓派上:
scp hello_arm pi@192.168.1.100:/home/pi/
然后SSH登录到树莓派,运行它:
ssh pi@192.168.1.100
./hello_arm
如果看到「Hello from ARM device!」,恭喜你,交叉编译环境搭建成功了。
arm-linux-gnueabihf这个工具链,注意最后的「hf」就是hard float的意思。
第四步:搭建自动化编译脚本
每次手动敲编译命令太麻烦了。我一般会写一个Makefile,把交叉编译的配置固定下来。
# Makefile
CC = arm-linux-gnueabihf-gcc
CFLAGS = -Wall -O2 -march=armv7-a -mfpu=neon
all: hello_arm
hello_arm: hello_arm.c
$(CC) $(CFLAGS) -o $@ $^
clean:
rm -f hello_arm
以后编译只需要敲make就行了。省心。
避坑指南
最后,我分享几个我踩过的坑,希望能帮你省点时间。
- 动态链接库问题: 交叉编译的程序如果依赖动态库,记得把对应的ARM版库也拷贝到设备上。我一开始没注意,结果程序跑起来直接报「cannot open shared object file」。
- 浮点运算不匹配: 上面说过了,树莓派用硬浮点,Jetson Nano也是。Coral Dev Board用的是软浮点,注意区分。
- 编译器版本不一致: 我建议用Ubuntu 18.04或20.04自带的交叉编译工具链。版本太新或太旧都可能出问题。
好了,这一章的内容就到这里。下一章我们会真正开始部署语音识别模型。到时候,这些设备就能派上用场了。
记住一句话:工具是死的,思路是活的。选对设备,搭好环境,后面的事就顺了。