MMAP物理的に隣接するメモリ
-
22-10-2019 - |
質問
ここでいくつかの誤解があるかもしれないので、私に耐えてください。
カメラから画像をキャプチャするプログラムを書きました。カメラとアプリケーションの間のメモリを共有しています 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);
...
フレームをすぐに物理的な隣接するメモリに入れるにはどうすればよいですか?
解決
結果を合格できない場合 Memory_alloc()
あなたへの最初の議論として mmap()
(たとえば、MMAP()も使用する場合は、そのメモリに再びマッピングすることが不可能になる場合)は、おそらく別のストリーミングI/Oメソッドを使用する必要があります。 与えられた例 - IO_METHOD_USERPTR
変化。同じものを使用します ioctl
io_method_mmapとしてフレームをキャプチャし、同様の効率を提供する必要があります。
他のヒント
カメラドライバーからのドライバーサポートが必要です。 mmap
マッピングしているドライバーからマップする物理ページを取得します - この場合のカメラ。基礎となるドライバーは、これらの事前に割り当てられたページを使用するように指示する必要があるため、MMAPにいくつかの事前に割り当てられたページを使用するように指示することはできません。