我可能在这里有一些误解,所以请忍受。

我写了一个程序,可以捕获相机的图像。我正在与相机和我的应用程序之间的记忆 mmap 正如我在 V4L2文档. 。这很棒。现在,我的处理器(这是TI的DM3730)也有一个DSP。我想使用DSP,但需要 身体的 连续记忆。 TI提供了分配内存的驱动程序。我的问题是,现在我浪费了很多时间将MMAP的内存复制到物理连续内存中。有没有办法告诉MMAP它不应分配内存本身,但我告诉MMAP使用我分配的内存。

为了让您了解我在做什么(当然缺少很多代码,但是我非常接近V4L2文档。我希望这足以理解我的问题):

//reserve physical contiguous memory
dsp_buffer      = Memory_alloc(buffer_length, &myParams); 

...
//reserve memory for buffer, but not contiguous
buffers[n_buffers].start =
     mmap (NULL ,                    /* start anywhere */
     buf.length,
     PROT_READ | PROT_WRITE ,  /* required */                               
     MAP_SHARED ,              /* recommended */
     fd, buf.m.offset);

之后,只要准备就绪,我将内存从非连续内存中复制到连续内存中。

...
//wait until frame is ready in memory
r = select (fd + 1, &fds, NULL, NULL, &tv); 
...
//copy the memory over to the physically contiguous memory
memcpy(dsp_buffer,buffers[buf.index].start,size); 
...

如何立即将框架进入物理连续内存?

有帮助吗?

解决方案

如果您无法通过 Memory_alloc() 作为您的第一个论点 mmap() (例如,如果它也使用MMAP(),这将使无法再次映射到该内存),则您可能应该使用其他流中的I/O方法 给定的示例 - IO_METHOD_USERPTR 变化。它使用相同 ioctl 作为io_method_mmap捕获帧,应提供类似的效率。

其他提示

您将需要相机驱动程序的驾驶员支持。 mmap 从任何映射的驱动程序中获取物理页面映射 - 在这种情况下,相机。您不能告诉MMAP使用一些预先分配的页面,因为必须告知基础驱动程序使用这些预先分配的页面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top