嵌入式使用DMA实现内存中数据传递

本文介绍了嵌入式系统中,S3C2440A单片机如何利用DMA控制器实现内存数据的高效传输。首先,文章详细阐述了DMA的工作原理,包括其如何替代CPU进行高速数据传输,以及S3C2440A中的四种传输模式和不同请求源。接着,讲解了DMA的配置步骤,涉及源和目的地址、传输方式和大小等关键设置。最后,通过内核代码示例展示了如何在Linux内核中实现DMA数据传递,包括内存分配、DMA寄存器配置和字符设备驱动的使用。
摘要由CSDN通过智能技术生成

想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。这一期我们主要介绍在内核中简单使用DMA实现内存数据传递。因为文章中没有介绍与框架相关的程序,只是使用字符设备来操作DMA,同时也没有抽象的层次,因此本文中代码分析部分会比较简单。但我还是会将文章分为两部分,第一部分我将介绍与DMA相关的知识。而第二部分讲解在内核中如何通过代码实现DMA的数据传递。

0cd1efdf64501279ac08c45bfebc8fde.png第一部分:DMA相关知识

计算机系统中各种常用的数据输入/输出方法有查询方式和中断方式,这些方式常见于CPU与慢速及中速外设之间的数据交换。但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。直接存储器存取(DMA)就是为了解决这个问题而生的。

采用DMA方式,在一定时间段内,由DMA控制器取代CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。同时很重要的一点是当DMA传输数据时,并不占用CPU资源,在这个时候CPU可以空出手来做其他的事情。这样我们既可以做大量数据的高速传输又可以让CPU有时间和资源去做其他的事情。

在S3C2440A中,已经有了集成了DMA模块,可以用来传递高速传输数据。数据传输有三个要素:源,目的,长度。

在2440中我们的源与目的地选择有四种情况:

·1.源头和目的都在系统总线上

·2.源在系统总线,而目的在外部总线

·3.源在外部总线,而目的在系统总线

·4.源头和目的都在外部总线

2440中源与目的实际上是通信的双方,而这双方是通过请求DMA传递信息的,所以我们将上面这些向DMA发送请求的(不管是源还是目的)称为请求源。他们请求DMA来传输数据。而在2440中有四条通道来设置不同的请求源。

DMA模式介绍:

DMA service mode:single service&Whole service。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整体服务。

DMA DREQ/DACK PROTOCOL:DMA请求和应答的协议有两种,Demond mode和 Handshake mode。

两者对Request和Ack的时序定义有所不同:

·在Demond模式下,如果DMA完成一次请求后如果Request仍然有效,那么DMA就认为这是下一次DMA请求,马上就会开始下一次的传输;

·在Handshake模式下,DMA完成一次请求后等待Request信号无效,如果Request无效,DMA会无效ACK两个时钟周期,再等待下一次Request。

下面我们来介绍DMA中数据传输的格式,注意,这里说的是传输格式,而不是传输的大小。在DMA中有两种传输格式,单元传输和burst4传输,相对于单元传输的每次读写一个单元,burst4可以一次完成四个单元的读写。单元代表的就是数据的大小有:字节,半字,字。

了解完上面的知识我们就可以了解总的数据的传输大小了:DSZ x TSZ x TC,其中DSZ就是上面说的数据的大小,TSZ是传输的格式,而TC是传输的次数。他们的乘积就是整个数据的大小了。

在我们的S3C2440中他是使用三态的有限状态机(

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值