阅读:2086回复:15
有关dma传输的block模式问题
各位大侠帮助小弟理清这个问题,我用的是c模式,当dma传输时采用block的mode,我不知道怎么理解这个block的mode,就是一个大块吗?但是这个block和我们每次dma传输的字节数有什么联系,这个block的大小是否可以自己定义,如果可以定义的话如何定义,是否通过寄存器那?望各位帮忙,多谢了。
|
|
|
沙发#
发布于:2003-06-20 13:14
如果是9054则你的问题大小是可以自己定义的,块字节数等于字节数,但是需要注意有的DMA模式不支持非32位操作。具体寄存器仔细阅读9054的手册中关于寄存器的部分,有详细介绍。
|
|
板凳#
发布于:2003-06-20 15:45
按照qizhi兄的意思,就是说我不用关心块的大小,是由9054自己定义的,但是是根据我们dma传输的字节数来自动转化的,是不是这样理解,要不是这样的话,块的大小如何定义阿,和我们dma传输的字节数有什么联系,我看了有关dma的所有寄存器没有找到有关定义块大小的寄存器。不知道是再那个寄存器里定义的块的大小。
|
|
|
地板#
发布于:2003-06-20 22:43
应该象你说的,但是块的大小不是任意的。你如果有RDK板,直接试一下就可以了。块大小应该就是你的字节数(保证支持块)。似乎块的大小是靠DMA的存储器长度来决定的
|
|
地下室#
发布于:2003-06-23 11:34
qizhi兄你说块的大小不是任意的,是我的字节数,你这里所说的字节数是不是就是dma传输的字节数?你说块的大小是靠dma的存储器长度来决定的,你说的储存器是不是就是9054内部的fifo?
|
|
|
5楼#
发布于:2003-06-23 13:42
我认为:字节数就是dma传输的字节数
储存器不是就是9054内部的fifo的长度,而似乎应该是从系统申请的长度。因为你可以传送几M~几十MB数据,而FIFO只有几十个字。不同的方式从系统请求的可用于DMA的存储器大小有差异。 |
|
6楼#
发布于:2003-06-23 23:31
dma的数据是由用户来定义的,这个数在windriver中的dma调用函数中设置。
但是我想问一问qizhi兄,9054在dma时,应该是分块操作的吧? 如果我们要dma64k的数据到local端,据我观察,9054是把64k的数据分割成16个数据块,即每个块4k,相邻个块之间有一定的时间间隔。是这样的吗?而现在我的问题是如果我们要dma64k的数据到pc的内存,而我现在观察到,读入时的数据块是1k,一共要64个数据块。现在我要利用9054实现两台计算机的通信,而又没有外部的fifo,这样发送是每个数据块4k,而接受是每个数据块1k,这必造成数据的丢失,我该如何解决这个问题?期待您的回复!!!! |
|
7楼#
发布于:2003-06-24 11:02
你的应用够复杂。
说老实话,我未必帮的了你,我没有象你那么仔细地观察数据1K、4K的问题。惭愧。所以我也无法帮助你确认。但是我怀疑你说的情况的存在。我的应用只关心可以连续的将几M、几十M的数据从Local传到PC,没有仔细考察其过程。如果真是你说的这样,可否考虑使用1K的DMA长度来发送和接收? 我不太理解你的应用,是两计算机通讯,但是如何连接?通过Local端吗?线如何连?LVDS?可以保证数据传输是正确的吗?DMA是双响的?如何发起DMA?如果用9054来控制,似乎你说的问题不存在呀,因为只要传递的是一块,数据放到哪个内存区(Local端的内存?),那么数据不会丢失,只是地址指针被修改,而这些9054应该可以控制呀!也许我没有理解你的意思,可以再详细些吗?我赶兴趣。我不下线,你可以随时发贴字。如果在北京可以将电话发到我的信箱,这样讨论方便些。qizhi_liu@263.net |
|
8楼#
发布于:2003-06-24 11:12
qizhi兄,你使用9054时,是不是用了外部的fifo,如果是这样的话,确实不需考虑dma的数据连续性,但是我现在板子上没有fifo,很是郁闷!!!!!
|
|
9楼#
发布于:2003-06-24 11:21
你说的没错。我是加了外部FIFO。但是,外部FIFO的容量很小,只有几K,但是FIFO只是做数据缓冲的,对于大数据似乎也无用呀。
|
|
10楼#
发布于:2003-06-24 11:41
datao兄qizhi兄你们到底能不能说一下块的大小到底怎么定义啊,看了你们说的我真是一头雾水。
|
|
|
11楼#
发布于:2003-06-24 12:20
传送大小(SIZE)定义块大小。
|
|
12楼#
发布于:2003-06-24 12:33
我用的是windriver:先定义一个数组 int buf[65536];
然后调用 dmawritereadblock()函数,但是据我观察,9054不是将65536这么大的数据按一个数据块发送,而是将其分成个个小块,没个小块4k,或1k,每个块之间有停顿。 |
|
13楼#
发布于:2003-06-24 13:28
你说的问题我未仔细测过。建议用PLXMon测试一下看是否还是这样。
|
|
14楼#
发布于:2003-06-24 23:47
我的问题今天终于解决了,原来是windriver工作的dma方式不对,问题终于解决了,太高兴了!!!!
|
|
15楼#
发布于:2003-07-10 15:01
请教datao:
我也在用WinDriver实现9054C模式的Block DMA传输,能否将你的调试经验告诉一二?谢谢! |
|