dma方式

STM32之串口DMA接收不定长数据

风流意气都作罢 提交于 2019-12-01 13:37:59
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问 DMA 传输将数据从一个地址空间复制到另外一个地址空间。CPU只需初始化DMA即可,传输动作本身是由 DMA 控制器来实现和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。这样的操作并没有让处理器参与处理,CPU可以干其他事情,当DMA传输完成的时候产生一个中断,告诉CPU我已经完成了,然后CPU知道了就可以去处理数据了,这样子提高了CPU的利用率,因为CPU是大脑,主要做数据运算的工作,而不是去搬运数据。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。 在STM32的DMA资源 STM32F1系列

RT-Thread中的串口DMA分析

丶灬走出姿态 提交于 2019-11-30 11:49:35
这里分析一下RT-Thread中串口DMA方式的实现,以供做新处理器串口支持时的参考。 背景 在如今的芯片性能和外设强大功能的情况下,串口不实现DMA/中断方式操作,我认为在实际项目中基本是不可接受的,但遗憾的是,rt-thread现有支持的实现中,基本上没有支持串口的DMA,文档也没有关于串口DMA支持相关的说明,这里以STM32实现为背景,梳理一下串口DMA的实现流程,以供新处理器实现时以作参考。 DMA接收准备 启用DMA接收,需要在打开设备的时候做一些处理,入口函数为rt_device_open()。主体实现是: rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag) { ...... result = device_init(dev); ...... result = device_open(dev, oflag); ...... } device_init()就是rt_serial_init()函数,其主要是调用configure()函数, static rt_err_t rt_serial_init(struct rt_device *dev) { ...... if (serial->ops->configure) result = serial->ops->configure(serial,

DMA简介

好久不见. 提交于 2019-11-29 15:05:14
注意: 个人整理,有误无责。 0. CPU控制的数据传输方式介绍 由CPU控制的数据传输方式有两种:查询、中断。 0.1 查询方式    查询方式是由程序控制的,如果CPU中执行的程序需要进行数据传输,CPU查询外设状态,如果外设准备好,那么进行数据传输。 0.2 中断方式    当外设需要与CPU进行数据交换的时候,外设向CPU发出中断请求,CPU中断当前执行的程序,相应外设的数据传输请求。当外设的数据传输结束后,CPU继续执行被中断的程序. 上面两种方式,数据都需经过CPU来传递,下面介绍DMA控制的数据传递。 1. DMA介绍    DMA方式,Direct Memory Access,也称为成组数据传送方式,有时也称为直接内存操作。DMA方式在数据传送过程中,没有保存现场、恢复现场之类的工作。    由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。内存地址修改、传送字 个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。 (参考自百度) 2. 工作原理    直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。   

Linux 下的DMA浅析

不打扰是莪最后的温柔 提交于 2019-11-29 00:02:20
DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。 一、DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 a -- 软件请求数据 调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。 (2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。 (3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。 b -- 由硬件异步传输 在 DMA 被异步使用时发生的。以数据采集设备为例: (1)硬件发出中断来通知新的数据已经到达。 (2)中断处理程序分配一个DMA缓冲区。 (3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。 (4)处理程序利用DMA分发新的数据,唤醒任何相关进程。 网卡传输也是如此,网卡有一个循环缓冲区(通常叫做 DMA 环形缓冲区)建立在与处理器共享的内存中

Linux 4.0的dmaengine编程

*爱你&永不变心* 提交于 2019-11-29 00:01:21
在Linux 4.0下进行dmaengine的编程主要分为两部分,DMA Engine控制器编程和DMA Engine API编程。 DMA Engine API编程 slave DMA用法包括以下的步骤: 1. 分配一个DMA slave通道; 2. 设置slave和controller特定的参数; 3. 获取一个传输描述符; 4. 提交传输描述符; 5. 发起等待的请求并等待回调通知。 下面是以上每一步的详细说明。 1. 分配一个DMA slave通道 在slave DMA上下文通道的分配略有不同,客户端驱动通常需要一个通道,这个通道源自特定的DMA控制器,在某些情况甚至需要一个特定的通道。请求通道的API是channel dma_request_channel()。 其接口如下: struct dma_chan *dma_request_channel(dma_cap_mask_t mask, dma_filter_fn filter_fn, void *filter_param); 1 2 3 其中dma_filter_fn接口定义如下: typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param); 1 filter_fn是可选的,但是对于slave和cyclic通道我们强烈推荐使用

Linux platform驱动模型

帅比萌擦擦* 提交于 2019-11-28 23:14:54
/************************************************************************************ *本文为个人学习记录,如有错误,欢迎指正。 *本文参考资料: *         http://www.cnblogs.com/xiaojiang1025/p/6367061.html *         http://www.cnblogs.com/xiaojiang1025/p/6367910.html *         http://www.cnblogs.com/xiaojiang1025/p/6369065.html *         https://www.cnblogs.com/lifexy/p/7569371.html *         https://www.cnblogs.com/biaohc/p/6667529.html ************************************************************************************/ 1. platform总线 1.1 platform总线简介 在Linux2.6以后的设备驱动模型中,需关心总线,设备和驱动这三种实体,总线将设备和驱动绑定

深入浅出计算机组成原理学习笔记:DMA:为什么Kafka这么快?(第48讲)

时光总嘲笑我的痴心妄想 提交于 2019-11-28 15:52:48
一、引子 过去几年里,整个计算机产业届,都在尝试不停地提升I/O设备的速度。把HDD硬盘换成SSD硬盘,我们仍然觉得不够快;用PCI Express接口的SSD硬盘替代SATA接口的SSD硬盘, 我们还是觉得不够快,所以,现在就有了傲腾(Optane)这样的技术。 但是,无论I/O速度如何提升,比起CPU,总还是太慢。SSD硬盘的IOPS可以到2万、4万,但是我们CPU的主频有2GHz以上,也就意味着每秒会有20亿次的操作。 如果我们对于I/O的操作,都是由CPU发出对应的指令,然后等待I/O设备完成操作之后返回,那CPU有大量的时间其实都是在等待I/O设备完成操作。 但是,这个CPU的等待,在很多时候,其实并没有太多的实际意义。我们对于I/O设备的⼤量操作,其实都只是把内存里面的数据,传输到I/O设备而已。 在这种情况下,其实CPU只是在傻等而已。特别是当传输的 因此,计算机工程师们,就发明了DMA技术,也就是 直接内存访问(Direct Memory Access)技术,来减少CPU等待的时间。 二 、理解DMA,一个协处理器 1、什么是DMA? 其实DMA技术很容易理解,本质上,DMA技术就是我们在主板上放⼀块独立的芯片。在进行内存和I/O设备的数据传输的时候,我们不再通过CPU来控制数据传输, 而直接通过 DMA控制器(DMA?Controller,简称DMAC)。这块芯片

网络数据包收发流程(三):e1000网卡和DMA

扶醉桌前 提交于 2019-11-28 01:00:35
转载 https://www.cnblogs.com/CasonChan/p/5166239.html 一、硬件布局 每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546。 上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协助,如TSEC,PCI controller 以太网数据在 TSEC<-->DDR PCI_Controller<-->DDR 之间的流动,CPU的core是不需要介入的 只有在数据流动结束时(接收完、发送完),DMA Engine才会以外部中断的方式告诉CPU的core 二、DMA Engine 上面是DMA Engine的框图,以接收为例: 1. 在System memory中为DMA开辟一端连续空间,用来BD数组 (一致性dma内存) BD是给DMA Engine使用的,所以不同的设备,BD结构不同,但是大致都有状态、长度、指针3个成员。 2. 初始化BD数组,status为E,length为0 在System memory中再开辟一块一块的内存,可以不连续,用来存放以太网包 将这些内存块的总线地址赋给buf(dma映射) 3. 当MAC接收以太网数据流,放在了Rx FIFO中 4. 当一个以太网包接收完全后,DMA engine依次做以下事情 fetch bd

反射内存 RFM5565 分散/集聚的 DMA 操作示例

送分小仙女□ 提交于 2019-11-27 08:08:44
反射内存RFM5565分散/集聚的DMA 操作示例 注:scatter/gather 方式是与block dma 方式相对应的一种dma 方 式。 连续的。但在有的计算机体系中,如IA,连续的存储器地址在物理 在dma 传输数据的过程中,要求源物理地址和目标物理地址必须是 上不一定是连续的,则dma 传输要分成多次完成。 如果传输完一块物理连续的数据后发起一次中断,同时主机进行下一 块物理连续的传输,则这种方式即为block dma 方式。 scatter/gather 方式则不同,他是用一个链表描述物理不连续的存储器, 然后把链表首地址告诉dma master。dma master 传输完一块物理连续 的数据后,就不用再发中断了,而是根据链表传输下一块物理连续的 数据,最后发起一次中断。 很显然scatter/gather 方式比block dma 方式效率高。 分散/集聚DMA 传输是一种用于执行分割成不同小块的大型数 据的传输的模式。注意:在一个数据页不能跨越4 GB 的地址边界。 该DMA 描述符指针是链表页描述地址。 每个页面描述符定义一个地址和数据块大小加上下一个描述符 块的指针。当数据被读取/写入到相应的页面,自动获取描述符。描 述链处理直到数据传输完成或达到的描述链的末端,以先到者为准。 页面描述符块不能被映射在64 位寻址空间。第一个描述符必须 是一个16

计算机组成原理复习题二

时光毁灭记忆、已成空白 提交于 2019-11-26 12:33:28
原文地址: https://wenku.baidu.com/view/935be3d1c1c708a1284a4446 一、选择题 1、在间址周期中,_C_____。 A.所有指令的间址操作都是相同的; B.凡是存储器间接寻址的指令,它们的操作都是相同的; C.对于存储器间接寻址或寄存器间接寻址的指令,它们的操作是不同的; D.以上都不对。 2、将有关数据加以分类、统计、分析,以取得有利用价值的信息,我们称其为_C_____。 A. 数值计算 B. 辅助设计 C. 数据处理 D. 实时控制 3、定点16位字长的字,采用2的补码形式表示时,一个字所能表示的整数范围是____A_。 A.-215 ~ +(215 -1) B.-(215 –1)~ +(215 –1) C.-(215 + 1)~ +215 D.-215 ~ +215 4、根据传送信息的种类不同,系统总线分为___B___。 A. 地址线和数据线 B. 地址线、数据线和控制线 C. 地址线、数据线和响应线 D. 数据线和控制线 5、外存储器与内存储器相比,外存储器__B____。 A.速度快,容量大,成本高 B.速度慢,容量大,成本低 C.速度快,容量小,成本高 D.速度慢,容量大,成本高 一个256K×8的存储器,其地址线和数据线总和为___C___。 注解:256=2的8次方,所以地址线为8,256K*8