2012-12-10 24 views
2

硬盘I具有基于ARM设备,运行Linux,其被连接到摄像头,并且我想要存储所捕获的帧有效HD。写入从连续的物理存储器

  • 我在用户空间中发展,但可以修改随意
  • 司机我编码使用C
  • 帧被使用DMA写入存储器,和我有自己的物理内存的指针。
  • 我能控制所有的帧捕获流量,而当帧缓冲区是稳定的,我可以告诉(从Video4Linux的司机dqueued)
  • Linux的版本是3.0.35
  • 我熟悉的内核源代码代码,不是专家,但我能找到自己的路,并找出事情,只要我得到一些提示...

我相信我有2种选择:

  1. 找到最佳configurat用于我的文件系统,用于打开文件并写入文件。我现在使用ext4和标准的fopen()fwrite()函数。我明白我也可以使用mmap,或添加O_DIRECT标志调用open()时,但没有尝试它。

  2. 找到一个方式来传递的缓冲区的物理地址(我能得到它从我的Video4Linux司机 )直接连接到文件系统/硬盘驱动器, 因此数据将直接从那里转移。

我发现方法1是缓慢的,有记忆的交易作为我的瓶颈,因为FWRITE从用户空间复制数据有关到内核空间,然后再次进入某种缓存,然后到DMA。一个简单的店太多的内存交易...

关于方法2 - 我不知道这是可能的,但如果我是一个从头开始设计这个系统,这是我会做什么。

有什么想法?

  • 关于方法1(使用open()和write(),mmap()的和/或O_DIRECT) 可以推荐的最佳设置为我的目的是什么?
  • 是方法2(直接存储从现有DMA缓冲区到HD)可能?如果是这样 - 你能指点我一个例子吗?
+0

请问,您是否可以如此友善地发布流程的代码片段?我有完全相同的问题,我明白,mmap是解决方案,但无法理解如何使用它。 非常感谢。 – leonp

回答

0

与写入通过MMAP上UNIXs一个文件的唯一问题是,你要么在外面的磁盘空间 的情况下,处理信号,或者您有做出一定的文件不疏 因此所有所需的磁盘空间已经被分配。 我认为一个最新的G ++提供了一种将信号转换为C++异常处理的方法,但我不确定它是如何在除mac-os以外的其他系统上得到支持的。