为什么用DCMI读取OV2640JPEG时要DMA用双缓存模式

2019-07-20 13:49发布

原子例程里有一个300K的缓存区,为什么不直接把数据存在那个缓存里,而是要用DMA的双缓存模式一段一段存进两个小的缓存区,再转到大缓存区里,这样不会影响速度吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-07-20 14:29
因为直接DMA到外部SRAM,外部SRAM速度跟不上,会丢数据!!!
所以先用内部SRAM缓存一下
lvehe
2楼-- · 2019-07-20 16:34
以下来自第47章照相机实验:
DMA 接收来自 OV2640 的 JPEG 数据流,首先使用 M0AR(内存 1)来存储,当 M0AR 满了以后,自动切换到 M1AR(内存 2),同时程序读取 M0AR(内存 1)的数据到外部 SRAM;当 M1AR 满了以后,又切回 M0AR,同时程序读取 M1AR(内存 2)的数据到外部 SRAM;依次循环(此时的数据处理,是通过 DMA 传输完成中断实现的,在中断里面处理),直到帧中断,结束一帧数据的采集,读取剩余数据到外部 SRAM,完成一次 JPEG 数据的采集。
这里, M0AR, M1AR 所指向的内存,必须是内部内存,不过由于采用了双缓冲机制,我们就不必定义一个很大的数组,一次性接收所有 JPEG 数据了,而是可以分批次接收,数组可以定义的比较小。

在内存有限的情况下,如果把几乎全部内存用于缓存JPEG数据,那其他任务就没法运行了。这个例子当中必须用到FATFS和SD卡,想必也要占用一些内存。所以采用双缓冲机制是个很好的办法。只要定义的缓冲大小合适,应该不会有影响。
zhangyuman
3楼-- · 2019-07-20 17:53
 精彩回答 2  元偷偷看……
lvehe
4楼-- · 2019-07-20 18:40
zhangyuman 发表于 2016-6-3 14:45
为什么不直接存到外部sram里呢?

你愿意的话也可以啊,原子只是给出一个示例而已。程序千变万化,只要搞懂原理了,自己可以任意调配资源,自由组合,不必拘泥。
qiuys
5楼-- · 2019-07-20 23:14
这个地方我也有疑问:
如果是因为片外SRAM速度慢的原因,那么在DMA中断里把片内SRAM搬运到片外SRAM的过程同样快不了,还增加了CPU的开销
我想,是不是由于DMA的配置里最大传输数量只支持65535,导致不能传输过大的数据的原因呢。
视频讲解中确实提到是速度的原因,不知道原子哥的例程到底是出于什么考虑呢?
liuzb029
6楼-- · 2019-07-21 02:10
 精彩回答 2  元偷偷看……

一周热门 更多>