---
layout: post.njk
source: https://yage.ai/share/why-drone-arm-no-linux-20260730.html
speaker: yage.ai
title: 为什么无人机里那颗 ARM 芯片不跑 Linux
date: '2026-07-30'
summary: 文章探讨了为什么无人机中的ARM芯片不能运行Linux，核心在于电机控制对换相时极高的实时性要求。它对比了树莓派（通用计算）和STM32（硬实时微控制器）在中断响应确定性上的差异，指出后者通过硬件级抢占机制保证了关键物理操作的精确性和稳定性。
area: tech-engineering
category: architecture
tags:
  - motor-control
  - realtime-system
  - cortex-m
  - linux-vs-baremetal
people: []
companies_orgs: []
products_models:
  - arm
  - stm32
media_books: []
draft: true
status: evergreen
---

## 电机的基本原理

一架消费级无人机里有四个小电机，每个电机边上配着一块方形小电路板，比大拇指指甲略大，然后是中间那块飞控主板。飞控主板负责跑算法、处理摄像头、接
GPS，那是你熟悉的计算任务。但四块小电路板——ESC，电子调速器——干的完全是另一件事，而且正是这件事，决定了为什么那里不能放树莓派。

电机控制的物理本质其实很简单，没什么高深奥秘：定子里有线圈，给它通电变成电磁铁，吸引或排斥转子上的永磁体，转子就转了——这本身就是初中物理教过的原理。真正麻烦的地方在后面：转子转过一定角度之后，必须立刻切换到下一组线圈通电，把转子继续往前吸——不然吸力方向不对，转子就不转了，甚至反转。这个”切换给哪组线圈通电”的动作，叫换相。

换相的原理本身并不复杂，但在实际控制中，它有一个极为苛刻的要求：时刻必须精确。

如果早了——磁场还没对齐就提前通电——产生的力是斜的，会包含一个把转子往回拽的分量，结果就是效率低、发热、抖动。如果晚了，转子已经转过了最佳角度才通电，等于白白空转一段，没出多少力。如果严重晚了，晚了一整个电周期，通的那个相方向全错，产生的是反向力矩——相当于给一辆正在加速的车踩了刹车。再严重一些，控制完全失序，随机方向的力乱拍，电流尖峰飙升，甚至会直接烧掉驱动管。

所以换相时刻的精度，从来不是什么性能优化问题，而是电机能不能正常运转的基本前提。

传统有刷电机用了一个非常巧妙的设计：转子轴上套着一圈被切成扇区的铜环，叫换向器，外面固定着两片碳刷压在上面。转子一转，碳刷接触的扇区自然变化，电流方向随之自动切换。换相这件事，直接被机械结构自动完成了。给它两根线接上电压就能转，反接就反转，PWM
调占空比就能调速。控制极其简单，一个 MOSFET
加上基本驱动电路就能搞定。

代价是碳刷和换向器必然会磨损，磨损会产生碳粉和火花，火花会带来电磁干扰，效率偏低且寿命有限，更无法精确控制位置和力矩。对于玩具车、小风扇这类应用，这些代价完全可以接受，但对无人机和机械臂来说却远远不够。

BLDC 和
PMSM，也就是现在无人机、机器人里广泛使用的无刷电机，没有碳刷，也没有换向器，转子是永磁体，定子是固定线圈。换相时刻没有任何机械结构帮忙完成了——必须由一个电子控制器，实时读取转子当前位置，算出该给哪几相线圈通电，再通过
6 个功率开关管（三路半桥）精确输出三相 PWM 电压。

这意味着控制器必须陷入一个无休止的循环：读位置→算换相→更新 PWM
输出→读位置→算换相→更新 PWM 输出……而且这个循环必须在每一个 PWM
周期内彻底跑完。无刷电机常用的 PWM 频率在 16 到 25 kHz
之间，换算下来，每 40 到 62 微秒，这一整轮采样与计算就必须完成一次。

如果某一轮没有在规定时间内跑完，下一轮就只能沿用上一轮的旧数据。转子已经转到了新位置，控制器却还在输出根据过期位置算出来的电压——换相时刻瞬间就错了，物理后果就是前面提到的抖动、空转，甚至反向力矩。

## 两种控制思路

这里有一个很自然的疑问：树莓派是 2.4GHz 四核，STM32 只是几百 MHz
单核，单看算力树莓派显然强得多，为什么无人机里不用它？

答案藏在电机控制的运行过程里：它要求的根本不是平均算得有多快，而是每一次计算都必须在严格的截止时间内完成。这两件事有着本质的区别。

