您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> Blackfin DMA 描述符实现乒乓缓存问题
本帖共有2546个阅读者
发表帖子 发表投票 回复主题
Blackfin DMA 描述符实现乒乓缓存问题
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
Blackfin DMA 描述符实现乒乓缓存问题

现在看了一段代码,是实现乒乓缓冲的,但始终不能明白。

给出部分代码:

void* DMA_descriptor[]=

{

(void *)(DMA_descriptor+2);

(void *)buff1;

(void *)(DMA_descriptor);

(void *)buff2;

}

*pDMAx_y_CONFIG=WNR|WDSIZE_16|DI_EN|0x7000|0x0400;

*pDMAx_y_START_ADDR=(void *)buff;//初始化的时候将把buff1的地址给它。

*pDMAx_y_NEXT_DESC_PTR=(void *)DMA_descriptor;

NDSIZE表示内存中加载的描述符单元的个数,这里为4,按我的理解,乒乓缓存不应该就初始化2个就可以了吗?

谢谢!



「该帖子被 liuhai2200 在 2012-11-26 09:02:11 编辑过」

完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/26 9:01:41
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

乒乓buffer的缓存是需要开2个,然后由很多标志位来配合实现的,你可以看一下中断中还有调用这2个buffer的代码部分,其标志位的判断是否符合乒乓buffer机制。


我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/11/26 10:23:56
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

* DMA_descriptor[]中buff1/buff2是两个开辟好的缓冲区,中断中,只有对IRQ寄存器写0x1操作。

麻烦能解释下这句代码*pDMAx_y_NEXT_DESC_PTR=(void *)DMA_descriptor;跟Config中NDSIZE=4,有什么联系吗?谢谢。




「该帖子被 liuhai2200 在 2012-11-26 15:31:31 编辑过」

完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/26 15:30:42
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
*pDMAx_y_NEXT_DESC_PTR 为下一个描述符的起始地址,NDSIZE描述的长度,当DMA读取新的描述符时,会从*pDMAx_y_NEXT_DESC_PTR的地址读取,然后根据NDSIZE的值,读取相应的描述符的长度。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/11/26 19:05:26
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢andy,但是还是不太明白。

在我贴出的代码中,将指针数组的地址DMA_descriptor给*pDMAx_y_NEXT_DESC_PTR ,那这里的NDSIZE为4与指针数组中的指针有什么关系吗?另外,pDMAx_y_NEXT_DESC_PTR 怎么跟我的buff联系到一块,大、小模型下的描述符参数都是放在连续的内存中吗?

始终没有搞明白这段代码是怎么实现乒乓缓存的。还请版主细细讲解。


完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/27 8:25:51
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

通过调试终于渐渐明白,还是理论加实践最为靠谱,呵呵。

DMA的描述符单元包括NEXT_DESC_PTR /START_ADDRESS/CONFIG/ XCOUNT/ XMODIFY/ YCOUNT/YMODIFY,其中 NEXT_DESC_PTR /START_ADDRESS各占32bit,为低16bit和高16bit,其描述符单元大小为2,其它单元为1,所以NDSIZE的值为1~9,当然前提是使用基于描述符的方式。至于描述符单元在内存中怎么存放那完全取决于你的代码,只要到时候DMA能加载你预先所设计的方式就可以了。我的代码中,就将下个描述符的地址与缓冲区的地址一起加载,所以NDSIZE为4。归根想想,还是被指针数组给绕晕了,所以还得补补C语言。


完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/27 15:34:30
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
C语言是基石,我现在每天都留1到2个小时来看C语言基础的教材。不是计算机专业出身,所以得加猛料恶补^^

我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/11/27 18:04:01
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159341 Call, 1 Queries, Processed in 0.033203 second(s),