DMA缓存解耦的一点见解
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DMA缓存解耦的一点见解
DMA(英文全称:Direct Memory Access,中文:直接内存访问)是一种不经过CPU 而直接从内存存取数据的数据交换模式。
在DMA 模式下,CPU 只须
向DMA 控制器下达指令,让DMA 控制器来处理数据的传送,数据传送完毕
再把信息反馈给CPU,这样就很大程度上减轻了CPU 资源占有率,可以大大
节省系统资源。
DMA 的传输模型结构见下图:
Figure 1 DMA 传输模型
从上图可知,使用DMA 从源地址传输数据到目的地址,数据都必须通过DMA 控制器内部的寄存器或FIFO 作缓存,而不是在源和目的地之间直接传输,这是因为源和目的所在设备的传输速度不一样,接口也不一样,要适应这些情况,数据在DMA 控制器内的缓存是必不可少的,这样可使在低速设备传输数
据时,高速设备可被释放并可被重新利用,这可看作是一种解耦,使低速设备
和高速都能高效工作而不相互影响。
笔者在工作过程中,曾遇到一个有关DMA 的issue,具体如下:在某个应用使用DMA 进行大数据量传输过程中,经常出现数据传输异常,检查系统的调
试打印信息,发现DMA 在阶段性传输结束(会产生相应的中断)后,重新启动
新阶段的DMA 传输(使用相同的通道)时,有时会出现申请的DMA 通道还在活
动状态的情况,导致后面的数据传输无法正常启动。
按照一般的思路,驱动程
序设置好参数,启动DMA 后,就可以去做其他工作,中断的到来就意味着该
次的DMA 传输结束了,但矛盾的是有时发现传输结束的DMA 通道却不在空
闲状态,要说明的是,所有的DMA 通道资源都是预先分配好的,不同驱动程
序使用各自不同的通道,不会互相干扰。
开始认为是驱动程序没有设计好,出。