树莓派跑的是完整的 Linux，有人实测过它的 GPIO 中断延迟最快是 9 到 11
微秒，而且存在明显的跳动。当后台有图形界面在跑、USB
在收发数据、内核调度器在频繁切换线程时，任何一个突发打断都可能让某次中断响应延迟飙升到几十甚至上百微秒。即使开启
Linux 提供的所谓”实时”机制（如 SCHED_FIFO、mlockall 或 PREEMPT_RT
补丁），本质上依然是”尽力而为”——内核依然保留着调度这层抽象，依然会被驱动中断、DMA
操作或内存管理随时抢占，没有任何机制能保证在最坏情况下绝不超时。

假设 Linux 系统平均只需要 5
微秒就能跑完一轮换相计算，但只要每隔一段时间被某个内核事件打断了 200
微秒——在这 200 微秒里，就意味着连续 4 个 PWM
周期都在使用过期的换相数据。电机在这 4
个周期内被连续通错相，瞬间就会产生电流尖峰和力矩抖动，严重时甚至会烧毁功率管。问题从来不在于平均延迟有多低，而在于那一次突发的最坏情况。

ARM
其实并不是只有一种设计，而是分成了两条针对完全不同场景的产品线：Cortex-A
与 Cortex-M。

Cortex-A 是”Application”应用核，搭载
MMU（内存管理单元），支持虚拟内存，能够运行完整的
Linux，功耗在瓦级，树莓派、手机和平板用的都是它。它的终极目标是通用计算吞吐量最大化。而
Cortex-M 是”Microcontroller”微控制器核，不带 MMU，不跑
Linux，中断延迟仅有几十到几百纳秒，功耗低至毫瓦级，且具备极强的确定性。STM32
正是 Cortex-M 这条产线上的典型代表。

Cortex-M 搭载的
NVIC（嵌套向量中断控制器）采用的是硬件级抢占：高优先级中断信号一旦到达，CPU
在执行完当前指令后会立刻跳转到中断服务程序——中间没有任何”内核调度”软件层，没有任何后台进程能够插队，响应时间完全由硬件决定，而且每一次的延迟几乎完全一致。哪怕测试一万次，其跳动幅度也小到可以忽略不计。

这就是硬实时里”确定性”的真实含义——它并不意味着绝对速度有多快，而是保证响应足够稳，保证每一次都不会缺席。

STM32
的外设架构更进一步把这种确定性推到了极致：定时器溢出事件可以自动触发 ADC
采样，ADC 采样完成后又能自动触发 DMA 把数据搬运到内存，全程完全不需要
CPU
软件参与——就像一条纯硬件构成的自走枪流水线，一个节点触发自动拉动下一个节点。整条链路不依赖任何软件调度，绝不会被内核事件插队打断。相比之下，树莓派的
GPIO、PWM 和 ADC
大多需要通过操作系统驱动和软件库来操纵，中间隔着多层软件抽象，每一层都是潜在的延迟抖动源。

在专门针对电机控制的 STM32G4
系列中，芯片内部甚至集成了专门用于硬件加速 sin/cos/atan 运算的 CORDIC
模块，以及专门做数字滤波的 FMAC 模块，其高分辨率定时器甚至能以 2.1
纳秒的步进精度生成 PWM
波形。这些绝不是通用计算能力，而是专门为电机控制流水线量身定制的硬件电路。

即便到了 STM32 的高端产品线，比如主频 480MHz 的 H7 或者 800MHz 的
N6，虽然算力已经直逼低端应用处理器，但它们依然没有配备 MMU，依然不跑
Linux，依然运行在裸机或 RTOS 环境下。这个”算力足够强却没有任何 Linux
包袱”的定位，刚好精准落在了工业实时控制最需要的甜区。

## 为什么不把控制器做进电机里

芯片架构讲到这里，下一个自然的问题是：既然控制器和电机几乎总是一起使用，为什么不直接把控制器集成到电机内部？

事实上，这种集成方案在工业界早已存在。比如电脑主板上的 12V
散热风扇，内部就是由 BLDC 配合一颗简单的控制
IC，接上电源就能自动运转；无人机的 ESC
电子调速器也是类似的思路，只需接收一根信号线的指令即可；扫地机器人的驱动轮、洗衣机的无刷电机，也都采用了一体化集成设计。在工业自动化领域，更有功能完备的”智能电机”或”集成伺服”，如
Teknic ClearPath、Maxon EPOS 和 Allen-Bradley
Kinetix，它们将电机、编码器、FOC
控制器及功率驱动电路全部封装在同一个外壳中，通过串行总线接收指令即可运行，单价通常在
300 到 1500 美元之间。

