我有一个基于 ARM 的设备,运行 linux,它连接到相机,我正在尝试有效地将捕获的帧存储到 HD。
- 我在用户空间开发,但可以随意修改驱动
- 我正在用 C 编码
- 使用 DMA 写入内存的帧,我有它们的物理内存指针。
- 我能够控制所有的帧捕获流程,并且我可以判断帧缓冲区何时稳定(从 video4linux 驱动程序中提取)
- 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)是否可行?如果是这样 - 你能给我举个例子吗?