2

我有一个基于 ARM 的设备,运行 linux,它连接到相机,我正在尝试有效地将捕获的帧存储到 HD。

  • 我在用户空间开发,但可以随意修改驱动
  • 我正在用 C 编码
  • 使用 DMA 写入内存的帧,我有它们的物理内存指针。
  • 我能够控制所有的帧捕获流程,并且我可以判断帧缓冲区何时稳定(从 video4linux 驱动程序中提取)
  • Linux 版本是 3.0.35
  • 我熟悉内核源代码,不是专家,但只要我得到一些提示,我就能找到方法并弄清楚事情......

我相信我有两种选择:

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

  2. 找到一种方法将缓冲区的物理地址(我可以从我的 Video4Linux 驱动程序中获取)直接传递给文件系统/硬盘驱动程序,因此数据将直接从那里传输。

我发现方法 1 很慢,内存事务是我的瓶颈,因为 fwrite 涉及将数据从用户空间复制到内核空间,然后再复制到某种缓存,然后再复制到 DMA。简单存储的内存事务太多...

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

有什么想法吗?

  • 关于方法 1(使用 open() 和 write()、mmap() 和/或 O_DIRECT),您能推荐一个适合我的最佳设置吗?
  • 方法 2(直接从现有 DMA 缓冲区存储到 HD)是否可行?如果是这样 - 你能给我举个例子吗?
4

1 回答 1

0

在 UNIX 上通过 mmap 写入文件的唯一问题是,您要么必须在磁盘空间不足的情况下处理信号,要么确保文件不是稀疏的,因此所有需要的磁盘空间是已经分配。我认为最新的 G++ 提供了一种将信号转换为 C++ 异常处理的方法,但我不确定在 mac-os 以外的其他系统上对此的支持程度。

于 2013-06-20T23:01:40.983 回答