dma方式

DMA详解

佐手、 提交于 2019-12-18 00:27:47
1、DMA由来 DMA(Direct Memory Access,直接存储器访问)。在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。 1.1程序传送方式 程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和查询(条件传送方式)两种。 1.1.1无条件传送方式 微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。 1.1.2查询(有条件)传送方式 查询传送也称为条件传送,是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口电路中既要有数据端口,还要有状态端口。 1.2中断传送方式 中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序

零拷贝 zero-copy 原理

点点圈 提交于 2019-12-10 13:11:18
引言 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操作系统有效进行数据传输操作的能力。 零拷贝( zero-copy )技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理 I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要 CPU 数据拷贝操作。 什么是零拷贝? 零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。 零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。而且,零拷贝技术减少了用户应用程序地址空间和操作系统内核地址空间之间因为上下文切换而带来的开销

利用AXI-DMA批量发送数据到DMA

旧街凉风 提交于 2019-12-06 04:55:43
1.1 主函数 int main ( void ) { XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); XGpio_SetDataDirection(&Gpio, 1, 0); init_intr_sys(); XGpio_DiscreteWrite(&Gpio, 1, 1); axi_dma_test(); } 1.2 三个简单函数 (1)、XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); 本语句对GPIO进行初始化,对实例数据进行配置。 (2)、XGpio_SetDataDirection(&Gpio, 1, 0); 设置GPIO的方向,向通道1写0,0:输出,1:输入。 (3)、XGpio_DiscreteWrite(&Gpio, 1, 1); 设置GPIO的输出为1。 一、 init_intr_sys函数分析 1、DMA_Intr_Init(&AxiDma,0); DMA中断实例化函数,将要配置的DMA信息先lookupConfig再进行CfgInitialize,DMA采用块模式(Block mode),如果是Sg模式,则配置失败。 2、Timer_init(&Timer,TIMER_LOAD_VALUE,0); 定时器初始化函数,传入参数有定时器结构、加载值,设备ID

接口技术第六章——输入输出接口及数据传输控制方式总结

老子叫甜甜 提交于 2019-12-06 04:14:53
正在学习接口技术和计算机组成原理,中间有一些重叠的部分就放在一起了,至于DMA,中断之类的会放在后面讲解 6.1 接口综述 硬件接口通常称为I/O接口,把外围设备同微型计算机连接起来的电路称为外设接口电路,简称外设接口。I/O接口是CPU同外界进行信息交换的中转站 使用接口的原因 速度不匹配 外设外慢 时序不匹配 各个外部设备都有自己的定时控制电路,以自己的速度进行传输,同CPU的时序不匹配 信息格式不匹配,不同的外设存储和处理信息的格式不同 信息类型不匹配,有些是数字电路,有些是模拟电路 CPU与外设之间所传送的数据类型 数据信息 包括模拟量,数字量,开关量,可以输入也可以输出 状态信息 这是I/O端口送给CPU的有关本端口所对应的外设当前状态的信息,供CPU参考分析 控制信息 这是CPU送给I/O设备的控制命令,使相应的外部设备完成特定的操作 在8086/8088中,这三种信息的输入输出基本一致,可以分发不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入输出的数据中设置特征位 接口的功能(背) 执行CPU命令 CPU将对外设的控制命令发到接口电路的命令寄存器中,以便控制外设按要求进行工作 返回外设状态 通过外设寄存器(状态口)完成,包括正常工作状态和故障状态 数据缓冲的功能 (平滑作用)接口电路中的数据寄存器(数据口)对CPU与外设设备之间的数据进行中转

8237A DMA控制器简答

守給你的承諾、 提交于 2019-12-06 03:18:52
(1)、比较中断和DMA两种传输方式的特点。 在中断模式下,外设需与主机传送数据时要请求主机给与中断服务,中断当前主程序的执行,自动转向对应的中断处理程序,控制数据的传输,过程始终是在所执行的指令控制之下。 在DMA模式下,系统中有一个DMA控制器,它是一个可驱动总线的主控部件。当外设与存储器之间需要传送数据时,外设向DMA控制器发出DMA请求,DMA控制器向CPU发出总线请求,取得总线控制权后,DMA控制器按照总线时序控制外设与存储器间的数据传输而不是通过指令来控制数据传输,传输速度大大高于中断方式。 (2)、DMA控制器应具有哪些功能? DMA控制器应有DMA请求输入线,接收I/O设备的DMA请求信号; DMA控制器应有向主机发出总线请求的信号线和接收主机响应的信号线; DMA控制器在取得总线控制权以后应能发出内存地址、I/O读写命令及存储器读写命令控制I/O与存储器间的数据传输过程。 (3)、80286系统一个存储单元是24位物理地址,而8237A在寻址内存空间时,只能给出16位地址码,这一矛盾是如何解决的?有哪些硬件和软件措施? (4)、8237A提供哪几种传送方式? 8237A提供一下几种传送方式: 请求传送方式 单字节传送方式 数据块传送方式 级联传送方式 (5)、8237A只有8位数据线,为什么能完成16位数据的DMA传送? I/O与存储器间在进行DMA传送过程中

计算机组成原理之组成_2019-10-29

