【发布时间】:2012-11-28 00:28:53
【问题描述】:
我有一个基于 ARM 的设备,运行 linux,它连接到相机,我正在尝试有效地将捕获的帧存储到 HD。
- 我正在用户空间开发,但可以随意修改驱动程序
- 我正在用 C 编写代码
- 使用 DMA 写入内存的帧,我有它们的物理内存指针。
- 我能够控制所有的帧捕获流程,并且我可以判断帧缓冲区何时稳定(来自 video4linux 驱动程序的 dqueued)
- Linux 版本为 3.0.35
- 我对内核源代码很熟悉,不是专家,但只要我得到一些提示,我就能找到方法并弄清楚事情......
我相信我有两种选择:
为我的文件系统找到最佳配置,用于打开文件并写入文件。我现在使用 ext4 和标准 fopen() fwrite() 函数。我知道我也可以使用 mmap,或者在调用 open() 时添加 O_DIRECT 标志,但还没有尝试过。
想办法传递缓冲区的物理地址(我能搞定 从我的 Video4Linux 驱动程序)直接到文件系统/硬盘驱动器驱动程序, 因此数据将直接从那里传输。
我发现方法 1 很慢,内存事务是我的瓶颈,因为 fwrite 涉及将数据从用户空间复制到内核空间,然后再复制到某种缓存,然后再复制到 DMA。简单存储的内存事务太多...
关于方法 2 - 我不知道这是否可能,但如果我是从头开始设计这个系统的人,我会这样做。
有什么想法吗?
- 关于方法 1(使用 open() 和 write()、mmap() 和/或 O_DIRECT) 您能推荐一个适合我的最佳设置吗?
- 方法 2(直接从现有 DMA 缓冲区存储到 HD)是否可行?如果是这样 - 你能给我举个例子吗?
【问题讨论】:
-
拜托,你能把这个过程的代码sn-p贴出来吗?我有完全相同的问题,我知道 mmap 是解决方案,但不明白如何使用它。非常感谢。
标签: fwrite mmap hard-drive dma vfs