一、中断与轮询区别(无DMA)
| | | | |
| 特性 | 轮询方式 (Polling) | 中断方式 (Interrupt) | DMA方式 (Direct Memory Access) |
|---|---|---|---|
| CPU参与度 | CPU主动、持续询问设备状态 | CPU被动等待,设备就绪后通知CPU | CPU仅启动和收尾参与,传输过程完全脱离 |
| 响应时机 | 取决于轮询频率(有延迟) | 设备就绪立即触发(响应快) | DMA控制器直接响应,无需CPU介入 |
| CPU效率 | 低------CPU不断"空转"检查 | 高------CPU可并行处理其他任务 | 最高------CPU全程不参与数据传输 |
| 实现复杂度 | 简单,纯软件实现 | 较复杂,需要硬件支持中断控制器 | 最复杂,需要独立DMA控制器和总线仲裁 |
| 适用场景 | 设备状态变化快、简单系统 | 设备状态变化慢、多任务系统 | 高速大批量数据传输(磁盘、网络、显卡) |
二、三种IO
类比方式
|---------|----------------------------|
| 轮询 | 每分钟刷新物流页面,啥事干不了 |
| 中断 | 手机做别的事,快递到了接电话去开门(但每次只送一件) |
| DMA | 告诉门卫"整批货直接放仓库,搬完叫我",自己完全不管 |
三、代码示意
// 轮询方式:CPU忙等
while (device_status != READY) {
// 空循环,CPU被占用
}
read_data();
// 中断方式:CPU做其他事,设备就绪后触发中断处理
// 主程序
while (1) {
do_other_work(); // 正常执行
}
// 中断服务程序(ISR)
void ISR() {
read_data(); // 设备就绪时自动执行
}
四、中断参考代码
cpp
#include "exynos_4412.h"
int main()
{
//将GPX1_1设置成中断功能
GPX1.CON=GPX1.CON &(~(0xF<<4)) |(0xF<<4);
//设置GPX1_1中断触发方式
EXT_INT41_CON=EXT_INT41_CON &(~(0x7<<4)) |(0x2 <<4)
//使能GPX1_1中断功能
EXT_INT41_MASK=EXT_INT41_MASK &(~(1<<1));
return 0;
}