DMA控制器和I/O处理器有什么区别

问题描述:

给定起始内存地址&字数DMA控制器在CPU工作于其他进程时传输数据。 的输入输出处理过处理给出的起始地址&字数.. I/O处理(纠正我,如果我错我)DMA控制器和I/O处理器有什么区别

那么什么是IOP & DMA控制器之间在功能上的区别?

+0

而且DMA控制器也是IOP的一部分吗? – Sach 2013-04-24 19:25:05

+0

dma控制器并不总是在cpu做其他事情时进行传输,有时cpu在dma发生时被保存。这取决于系统。你没有指定系统。我假设你的问题的答案是基于x86的,并且与I/O和内存接口之间的差异有关。 – 2013-04-24 21:43:27

+0

他们是同义词。 IOP与DMA控制器相同。正如*可以告诉你的。 – 2015-03-23 13:54:58

如果是特定于内存的I/O操作(在MIPS处理器的情况下,简单示例指令如lw $ r1,$ r2,16),CPU需要从内存中获取数据以方便I/O操作。因此,CPU必须暂停任何其他操作并监视内存READ/WRITE操作,直到它未完成。换句话说,只要正在进行读/写操作而没有DMA即可完全占用CPU。如果在此期间处理器空闲,则处理器可能执行了其他一些指令。

直接内存访问(DMA):

DMA提供了此功能以最少的CPU干预进行内存的具体操作。当任何I/O设备需要内存访问时。它发送一个DMA请求(以中断的形式)给CPU。 CPU通过向数据总线提供适当的授权信号来启动传输。并将控制权交给DMA控制器,该控制器控制数据传输的其余部分,并将数据直接传输到I/O设备。在此期间,CPU会继续执行其他指示。一旦完成读取/写入操作(或发生任何异常),DMA控制器就会启动中断并通知处理器读取/写入操作的状态。

通过这种方式还执行读取/写入操作,并且CPU在此期间还执行一些其他指令。但是,DMA的初始化仍然需要CPU干预。所以整体表现是最大化的。

I/O处理器

您可以认为沿着DMA方法的I/O处理器。 通常用于大型计算机系统的I/O处理器是一个协处理器,它除了能够传输数据外,还能够执行指令。顺便说一句,协处理器指令系统不同于*处理单元。

** CPU可以通过初始化基本操作来执行I/O特定程序,例如启用数据路径并设置参与操作的I/O设备。**然后它将任务传送到I/O处理器,然后执行其余的任务,并在完成后通知处理器。处理器同时执行其他重要指令。

I/O处理器本质上是一个小型DMA专用处理器,可以执行有限的输入和输出指令,并且可以由多个外设共享。

的I/O处理器解决了两个问题:

  • 输入和输出的工作由CPU假定。 尽管DMA不需要CPU来进行外设和内存之间的数据交换,但它只会减轻CPU的负担。因为在DMA中,输入和输出的初始化仍然由CPU完成。
  • 在大型计算机系统*享高速设备的DMA接口的问题。大型计算机系统外设太多以至于不得不共享DMA接口Limited(小型计算机系统,例如每个设备中的PC都被分配了DMA高速接口)。

DMA是一个硬件模块,能够在外设和存储器(UART,SPI,DAC,ADC)或两个不同的存储器地址之间传输数据,而不会消耗CPU处理时间。通常,配置DMA模块涉及设置内存目标地址和源地址,用户也可以配置诸如以下选项:缓冲区数据大小,自动地址增量和循环缓冲区。而且,这些模块在数据传输结束时发出一个IRQ信号。

以下是微控制器STM32F373的DMA配置示例。该示例显示了sigma-delta 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具有内存地址,但实际上读写操作是在外设寄存器中完成的。

+0

虽然是真的,但它并不回答“ios和dma控制器之间有什么区别”的问题。 – 2015-03-23 13:55:35

+0

所以我在互联网上做了一些研究,并且读到它只是命名的问题。 DMA和I/O处理器指的是同样的事情。 – 2015-03-24 19:53:19

+0

这就是我上面评论说的:) – 2015-03-24 19:53:58