1

スレッド関数内で正確な遅延 (約 100us) を作成する必要があります。nanosleep 関数を使用してみましたが、十分な精度がありませんでした。ハードウェアの 1MHz タイマーの読み方についての記事を読んだので、関数で 100us の遅延を作成するために、次のようなことを試しました。

prev = *timer;    
do {
    t = *timer;
} while ((t - prev) < 100);

ただし、プログラムはループ内にとどまっているようです。しかし、ループ内に小さな nano sleep を挿入すると、機能します (ただし、精度は失われます)。

sleeper.tv_sec  = 0;
sleeper.tv_nsec = (long)(1);
prev = *timer;
do {
    nanosleep (&sleeper, &dummy);
    t = *timer;
} while ((t - prev) < 500); 

スタンド アロング プログラムで最初のバージョンを試してみましたが、動作しますが、これがスレッド内にあるメイン プログラムでは動作しません。

最初のバージョン (小さな nanosleep なし) が機能しないことを知っている人はいますか?

4

1 に答える 1

1

申し訳ありませんが、Raspberry Pi の OS は「リアルタイム OS」ではありません。つまり、固有の OS スケジューリング制限により、ユーザー空間プログラムで一貫した 100us の精度を得ることはできません。そのような精度が必要な場合は、Arduino のような組み込みコントローラーを使用する必要があります。

于 2013-10-11T13:49:49.583 に答える