但在很多高性能或特定应用场景下，一体化集成方案需要付出的物理代价极其昂贵。

第一个代价是散热：功率 MOSFET
在高频开关时会剧烈发热，而电机线圈本身在运转时也会产生大量的铜损与铁损，两者挤在狭小的封闭空间内极难散热，旁边的电容和控制
IC
在长期高温下使用寿命会呈断崖式下跌。第二个代价是机械振动：电机运转产生的持续高频振动，极易导致控制电路板上的焊点在长期应力作用下发生疲劳开裂。第三个代价是电磁干扰：MOSFET
输出的高压大电流 PWM 开关噪声是强烈的干扰源，而 ADC
采样的电流信号往往只有毫伏级别，两者紧密贴合在一起，强大的电磁噪声很容易淹没微弱的电流信号，导致整个闭环控制失真崩溃。第四个代价是灵活性：同一规格的电机如果分别用在无人机、机械臂关节、CNC
主轴或电动自行车上，其控制参数与算法策略截然不同，集成方案一旦固件烧死或硬件固定，更换场景就只能整体报废。第五个代价则是维修成本：电路板上的功率电子元件是最容易因过流过热损坏的，而电机的铜线圈本身极难损坏，分离方案只需要更换几块钱的控制板，而集成方案只要
MOSFET 烧毁，就必须将整台昂贵的电机一并扔掉。

因此，工业界最经典且广泛采用的仍是”三层分离结构”：底层是功率层，由 6
个 MOSFET 组成三相半桥，负责切换高达 50A 量级的大电流；中间是驱动层，由
gate driver 将单片机输出的 3.3V 逻辑电平放大到足以快速开合 MOSFET
栅极的驱动电压；最顶层则是控制层，由 STM32
负责读取传感器电流与转子位置、执行换相与 FOC 算法并输出 PWM 指令。STM32
仅仅位于控制层，它并不是整个控制器本身，而是控制器的核心大脑。哪怕在那些高级的集成伺服内部，可能也运行着一颗
STM32——只是此时你买到的是一个”带脑子的电机”，STM32
在其中扮演的是脑细胞的角色，而不是整个器官。

在控制器与电机分离的独立控制路线中，STM32
能够成为工业界的主流选择，关键在于它的外设架构完全是为电机控制这条硬件流水线量身打造的。ESP32
虽然也能用来做简单的电机控制，但它的核心设计目标是 WiFi 与 BLE
无线联网，系统底层跑着 FreeRTOS
和复杂的无线协议栈，其中断响应的确定性无法与裸机运行的 Cortex-M
相比——ESP32 是出色的”联网万能胶”，而 STM32
则是专精于工业控制的”瑞士军刀”，两者的适用甜区截然不同。

## 学底层是为了能绕过集成件

在实际开发中，如果现成的集成伺服能够完美匹配需求，直接采购无疑是最节省时间的做法。然而，集成伺服的控制参数与算法框架往往被厂商预先封装固定，用户只能使用其开放的外层接口。当需要为一个自定义的机械臂关节同时实现精确的力矩控制、位置控制以及顺应性反向驱动时，在
300
美元以下的预算范围内几乎找不到能够直接满足要求的现成集成件。如果在底层原理与芯片架构上有深入理解，就可以基于
STM32
和分立驱动板自己设计搭建出满足特定物理约束的控制系统；反之，就只能被动等待其他厂商将这种特定需求做成商品再来购买。

这种能力差异的本质，并不在于是否重复造轮子，而在于当高层抽象封装无法满足特定物理约束时，手里是否拥有直接向下拆解并绕过限制的技术手段。

再回头看无人机里那块比指甲盖略大的小电路板。它在每 40 到 62
微秒的时间窗口里精准地跑完一整轮：读取转子位置、计算换相时刻、更新 6 路
PWM 占空比——周而复始，绝不错过任何一轮。树莓派跑 Linux
做不到这一点，是因为操作系统调度无法给出最坏情况下的时间保证；而那块单片机能够做到，是因为它的硬件架构保证了每一次响应都能准时落在物理世界限定的截止时间内。一个是追求平均速度的通用计算，一个是保证每一次都不慢的硬实时响应——在电机控制这个严苛的物理世界里，这两者之间的鸿沟，决定了电机究竟是能稳稳悬停，还是会在抖动中走向失控。