カメラに接続されたLinuxを実行しているARMベースのデバイスがあり、キャプチャしたフレームをHDに効率的に保存しようとしています。
- ユーザー空間で開発していますが、ドライバーを自由に変更できます
- Cでコーディングしています
- DMA を使用してメモリに書き込まれるフレームで、物理メモリ ポインタがあります。
- すべてのフレーム キャプチャ フローを制御でき、フレーム バッファがいつ安定するかを知ることができます (video4linux ドライバからキューから削除されます)。
- Linux のバージョンは 3.0.35 です
- 私はカーネルのソースコードに精通しており、専門家ではありませんが、いくつかのヒントが得られる限り、その方法を見つけて物事を理解することができます...
私は2つの選択肢があると信じています:
ファイルを開いて書き込むための、ファイルシステムの最適な構成を見つけます。現在、ext4 と標準の fopen() fwrite() 関数を使用しています。mmap を使用したり、open() を呼び出すときに O_DIRECT フラグを追加したりできることは理解していますが、まだ試していません。
バッファーの物理アドレス (Video4Linux ドライバーから取得できます) をファイルシステム/ハード ドライブ ドライバーに直接渡す方法を見つけて、データがそこから直接転送されるようにします。
fwrite はデータをユーザー空間からカーネル空間にコピーし、次にある種のキャッシュにコピーし、次に DMA にコピーするため、方法 1 は遅く、メモリ トランザクションがボトルネックになっていることがわかりました。単純なストアにはメモリ トランザクションが多すぎます...
方法 2 について - それが可能かどうかはわかりませんが、私がこのシステムをゼロから設計する立場にあるとしたら、これを行うでしょう。
何かご意見は?
- 方法 1 (open() と write()、mmap() および/または O_DIRECT を使用) に関して、私の目的に最適な設定をお勧めできますか?
- 方法 2 (既存の DMA バッファから直接 HD に格納する) は可能ですか? もしそうなら、例を挙げてもらえますか?