私は、ARM9 をハードウェア ビデオ エンコーダ チップに接続し、ビデオを SD カードまたは USB スティックに書き込む組み込み Linux プロジェクトに取り組んでいます。ソフトウェア アーキテクチャには、データをバッファーのプールに読み込むカーネル ドライバーと、マウントされたリムーバブル デバイス上のファイルにデータを書き込むユーザーランド アプリが含まれます。
特定のデータ レート (約 750kbyte/秒) を超えると、約 5 秒ごとに、ユーザーランドのビデオ書き込みアプリがおそらく 0.5 秒停止するのが見え始めます。これは、カーネル ドライバーがバッファーを使い果たすのに十分です。また、バッファーの数を増やすことができたとしても、ビデオ データは、リアルタイムで行われている他の処理と同期する必要があります (理想的には 40 ミリ秒以内)。これらの 5 秒の「ラグ スパイク」の間で、書き込みは 40 ミリ秒以内に完了します (アプリに関する限り、OS によってバッファリングされていることに感謝します)。
このラグスパイクは、Linuxがデータをディスクにフラッシュする方法に関係していると思います.pdflushは5秒ごとに起動するように設計されていることに注意してください. ストールが終わるとすぐに、ユーザーランド アプリは迅速にサービスを提供し、(オーバーフローしなかった) バッファーのバックログを書き込むことができます。
私が書き込んでいるデバイスは、合理的な究極のスループットを持っていると思います.15MBのファイルをメモリfsからコピーし、同期が完了するのを待つ(そしてUSBスティックのライトが点滅を止める)と、約2.7MBytes /秒の書き込み速度が得られました。
私は2種類の手がかりを探しています:
バースト書き込みによってアプリが停止するのを防ぐにはどうすればよいでしょうか? おそらくプロセスの優先順位、リアルタイムのパッチ、またはバーストではなく継続的に書き込むようにファイルシステム コードを調整することでしょうか?
カード/スティックへの書き込みバックログとスループットに関して、ファイルシステムで何が起こっているかをアプリに認識させるにはどうすればよいですか? ハードウェアコーデックのビデオビットレートをオンザフライで変更できます。これは、フレームをドロップしたり、最大許容ビットレートに人為的な上限を課したりするよりもはるかに優れています。
詳細情報: これは現在 Montavista 2.6.10 ベースのカーネルを実行している 200MHz ARM9 です。
アップデート:
- ファイルシステム SYNC をマウントすると、スループットが大幅に低下します。
- リムーバブル メディアは FAT/FAT32 でフォーマットされており、メディアを任意の Windows PC に接続して読み取ることができるように設計されている必要があります。
- たとえば、定期的に sync() または fsync() を呼び出すと、毎秒定期的なストールが発生し、スループットが許容できないほど低下します
- fopen() などではなく、write() と open(O_WRONLY | O_CREAT | O_TRUNC) を使用しています。
- 上記の「Linuxリアルタイムファイルシステム」についてオンラインですぐに見つけることができません。リンク?
これが理にかなっていることを願っています。stackoverflow に関する最初の組み込み Linux の質問は? :)