、中断(Interrupt)和DMA(Direct Memory Access)是三种主要的数据传输控制方式)
I/O技术中程序查询Polling、中断Interrupt和DMADirect Memory Access是三种主要的数据传输控制方式它们在CPU参与程度、效率、实时性和硬件复杂度等方面有显著区别对比维度程序查询Polling中断InterruptDMADirect Memory AccessCPU参与度CPU持续轮询设备状态全程主动干预CPU发起I/O后可执行其他任务设备就绪时发中断请求CPU响应处理CPU仅初始化DMA控制器数据传输由DMA控制器独立完成CPU基本不参与效率低效大量CPU时间浪费在等待和轮询上较高避免空等提高CPU利用率最高数据块直接在设备与内存间传输无需CPU逐字节搬运实时性差可能错过设备就绪时机若轮询间隔过长较好设备就绪即通知延迟可控一般取决于DMA优先级与总线竞争但适合大数据量突发传输硬件开销低仅需基本接口中需中断控制器、中断向量表、现场保护机制高需专用DMA控制器、总线仲裁逻辑适用场景简单/低速设备如按键、LED中低速、事件驱动型设备如键盘、串口高速、大批量数据传输设备如磁盘、网卡、显存✅ 补充说明程序查询简单可靠无中断开销但严重占用CPU中断平衡了响应性与资源利用但频繁中断会导致上下文切换开销DMA彻底解放CPU但需额外硬件支持且需注意缓存一致性尤其在带Cache系统中。典型流程对比以读取磁盘数据为例 • 查询方式CPU反复读取磁盘控制器状态寄存器 → 等待BUSY0 → 发送读命令 → 再轮询 → 逐字节读取数据 • 中断方式CPU发读命令 → 去执行其他任务 → 磁盘就绪后发IRQ → CPU保存现场 → 执行ISR从端口读数据 • DMA方式CPU设置DMA控制器内存地址、字节数、方向→ 启动DMA → DMA控制器接管总线 → 直接将磁盘数据写入内存 → 传输结束发中断通知CPU。在嵌入式系统中尽管中断和DMA通常更高效但程序查询Polling仍被选用主要出于以下实际约束与设计权衡✅选择程序查询的核心原因极简硬件与资源受限低端MCU如8位/16位单片机可能无中断控制器、或中断资源向量号、优先级寄存器严重不足节省BOM成本省去外部中断引脚保护电路、去抖硬件等。确定性与时序严格性要求实时性关键场景如电机PWM同步采样、SPI Flash页写入等待需可预测的响应延迟中断响应时间受关中断、压栈、ISR调度等影响存在不确定性jitter而轮询延迟完全可控固定周期指令周期可精确计算。避免中断开销与竞态风险极小系统RAM 2KB无法承担中断现场保存/恢复的栈开销简单裸机程序无RTOS中断中调用非重入函数易引发数据竞争而轮询在主循环中串行执行逻辑清晰、调试直观。低频/短时交互场景性价比更高如读取温度传感器每秒1次、检测拨码开关状态——轮询1ms一次仅消耗微秒级CPU时间远低于中断上下文切换常1–5μs避免“为省1% CPU而引入10%复杂度”的过度设计。适用边界判断准则经验法则维度适合程序查询应转向中断/DMA设备响应时间≤ 数十微秒如GPIO电平变化 100μs 或不可预测如UART接收不定长帧事件频率≤ 几Hz如按键、环境光传感器≥ 100Hz如编码器脉冲、ADC连续采样CPU负载余量主循环90%以上空闲轮询开销 5% CPU时间CPU利用率已70%轮询导致任务延迟超标实时性要求要求最大延迟确定且极小如2μs可接受平均延迟低、但容忍少量抖动如USB通信系统复杂度目标代码量2KB、无OS、开发周期1周需多任务、高可靠性、长期维护 典型应用举例✅ 合理使用STM32驱动OLED SSD1306I²C总线每次传输32字节主循环中轮询ACK❌ 不合理使用用轮询方式接收115200bps UART流每字节约87μs轮询错过率极高。// 示例安全的轮询式GPIO按键检测无抖动、无中断while(1){if(GPIO_ReadPin(BUTTON_PIN)RESET){// 低电平有效delay_us(20);// 硬件/软件消抖if(GPIO_ReadPin(BUTTON_PIN)RESET){handle_key_press();// 确认按下while(GPIO_ReadPin(BUTTON_PIN)RESET);// 等待释放}}run_main_task();// 其他业务逻辑}