给定起始内存地址和字数,DMA 控制器在 CPU 处理其他进程时传输数据。 输入输出处理器也处理给定起始地址和字数的 I/O 进程。 (如有错误请指正)
IOP 和 DMA 控制器在功能上有什么区别?
在内存特定的 I/O 操作中(简单的示例指令,如 MIPS 处理器中的 lw $r1,$r2,16),CPU 需要从内存中获取数据,以方便 I/O 操作。因此CPU必须暂停任何其他操作并监视内存读/写操作,直到它未完成。换句话说,只要在没有 DMA 的情况下进行读/写操作,CPU 就会被完全占用。如果这段时间处理器空闲,那么处理器可以执行一些其他指令。
直接内存访问(DMA):CPU 通过向数据总线提供适当的授权信号来启动传输。并将控制权传递给 DMA 控制器,后者控制其余的数据传输并将数据直接传输到 I/O 设备。在此期间,CPU 继续执行其他指令。一旦读/写操作完成(或发生任何异常),DMA 控制器就会启动中断并通知处理器有关读/写操作的状态。
这样同时进行读/写操作,同时CPU还执行一些其他指令。然而,DMA 的初始化仍然需要 CPU 干预。 因此整体性能最大化。
I/O处理器I/O处理器通常用于大型计算机系统,是一种协处理器,除了传输数据之外,还能够执行指令。顺便说一句,协处理器指令系统与中央处理器不同。
CPU 通过初始化基本操作(如使能数据路径、设置参与操作的 I/O 设备)来执行 I/O 特定程序。 然后将任务传递给 I/O 处理器,I/O 处理器再执行其余任务并在完成后通知处理器。处理器同时执行其他重要指令。
I/O处理器本质上是一个小型DMA专用处理器,可以执行有限的输入和输出指令,并且可以被多个外设共享。
I/O 处理器解决了两个问题:
下面有一个微控制器STM32F373的DMA配置示例。该示例显示了 Σ-Δ ADC 和内存缓冲区之间的 DMA 配置。
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
DMA_DeInit(DMA2_Channel3);
/* DISABLE the DMA SDADC1 channel */
DMA_Cmd(DMA2_Channel3, DISABLE);
/* DMA channel SDADC1 Configuration */
DMA_InitStructure.DMA_BufferSize = bufferSize;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SDADC1->JDATAR;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)memoryAddress;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
/* Avoid interrupt on DMA ENABLE */
DMA_ClearITPendingBit(DMA2_FLAG_TC3);
// Enable DMA2 Channel Transfer Complete interrupt
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);
/* Enable the DMA channel */
DMA_Cmd(DMA2_Channel3, ENABLE);
关于I/O处理器,我完全不明白你的意思。但我可以说GPIO硬件模块能够将一般的数字输入/输出映射到内存地址,即:I/O I/o具有内存地址,但读写操作实际上是在外设寄存器中完成的。