10

我可能在这里有一些误解,所以请多多包涵。

我写了一个程序,从相机捕捉图像。mmap正如我在V4L2 文档中找到的那样,我正在共享相机和我的应用程序之间的内存。这很好用。现在我的处理器(它是 TI 的 DM3730)也有一个 DSP。我想使用 DSP,但它需要物理连续内存。TI 提供驱动程序来分配内存。我的问题是,现在我浪费了很多时间来将映射的内存复制到物理连续内存中。有没有办法告诉 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); 
...

如何立即将帧放入物理连续内存?

4

2 回答 2

3

如果您不能将Memory_alloc()作为第一个参数的结果传递给您的mmap()(例如,如果它还使用 mmap(),这将导致无法再次映射到该内存),您可能应该使用给定示例中的另一个流式 I/O 方法-IO_METHOD_USERPTR变化。它使用与ioctlIO_METHOD_MMAP 相同的方法来捕获帧,并且应该提供类似的效率。

于 2011-11-28T19:32:22.067 回答
2

您需要相机驱动程序的驱动程序支持。mmap从它映射的任何驱动程序获取它映射的物理页面 - 在这种情况下是相机。您不能告诉 mmap 使用一些预先分配的页面,因为必须告诉底层驱动程序使用这些预先分配的页面。

于 2011-11-28T19:36:15.193 回答