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,常常会有非常好的效果。

相关推荐
Saniffer_SH3 小时前
【高清视频】SerialTek PCIe 5.0/6.0 协议分析仪API自动化编程演示
网络·人工智能·驱动开发·嵌入式硬件·测试工具·自动化·压力测试
Saniffer_SH7 小时前
【高清视频】如何针对电动汽车进行通信可靠性测试、故障注入与功率分析?
服务器·驱动开发·测试工具·fpga开发·计算机外设·硬件架构·压力测试
Saniffer_SH8 小时前
【高清视频】企业级NVMe SSD (E3.S, U.2)和消费类M.2 SSD拆解分析
服务器·网络·数据库·驱动开发·测试工具·fpga开发·压力测试
路溪非溪9 小时前
wpa_supplicant核心操作总结
linux·网络·arm开发·驱动开发
嵌入式-老费9 小时前
Linux camera驱动开发(ARM、FPGA、DDR共享总线)
图像处理·驱动开发·fpga开发
Saniffer_SH10 小时前
【高清视频】介绍一个自动化测试辅助小工具 - 上下电测试适用于电脑冷启动的掉电盒
网络·人工智能·驱动开发·嵌入式硬件·测试工具·计算机外设·压力测试
猫猫的小茶馆18 小时前
【Linux 驱动开发】Linux 内核启动过程详解
linux·c语言·arm开发·驱动开发·stm32·单片机·mcu
猫猫的小茶馆20 小时前
【Linux 驱动开发】STM32MP1 + GT911 触摸显示系统开发笔记
linux·arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu
泽平59020 小时前
Linux Pinctrl子系统
linux·运维·服务器·驱动开发·单片机·linux驱动