6

给定起始内存地址和字数 DMA 控制器在 CPU 处理其他进程时传输数据。输入输出处理器也处理给定起始地址和字数的 I/O 进程。(如果我错了,请纠正我)

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

4

2 回答 2

4

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

直接内存访问(DMA):

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

这样,读/写操作也被执行,CPU 在此期间也执行一些其他指令。但是,DMA 的初始化仍然需要 CPU 干预。因此,整体性能最大化。

输入输出处理器

您可以将 I/O 处理器视为 DMA 方法。 通常用于大型计算机系统的 I/O 处理器是一种协处理器,除了传输数据外,它还能够执行指令。顺便说一下,协处理器指令系统不同于中央处理器。

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

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

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

  • 输入和输出的工作由 CPU 承担。DMA虽然不需要CPU进行外设和内存之间的数据交换,但只是减轻了CPU的负担。因为在DMA中,输入输出的初始化还是由CPU来完成的。
  • 大型计算机系统中高速设备的DMA接口共享问题。一个大型计算机系统的外围设备太多以至于它不得不共享有限的 DMA 接口(小型计算机系统如 PC 中的每个设备都分配了一个 DMA 高速接口)。
于 2017-06-06T11:40:49.707 回答
1

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/OI/o有一个内存地址,但读写操作实际上是在外设寄存器中完成的。

于 2015-03-23T13:50:25.050 回答