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

相关推荐
senijusene4 小时前
I2C 总线框架下LM75A 温度传感器 Linux驱动开发:
linux·运维·驱动开发
熬夜有啥好6 小时前
基于IMXULL的SHT3X 温湿度传感器 I2C 驱动开发调试记录
驱动开发·imx6ull·i2c·sht3x温湿度传感器
senijusene6 小时前
基于 Linux SPI 子系统的 ADXL345 加速度传感器驱动开发
linux·运维·驱动开发
快乐的划水a1 天前
单片机仿Linux驱动开发(一)
linux·驱动开发·单片机
快乐的划水a1 天前
单片机仿Linux驱动开发(三)
linux·驱动开发·单片机
2601_949695591 天前
Nvidia控制面板打不开了?问题出在这里
驱动开发·计算机外设·电脑
快乐的划水a1 天前
单片机仿Linux驱动开发(二)
linux·驱动开发·单片机
嵌入式×边缘AI:打怪升级日志1 天前
DHT11 驱动开发实录:从零搭建 Linux 字符设备驱动框架(保姆级教学)
linux·运维·驱动开发
ElfBoard2 天前
飞凌精灵(ElfBoard)技术贴|如何在RK3506开发板上实现UART功能复用
大数据·linux·人工智能·驱动开发·单片机·嵌入式硬件·物联网
誰能久伴不乏2 天前
SPI总线通信协议基础与ICM20607传感器驱动开发指南
arm开发·c++·驱动开发·嵌入式硬件·arm