10

ここで誤解があるかもしれませんが、ご容赦ください。

カメラから画像をキャプチャするプログラムを書きました。V4L2 ドキュメントmmapにあるように、カメラとアプリケーションの間でメモリを共有しています。これはうまくいきます。現在、私のプロセッサ (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 に答える