1

10 ミリ秒ごとに正確に実行する必要があるスレッドがありますが、処理時間はさまざまです (簡単にするために、処理時間は 10 ミリ秒未満であると想定できます)。タイミングのわずかなずれは、時間の経過とともに積み重なって問題になります。

これが私の現在の解決策です。面倒そうですが、さらに timeval_subtract の実行に時間がかかってタイミングがズレてしまうのが気になります。誰かがより良い解決策を持っていますか?

これはライブラリ用であり、タイマーやクロックなどのシステム リソースを使用できません。

void mythread(void *ptr )
{
    struct timeval tv_being, tv_end;
    int usToSleep;

    while(1)
    {
        gettimeofday(&tv_begin)

        //do stuff

        //now determine how long to sleep so we wake up 10ms after previous wakeup

        gettimeofday(&tv_end)

        usToSleep = timeval_subtract(tv_begin, tv_end); //this will return 10ms minus the elapsed time

        usleep(usToSleep);
    }

    return;
}
4

6 に答える 6

1

使用しているプロセス スケジューラの粒度に左右されます。10 ミリ秒はおそらく達成可能ですが、スリープ状態の場合、オペレーティング システムは、ウェイクアップできるようになったときにすぐにスケジュールを設定しないことに注意してください。他のプロセスが先行している場合は、代わりに実行するように選択される可能性があるため、遅れる可能性があります。

あなたのアプローチは、あなたが得ることができる近似の良い(または良い)ものです。

より良いスケジューリングが必要な場合は、リアルタイム オプションを有効にして Linux カーネルをコンパイルすることを検討してください。これにより、より細かいスケジューリングの粒度が得られます。

于 2013-05-21T21:29:51.980 に答える
0

http://widefox.pbworks.com/w/page/8042322/スケジューラー

コンシューマ OS で低ジッターの 10ms プロセスを実現するのは非常に困難です。OS は、そのサイズ以上の単位で作業をタイム スライスする傾向があります。コンピュータが 10 ミリ秒のタイムスライスの使用を選択していて、競合するスレッドが 3 つある場合、30 ミリ秒以上の遅延が発生する可能性があります。

実際に 10 ミリ秒ごとに確実に実行する必要がある場合 (その周りに jtiter がバインドされている場合)、リアルタイム オペレーティング システムを使用する必要があります。彼らの全体的な目的は、あなたが取り組んでいる問題を解決することです

于 2013-09-07T20:10:03.770 に答える