1. 课程导入

做嵌入式Linux驱动开发,第一件事就是搞清楚你手里的芯片是什么来头。ARM架构几乎统治了移动端和嵌入式Linux市场,你想想看,从手机到路由器,从树莓派到服务器,到处都是ARM的身影。这一章,咱们就把ARM Cortex-A系列处理器的家底摸清楚。

1.1 主流ARM Cortex-A系列处理器介绍

Cortex-A系列是ARM针对应用处理器设计的核心系列,说白了就是跑Linux、跑复杂应用的那类芯片。我这些年接触最多的就是A7、A53、A72这三个型号,它们几乎覆盖了从低功耗到高性能的全部场景。

1.1.1 Cortex-A7:低功耗的常青树

Cortex-A7是ARMv7-A架构的代表作,2011年发布,到现在还在大量出货。为什么?因为它功耗实在太低了。我在一个智能门锁项目里用过全志的A7芯片,待机功耗能做到毫瓦级,跑Linux系统完全没问题。

  • 核心特点:顺序执行、8级流水线、支持ARM/Thumb/Thumb-2指令集
  • 典型频率:800MHz ~ 1.5GHz
  • 功耗表现:每核心约0.5W(28nm工艺)
  • 常见芯片:全志H3/H2+、联发科MT6580、瑞芯微RK3128

我的经验:A7虽然性能不强,但做IoT网关、智能家居中控这类对功耗敏感、对性能要求不高的产品,它反而是最优解。我曾经在一个电池供电的设备上,用A7跑Linux+Qt界面,续航能做到一周以上。

1.1.2 Cortex-A53:64位的普及先锋

A53是ARMv8-A架构的第一代核心,也是目前出货量最大的64位ARM核心。它替代了A7的地位,但性能提升了约40%。我2016年做第一个64位Linux移植项目时,用的就是A53芯片。

  • 核心特点:顺序执行、8级流水线、支持AArch64/AArch32
  • 典型频率:1.2GHz ~ 2.0GHz
  • 功耗表现:每核心约0.8W(28nm工艺)
  • 常见芯片:树莓派3B+(BCM2837)、瑞芯微RK3328、全志H5/H6

关键点:A53是ARM从32位过渡到64位的桥梁。它既能跑32位代码,也能跑64位代码。这意味着你可以在A53上直接编译32位的ARM Linux内核,也能编译64位的。我建议新项目直接上64位,别走回头路。

1.1.3 Cortex-A72:高性能的猛兽

A72是ARMv8-A架构的高性能核心,2015年发布,专门为需要高算力的场景设计。它采用乱序执行架构,性能比A57提升了约50%。我在一个边缘计算项目中用过RK3399(双A72+四A53),跑AI推理模型,效果相当不错。

  • 核心特点:乱序执行、15级流水线、支持AArch64/AArch32
  • 典型频率:1.8GHz ~ 2.5GHz
  • 功耗表现:每核心约2W(16nm工艺)
  • 常见芯片:瑞芯微RK3399、树莓派4B(BCM2711)、NXP i.MX8M Plus

1.2 ARMv7与ARMv8架构差异

很多初学者搞不清ARMv7和ARMv8到底差在哪。我简单给你捋一捋。ARMv7是32位架构的巅峰,ARMv8是64位架构的开端。它们之间的差异,不仅仅是位数这么简单。

对比项 ARMv7-A ARMv8-A
指令集宽度 32位(AArch32) 32位+64位(AArch32+AArch64)
通用寄存器 16个(r0-r15) 31个(x0-x30)+ 零寄存器xzr
程序计数器 r15(PC)是通用寄存器之一 PC是独立寄存器,不可直接访问
异常模型 7种异常模式(IRQ/FIQ/SVC等) 4个异常等级(EL0-EL3)
内存管理 VMSAv7,32位物理地址 VMSAv8,最大48位物理地址
虚拟化支持 可选(通过硬件扩展) 原生支持(EL2)
加密指令 无 AES/SHA等加密指令原生支持

为什么会这样?ARMv8在设计时做了很多根本性的改变。我举个例子,ARMv7的PC寄存器是r15,你可以直接读写它,这在某些场景下很方便,但也容易出bug。ARMv8把PC独立出来,你没法直接操作它,安全性提高了不少。

