Linux camera驱动开发(被低估的DMA处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

不管是soc,还是mcu、fpga,大部分系统都是采用master-slave的模式进行cpu数据处理的。这种模式虽然看上去比较简单,但是有一个致命的问题,那就是所有数据的搬运都是需要cpu来处理的。大部分时候,这种方式都是比较低效的。

1、dma就是外设搬运的高手

所谓的dma,就是让dma负责ddr、外设之间进行数据通信。这种通信,可以是外设数据搬到ddr,也可以是ddr搬到外设,两者都是可以的。

2、dma也接受cpu的控制

dma虽然可以控制其他slave设备,但是本质上来说,它自身也是一种slave设备。既然是一种slave设备,那么dma不可避免受到cpu的控制。从另外一个角度说,我们也可以通过slave接口对dma进行设置。比如说,设置源地址、设置目的地址、设置长度,等到一切都准备ok之后,就是提醒dma开始工作。而一切都结束之后,dma就会发一个中断给cpu,这就是dma处理的完整过程。

3、dma和cache一致性

dma使用过程中最大的问题,就是dma和cache一致性的冲突。比如说,假设我们需要处理一段外设数据。传统的方法,就是通知dma及时把外设数据copy到内存。拷贝过程如果顺利的话,整体处理其实非常快,但是如果此时直接用cpu处理ddr中的外设数据,就会出现cache一致性的错误。

之所以错误,是因为原来cpu访问数据的时候,会优先从dcache查看一下,当前地址的数据在cache中有没有缓存。如果缓存存在,那么就直接从cache中读取数据。反之,再从ddr中获取数据。本来这是非常常见的操作,但是由于dma的存在,cpu在处理数据的时候,有可能dcache命中,读到的数据还是老数据,这就非常麻烦了。

遇到这一问题的话,一般会invalid掉指定地址所有的cache数据,这样cpu再次处理数据的时候,就会默认从ddr中重新加载,通过这种方式可以完美解决cache一致性的问题。

4、zynq中hp0就是为dma准备的

zynq当中有fpga,有arm,学习上面有一定的难度。哪怕是fpga、arm都ok,这个时候如何配置框图,也是一门学问,其中zynq dma,或者是zynq vdma则是最难处理的地方。而所谓的dma,有一个接口其实就是hp0,所有的dma都是通过hp0**、hp1等接口来直接访问ddr内存数据的。**

5、用好dma很重要

不管是soc,还是mcu、fpga当中,dma出现的场景非常多。所以如果遇到批量数据处理,尤其是视频数据、ad/da数据需要处理的时候,可以优先考虑使用dma,常常会有非常好的效果。

相关推荐
TE-茶叶蛋9 小时前
Spec-Driven Development(规范驱动开发)
驱动开发
云栖梦泽1 天前
Camera驱动开发与应用开发中的零拷贝与DMA
linux·驱动开发·嵌入式硬件
脱胎换骨-军哥1 天前
C++ 嵌入式编程实例:从寄存器操作到底层驱动开发
开发语言·c++·驱动开发
智者知已应修善业1 天前
【使用D触发器74HC175实现0001 0011 0111 1111 1110 1100 1000的循环彩灯电路。】2025-4-28
驱动开发·经验分享·笔记·硬件架构·硬件工程
新元代码2 天前
SDD+TDD 双驱动开发模式实战指南
驱动开发
mk0153 天前
20V输入,12V 3A输出 效率96%DCDC降压芯片
驱动开发·单片机·硬件工程·智能硬件·pcb工艺
mounter6253 天前
跨越鸿沟:从内核驱动开发到超大规模云端生产环境的思考
linux·驱动开发·linux kernel·kernel
Saniffer_SH4 天前
NAND技术(二):从 Channel、Die/LUN、P/E Cycle 到 LDPC,一次讲透 NAND 里那些最容易误解的概念
人工智能·驱动开发·嵌入式硬件·测试工具·fpga开发·计算机外设·压力测试
2401_854151554 天前
嵌入式传感器驱动开发深度解析——从 I2C/SPI 驱动到数据融合算法
驱动开发·算法
Bug退散师4 天前
多路IO复用[select版TCP服务器与poll版TCP服务器]与常用网络编程函数详解
linux·服务器·c语言·网络·驱动开发·tcp/ip