スレッド関数内で正確な遅延 (約 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 なし) が機能しないことを知っている人はいますか?