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

2019-07-20 13:49发布

原子例程里有一个300K的缓存区,为什么不直接把数据存在那个缓存里,而是要用DMA的双缓存模式一段一段存进两个小的缓存区,再转到大缓存区里,这样不会影响速度吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
lvehe
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卡,想必也要占用一些内存。所以采用双缓冲机制是个很好的办法。只要定义的缓冲大小合适,应该不会有影响。

一周热门 更多>