Event Task Matrix(ETM)工作机制

Event Task Matrix(ETM) 是一种硬件事件路由机制,广泛用于新一代 ESP 芯片(如 ESP32-C6、ESP32-H2、ESP32-S3 部分功能扩展等)。它的核心作用是:

让一个外设产生的事件(Event)直接触发另一个外设执行任务(Task),无需 CPU 参与。 docs.espressif.com, github.com


为什么需要 ETM

传统方式下:

复制代码
Timer 超时
    ↓
产生中断
    ↓
CPU进入ISR
    ↓
软件控制ADC启动

这个过程中存在:

  • 中断响应延迟
  • CPU负载增加
  • 实时性受系统负载影响

ETM方式:

复制代码
Timer Alarm Event
        ↓
       ETM
        ↓
ADC Start Task

整个过程不经过 CPU,因此能够实现:

  • 超低延迟
  • 确定性的触发时序
  • 降低CPU占用率
  • 提高实时性能

这些正是 ETM 设计的目标。 docs.espressif.com, docs.espressif.com


ETM基本概念

Event(事件)

外设产生的硬件事件。

例如:

  • GPTimer超时

  • GPIO边沿检测

  • ADC转换完成

  • DMA传输完成

    GPIO Falling Edge
    Timer Alarm
    ADC Done


Task(任务)

外设能够被触发执行的动作。

例如:

  • 启动ADC转换

  • 切换GPIO电平

  • 启动Timer

  • 停止Timer

    Start ADC
    Toggle GPIO
    Start Timer
    Stop Timer


ETM Channel(通道)

ETM通过Channel把Event和Task连接起来:

复制代码
Event
  │
  ▼
ETM Channel
  │
  ▼
Task

一个通道本质上是:

复制代码
1 Event  → 1 Task

一条连接关系。 github.com, docs.espressif.com


工作原理

例如:

场景1:定时采样ADC

不使用ETM
复制代码
GPTimer Alarm
      ↓
Interrupt
      ↓
ISR
      ↓
ADC Start
使用ETM
复制代码
GPTimer Alarm Event
          ↓
         ETM
          ↓
ADC Start Task

这样:

  • 采样周期更精准
  • 不受RTOS调度影响
  • CPU完全不用干预

docs.espressif.com, github.com


常见应用

1. GPIO直接控制

按钮按下直接翻转LED

复制代码
GPIO Falling Edge
       ↓
      ETM
       ↓
GPIO Toggle

CPU无需运行任何代码。 docs.rs, docs.rs


2. Timer触发ADC

复制代码
GPTimer Alarm
      ↓
     ETM
      ↓
ADC Start

适合:

  • 音频采样
  • 传感器采集
  • 电机控制

3. ADC完成后启动DMA

复制代码
ADC Done
    ↓
   ETM
    ↓
DMA Start

形成硬件流水线。


4. 电机控制

复制代码
PWM Compare Event
          ↓
         ETM
          ↓
GPIO Update

实现亚微秒级响应。


ETM 与中断的区别

项目 中断方式 ETM方式
CPU参与 需要 不需要
响应时间 μs级 ns~硬件级
实时性 受系统影响 高确定性
功耗 较高 更低
软件复杂度 高 较低

ETM本质上是:

用硬件连线代替软件中断处理。 docs.espressif.com, github.com


ESP-IDF中的配置流程

典型步骤:

1. 创建ETM Channel

复制代码
esp_etm_new_channel(...)

2. 获取Event

例如:

复制代码
gptimer_new_etm_event(...)

获得:

复制代码
GPTimer Alarm Event

3. 获取Task

例如:

复制代码
adc_new_etm_task(...)

获得:

复制代码
ADC Start Task

4. 连接

复制代码
esp_etm_channel_connect(
    channel,
    event,
    task
);

5. 使能

复制代码
esp_etm_channel_enable(channel);

此后:

复制代码
Event
 ↓
ETM
 ↓
Task

自动执行。 docs.espressif.com, github.com


一个形象理解

把 ETM 看成 MCU 内部的"硬件自动化总线":

复制代码
IF Event Happens
THEN Do Task

类似于:

复制代码
IF Timer Expired
THEN Start ADC

IF GPIO Falling Edge
THEN Toggle LED

IF ADC Done
THEN Start DMA

全部由硬件完成,不经过 CPU。


结合你当前正在看的 ESP32-S31 Datasheet ,如果 S31 延续 C6/H2 的 ETM 架构,那么它在低功耗传感器采集、Wi-Fi/BLE 数据触发和实时控制场景中会非常有价值。我也可以进一步结合 ESP32-S31 的具体 ETM 资源(支持哪些 Event 和 Task) 给你画出实际的硬件触发链路图。

相关推荐
一直C1 天前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
小此方1 天前
Linux网络(三十三):告别O(n)噩梦:从select/poll的挣扎到epoll红黑树+回调的降维打击,一文打通IO多路复用
linux·网络·驱动开发
硅基手札1 天前
SPI技术系列 12 · SPI 设备驱动实战
linux·驱动开发·单片机·嵌入式硬件·mcu·性能优化·系统架构
cchuangyeele0111 天前
2026年拨动开关销售厂家哪家专业?该怎么选才靠谱
驱动开发
kkkkkkkkkk_Z2 天前
新手自学嵌入式 | 学习日记:LCD显示原理、PWM控制、电容触摸屏(GT9147)驱动开发与项目实战
驱动开发·学习
zbyyd2 天前
Linux驱动:UART串口通信、GT9147触摸屏与IIO-ADC驱动开发
linux·驱动开发·arm
zbyyd2 天前
Linux驱动:SPI子系统与ADXL345三轴加速度传感器驱动开发
linux·驱动开发·arm
zbyyd2 天前
Linux驱动开发:Misc混杂设备与设备树实战
linux·驱动开发
一直C2 天前
嵌入式 Linux 驱动开发学习笔记:中断、等待队列与工作队列
linux·驱动开发·嵌入式硬件·学习·imx6ull