嵌入式系统基础:主流边缘设备介绍与交叉编译环境搭建

各位同学,欢迎来到第二章。说实话,每次讲到这一章,我都挺感慨的。十年前我做嵌入式语音识别时,能跑个简单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

看到版本号就说明装好了。

小提示: 我个人习惯把工具链路径加到.bashrc里,方便后续调用。比如: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!」,恭喜你,交叉编译环境搭建成功了。

注意: 我曾经遇到过一个问题——编译时忘了指定浮点运算模式。树莓派用的是硬浮点(hard float),如果编译时用了软浮点(soft float),程序跑起来会报错。所以一定要用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自带的交叉编译工具链。版本太新或太旧都可能出问题。

好了,这一章的内容就到这里。下一章我们会真正开始部署语音识别模型。到时候,这些设备就能派上用场了。

记住一句话:工具是死的,思路是活的。选对设备,搭好环境,后面的事就顺了。