避坑指南:我曾经在一个项目里,把ARMv7的汇编代码直接搬到ARMv8上跑,结果系统直接崩溃。原因就是异常模型完全不同。ARMv7的IRQ/FIQ在ARMv8里变成了EL1的同步/异步异常。如果你要做汇编级别的移植,一定要重新写异常向量表。

1.3 开发板选型指南

选开发板这件事,我踩过不少坑。选对了,项目进度快一倍;选错了,光调硬件就能耗掉你一个月。下面这三款是我用得最多的,也是市面上最主流的。

1.3.1 树莓派系列

树莓派是入门首选,没有之一。它的社区资源太丰富了,你遇到任何问题,基本都能在论坛上找到答案。我建议初学者从树莓派3B+或4B开始。

  • 树莓派3B+:BCM2837(四核A53),1GB RAM,适合学习基础Linux驱动开发
  • 树莓派4B:BCM2711(四核A72),1GB/2GB/4GB/8GB RAM,适合做性能调优实验
  • 优势:资料多、社区活跃、GPIO丰富、有官方文档
  • 劣势:闭源GPU、部分外设驱动不开放、实时性一般

我的建议:如果你只是想学Linux驱动开发的基础知识,比如GPIO、I2C、SPI这些,树莓派3B+就够了。但如果你想做性能调优、多核调度、内存管理这些高级内容,建议上4B,至少4GB内存版本。

1.3.2 瑞芯微RK3399

RK3399是我做项目最常用的芯片之一。它采用双A72+四A53的big.LITTLE架构,性能强劲,接口丰富。我在一个工业平板项目里用过它,跑Android和Linux双系统,稳定运行了两年多。

  • CPU:双核Cortex-A72(1.8GHz)+ 四核Cortex-A53(1.4GHz)
  • GPU:Mali-T860 MP4
  • 内存:支持LPDDR3/LPDDR4,最大4GB
  • 接口:USB3.0、PCIe 2.1、SATA 3.0、HDMI 2.0、MIPI-DSI/CSI
  • 代表板卡:Firefly RK3399、友善之臂NanoPC-T4、Rock Pi 4

适用场景:RK3399特别适合做边缘计算、AI推理、多媒体处理这类需要高算力的项目。它的PCIe接口可以接NVMe SSD,SATA接口可以接硬盘,做NAS或者小型服务器都没问题。

1.3.3 NXP i.MX8M系列

i.MX8M是NXP针对工业级应用推出的处理器系列,主打稳定性和长期供货。我在一个医疗设备项目里用过i.MX8M Mini,客户要求产品生命周期至少10年,i.MX8M系列能满足这个要求。

  • i.MX8M Mini:四核A53(1.8GHz)+ 单核M4(用于实时控制)
  • i.MX8M Plus:四核A53(1.8GHz)+ 双核M7 + NPU(2.3TOPS)
  • i.MX8M Quad:四核A53 + 单核A72(可选)
  • 优势:工业级温度范围、长生命周期、丰富的外设(CAN、Ethernet AVB、PCIe)
  • 劣势:价格较高、BSP上手难度大、社区资源不如树莓派

避坑指南:i.MX8M系列的BSP(板级支持包)是基于Yocto构建的,编译一次要几个小时。我第一次搞的时候,没注意Yocto的版本兼容性,结果编译出来的内核死活起不来。后来发现是meta层配置错了。建议新手先直接用NXP官方提供的预编译镜像,等熟悉了再自己编译。

1.4 本章知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作一个思维导图,快速回顾ARM平台选型的关键要素。

ARM平台选型知识体系 ARM Cortex-A系列 处理器核心介绍 Cortex-A7 Cortex-A53 Cortex-A72 ARMv7 vs ARMv8 32位 vs 64位 异常模型 寄存器差异 开发板选型 树莓派 RK3399 i.MX8M系列 选型核心:根据项目需求(功耗/性能/成本/生命周期)选择最合适的平台

嗯,这一章的内容就到这里。ARM平台选型这件事,说白了就是搞清楚你的项目到底要什么。要低功耗?选A7。要64位兼容性?选A53。要高算力?选A72或者big.LITTLE组合。开发板的话,学习用树莓派,项目用RK3399或i.MX8M,看你的具体需求。