假如想象 提交于 2019-12-05 07:20:55
内容主要关于计算机总线与IO设备、计算机储存器、计算机的CPU; 计算机的总线  概述   平常我们日常所见的USB,既是通用串行总线(Universal Serial Bus),它提供了提供了对外连接的接口,且不同设备可以通过USB接口进行连接;是一种连接的标准,可以解决不同设备之间的通 信问题,也能够促使外围设备接口的统一。   总线(Bus)也是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传 输数据、数据地址和控制信号。   在不使用总线进行传输的时候,一般采用分散连接的方式,既输入设备同时与存储器、运算器、控制器连接,这样做会使得线路过于复杂。总线可以用来替代原来的基于运算器为主的分散式连接,通过总 线将多个部件连接在一起,使得运算器只需要与总线打交道,实现了存储器为主的计算机并且方便了硬件的扩展。  总线的分类   总线分为片内总线和系统总线。   片内总线    片内总线,既是高集成度芯片内部的信息传输线。如:寄存器与寄存器之间或寄存器与控制器、运算器之间。    系统总线     系统总线分为数据总线、地址总线、控制总线。是CPU、主内存、IO设备、各组件之间的信息传输线。     数据总线,可以双向传输各个部件的数据信息,数据总线的位数(宽度)

STM32_ADC

女生的网名这么多〃 提交于 2019-12-04 22:03:56
裸机--ADC 简介 STM32f103 系列有 3 个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道。 其中ADC1 和 ADC2 都有 16 个外部通道,ADC3 根据 CPU 引脚的不同通道数也不同,一般都有8 个外部通道。 功能 电压输入范围: ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定. 一般把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为:0~3.3V。 电压范围变宽 外部电压转换为0-3.3V. 输入通道 外部通道(最多16道) ADCx_IN0~~ADCx_IN15 内部通道 ADC1 的通道 16 连接到了芯片内部的温度传感器,Vrefint 连接到了通道 17。 ADC2 的模拟通道 16 和 17 连接到了内部的 VSS。 ADC3 的模拟通道 9、14、15、16 和 17 连接到了内部的 VSS。 规则通道 注入通道 触发源 ADC控制写0/1 定时器触发 外部IO触发 转换时间 时钟 ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M, 采样时间 采样周期最小1.5个周期 Tconv = 采样时间 +12.5 个周期。当 ADCLK = 14MHZ (最高)

STM32L15x——ADC使用DMA数据只接收一次(已解决)

自作多情 提交于 2019-12-04 16:22:36
前提:我用的芯片是STM32L系列,可能对其它STM32系列不完全适用,仅供参考! 一、问题描述 我在使用DMA方式读取单ADC单通道采集的数据时,发现只能正确的采集一次数据,后来的就一直与第一次的相同。 配置DMA时,用于保存转换数据的16位变量的地址和ADC_DR寄存器的地址都没问题,DMA模式是DMA_Mode_Circular(循环模式),存储器地址自增也关闭了,一切我能查到的都配置好了,但是还是不行。 二、发现问题 按理说配置出问题应该先去查手册,但是无奈手册只有英文,我在网上找不到解决方案就只能硬着头皮看手册了,最后把STM32L151xx的参考手册ADC章节关于DMA的部分给翻译了一遍,才找到了问题的解决方案。 手册原文(P286): 翻译过来大体意思: 所以问题就出来,因为我只需要将每一个AD转换的值保存在一个16位的变量中,所以将DMA_BufferSize=1,这就导致我传输一次就结束了,而ADC_CR2的DDS位也没配置,默认是0,即传输完一次后就不会在接受新的DMA请求了。 三、解决问题 了解了原因所在后,解决方法就很简单了,你可以直接在ADC初始化的直接给ADC_CR2的DDS位置1,当然我也在标准库中找到了一个函数: ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); 其实内部也是对DDS位操作的

DMA复习

穿精又带淫゛_ 提交于 2019-12-03 14:09:41
DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。 作用:为CPU减负。 TM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道。DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个DMA请求的优先权。 DMA配置程序过程: ① 使能DMA时钟 RCC_AHBPeriphClockCmd(); ② 初始化DMA通道参数 DMA_Init(); ③使能串口DMA发送,串口DMA使能函数: USART_DMACmd(); ④使能DMA1通道,启动传输。 DMA_Cmd(); ⑤查询DMA传输状态 DMA_GetFlagStatus(); ⑥获取/设置通道当前剩余数据量: DMA_GetCurrDataCounter(); DMA_SetCurrDataCounter(); 来源: https://www.cnblogs.com/tiange-137/p/11798404.html

scatter/gather I/O

匿名 (未验证) 提交于 2019-12-03 00:38:01
发散/汇聚映射 int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction); 各参数含义如下: dev:设备数据结构指针 sg:缓冲区列表的第一个缓冲区的指针 nets:sg中有多少个缓冲区 direction:数据流动方向 该函数的返回值是成功映射了多少个缓冲区。如果在分散/汇聚列表中一些缓冲的物理地址或虚拟地址相邻的,且IOMMU可以将它们映射成单个内存块,则返回值可能比输入值nents小。 数据结构scatterlist包含了每个缓冲区的信息,其定义如下: struct scatterlist { #ifdef CONFIG_DEBUG_SG unsigned long sg_magic; #endif unsigned long page_link; unsigned int offset; unsigned int length; dma_addr_t dma_address; #ifdef CONFIG_NEED_SG_DMA_LENGTH unsigned int dma_length; #endif }; 注意如果sg已经映射过了,则不能再对其进行映射,再次映射会损坏sg中的信息。对于sg中的每个缓冲,该函数会正确的为