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)在此期间无法获得执行机会。
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周期,且任务执行被不断打断。
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的核心价值。