4. 传统CPU搬运显示数据的模式:轮询方式与中断方式的性能瓶颈分析

在嵌入式LCD驱动中,显示数据的搬运(Frame Buffer → LCD控制器/GRAM)是决定帧率和系统实时性的关键路径。在未引入DMA之前,CPU通常采用轮询(Polling)或中断(Interrupt)两种方式完成数据搬运。本章深入剖析这两种传统模式的微观机制与宏观性能瓶颈,为后续DMA优化建立对比基准。

4.1 轮询方式:忙等与CPU独占

轮询方式下,CPU主动循环检查LCD控制器的状态寄存器(如“发送FIFO空”或“传输完成”标志),一旦条件满足,立即写入下一个像素数据。其核心流程如下:

轮询搬运伪代码(单像素模式)
void lcd_polling_transfer(uint16_t *fb, uint32_t count) {
    for (uint32_t i = 0; i < count; i++) {
        // 忙等:直到LCD控制器准备好接收新数据
        while (!(LCD->SR & LCD_SR_TXE));
        // 写入一个像素(16位色深)
        LCD->DR = fb[i];
    }
    // 等待最后一笔传输完成
    while (!(LCD->SR & LCD_SR_TC));
}

4.1.1 轮询模式的性能特征

指标 典型值(@72MHz Cortex-M3) 说明
单像素搬运周期 ~12~18 CPU cycles 含状态读取、位测试、分支、数据写入
CPU占用率 100%(搬运期间) CPU完全被循环占用,无法响应其他任务
帧缓冲搬运时间(320×240 RGB565) ~18~27 ms 153,600像素 × 15 cycles / 72MHz
最大帧率(仅搬运) ~37~55 fps 受限于CPU主频和总线带宽
关键洞察:轮询方式在搬运期间将CPU完全“锁死”。对于需要同时处理触摸扫描、传感器读取或通信协议栈的系统,轮询会导致严重的任务延迟抖动(Latency Jitter)。

4.1.2 轮询瓶颈的SVG分析图

下图展示了轮询方式下CPU时间片的分配情况。灰色区域表示CPU被搬运循环完全占据,系统任务(Task A/B)在此期间无法获得执行机会。

轮询搬运模式:CPU时间片占用分析 t CPU 100% 占用:轮询搬运显示数据 系统任务(触摸/传感器/协议)被阻塞,无法执行 轮询瓶颈总结 CPU在搬运期间无法响应中断 → 系统实时性下降 帧率受限于CPU主频,无法利用总线并行性

4.2 中断方式:上下文切换的隐性成本

中断方式试图解决轮询的“CPU独占”问题:CPU在发起传输后可以返回主循环执行其他任务,每次LCD控制器准备好接收新数据时触发中断,在中断服务函数(ISR)中写入下一个像素。其典型实现如下:

中断搬运伪代码(单像素中断模式)
volatile uint16_t *pixel_ptr;
volatile uint32_t pixel_count;

void LCD_TXE_IRQHandler(void) {
    if (pixel_count > 0) {
        LCD->DR = *pixel_ptr++;
        pixel_count--;
    } else {
        // 传输完成,关闭中断
        LCD->CR &= ~LCD_CR_TXEIE;
    }
}

void lcd_interrupt_start(uint16_t *fb, uint32_t count) {
    pixel_ptr = fb;
    pixel_count = count;
    LCD->CR |= LCD_CR_TXEIE;  // 使能发送FIFO空中断
    // CPU返回主循环,后续传输由中断驱动
}

4.2.1 中断方式的性能特征

指标 典型值 说明
单像素中断开销 ~40~80 CPU cycles 含入栈/出栈、中断向量跳转、ISR执行、返回
CPU占用率(搬运期间) ~30%~60% 取决于中断频率与主循环任务量
帧缓冲搬运时间(320×240) ~85~170 ms 中断开销放大,实际帧率大幅下降
最大帧率(仅搬运) ~6~12 fps 中断上下文切换成为主要瓶颈
常见误区:很多开发者认为“中断=高效”,但在高频率、小数据量的场景(如逐像素搬运),中断的上下文切换开销反而会拖垮吞吐量。每像素一次中断意味着每~0.5μs就要执行一次完整的入栈/出栈操作,这对实时系统是灾难性的。

4.2.2 中断瓶颈的SVG分析图

下图展示了中断方式下CPU的时间线。可以看到,虽然CPU在中断间隙可以执行其他任务,但频繁的上下文切换(红色尖峰)消耗了大量CPU周期,且任务执行被不断打断。

中断搬运模式:上下文切换与时间碎片分析 t ISR 上下文切换 主循环任务(碎片化) 中断方式三大性能瓶颈 1. 上下文切换开销:每次中断约40~80 cycles,153,600像素 → 额外6~12M cycles 2. 任务碎片化:主循环任务被频繁打断,缓存命中率下降,流水线冲刷 3. 中断延迟累积:高优先级中断可能被低优先级中断阻塞,造成显示撕裂 4. 总线利用率低:每次中断只搬运1个像素,无法利用突发传输(Burst)

4.3 轮询 vs 中断:综合对比与适用场景

对比维度 轮询方式 中断方式
CPU占用率 100%(搬运期间) 30%~60%(取决于中断频率)
单像素有效吞吐量 高(~12 cycles/px) 低(~60 cycles/px,含上下文切换)
系统实时性 差(无法响应其他中断) 中等(高优先级中断可抢占)
代码复杂度 低(简单循环) 中(需管理中断使能/标志)
适用场景 裸机、单任务、对帧率要求高 多任务、低帧率、需要响应外部事件
最大帧率(320×240) ~37~55 fps ~6~12 fps
核心结论:轮询和中断在显示数据搬运场景下都存在根本性的性能天花板。轮询浪费CPU的“空闲等待”能力,中断则被上下文切换开销反噬。两者都无法充分利用现代MCU的总线并行性和突发传输能力。这正是DMA(Direct Memory Access)技术介入的切入点——下一章将详细分析DMA如何通过硬件自动搬运、零CPU干预、突发传输等机制,彻底打破上述瓶颈。

4.4 本章小结

  • 轮询方式:CPU 100%占用,吞吐量高但系统实时性为零,适合极简裸机场景。
  • 中断方式:CPU可并发执行其他任务,但每像素一次中断导致上下文切换开销放大,实际帧率仅为轮询的1/5~1/3。
  • 共同瓶颈:CPU与数据搬运强耦合,无法利用总线并行性;逐像素搬运模式浪费了现代MCU的突发传输能力。
  • 优化方向:将CPU从搬运循环中解放出来,让硬件自动完成批量数据传输——这正是DMA的核心价值。