パイプのプロセスは一度に256バイトを処理します。

パイプのプロセスは一度に256バイトを処理します。

接続されたFPGAを使用してFFTを実行するCyclone 5にACプログラムがあります。プログラムは現在256バイトを取得してstdin処理し、FFT結果を提供しますstdout。 Cyclone 5のLinux bashでこのように実行しました。

./fpga_fft < input_s16le_audio.pcm

これは最初の256バイトのみを評価します。 * .pcmファイルのすべての内容を読み取るまで、標準入力ストリームを使用してプログラムが呼び出され続けるにはどうすればよいですか?

アイデア:

cat input_s16le_audio.pcm|xargs ./fpga_fft

どういうわけか、xargsは一度に256バイトを時間順に(並列ではなく)処理するように指示する必要があります。

答え1

このような:

for i in {0..N} 
do
    dd if=input_s16le_audio.pcm bs=256 count=1 skip=$i |  ./fpga_fft
done

明らかにforループは、ファイル全体が処理されたときに停止するループに置き換える必要があります(ddは、スキップ値が大きすぎる場合にのみ0バイトを送信するため、誤ったrcを計算できません)。

これでCプログラムがあると、入力ファイルを繰り返すように変更するのは難しいでしょう。

答え2

GNU並列処理を使用する:

cat input_s16le_audio.pcm |
  parallel --pipe --recend '' --block 256 ./fpga_fft

fpga_fft複数を並列に実行できない場合は、以下を追加してください。-j0

関連情報