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

相关推荐
念何架构之路14 小时前
GoFrameMap转换详解
驱动开发
charlie11451419114 小时前
嵌入式Linux嵌入式Linux驱动开发:设备树驱动改造——从硬编码到设备树的实战之旅
linux·运维·驱动开发
国产芯片设计17 小时前
小家电单段码屏项目实战|YL1621 LCD驱动开发与调试心得
驱动开发·stm32·单片机·mcu·51单片机
小此方19 小时前
Re:Linux系统篇(十六) 进程篇 · 一:深入理解操作系统:从软硬件架构到“先描述,再组织”的管理哲学
linux·驱动开发·硬件架构
济61720 小时前
I.MX6U Linux 驱动开发篇---异步通知(信号)实验--- Ubuntu20.04
linux·驱动开发·嵌入式·嵌入式linux驱动开发
charlie1145141911 天前
嵌入式Linux嵌入式Linux驱动开发:板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环
linux·运维·驱动开发
智者知已应修善业2 天前
【74ls138+74ls00传送带故障报警】2024-1-9
驱动开发·经验分享·笔记·硬件架构·硬件工程
不怕犯错,就怕不做2 天前
linux的notifier_block内核通知链
linux·驱动开发·嵌入式硬件
Szime2 天前
CS57167半桥驱动H桥方案,国产替代BOM配单选型
驱动开发
lwf0061642 天前
OpenSpec + Superpowers 实战:规范驱动开发(SDD)指南
驱动开发