0

いくつかの LED のオンとオフを切り替える C コードをいくつか書きました。実際、私はそれらを音楽に合わせて正確にトリガーしたいのですがusleep()、その間に使用するよりも良い方法をまだ見つけていません.

usleep()いずれにしても、コマンド ラインでプログラムを呼び出すと、LED の点灯、待機、および LED の消灯がかなり正確に行われます。

ここで、cron にプログラムを実行させたいと思います。たとえば、5 分ごとに実行します。したがって、次のcronjobを追加しましたcrontab -e

*/5 * * * * bash ~/startShow.sh >~/log 2>&1

シェルスクリプトがなくても同じ問題。

*/5 * * * * ~/projects/startLEDShow >~/log 2>&1

startShow.sh

date
/usr/sbin/i2cset -y 1 0x40 0x00 0x21 # Preparation for communication via I2C
cd projects
./startLEDShow

プログラムは 5 分ごとにトリガーされますが、ある時点 (常に同じ時点とは限りません) で実行が一瞬停止し、約 1 秒後に再開します。これは、プログラムが cron によって実行された場合のみであり、commandLine から呼び出した場合ではありません。

なぜそうなのか、これはおそらくusleep()プログラムで使用されているためであり、プログラムの実行がしばらく中断されないようにするにはどうすればよいですか?

更新 1 : これは、プログラムからの usleep セクションの抜粋です。

// Start reading
while(NULL != (word = readToChar(fp, wordBuffer))) {
    // Values for the LEDs are stored in a struct
    updateValuesForLEDs(next, word); // Update struct "next"

    usleep(((next->time/timeFactor - lastTime)*1000000)); // Wait
    lastTime = next->time / timeFactor; // Set lastTime for next iteration

    setLEDs(i2cConnection, next, buffer); // Set the LEDs to the brightness values stored in struct "next" via I2C
}

更新 2: ensc のコメントの後、私は自分の問題を解決する方法を見つけました。

cronjob は nice 値 10 で開始されましたが、他のほとんどのプロセスの値は 0 付近でした。ジョブをより低い nice 値 (root 権限が必要) に設定すると、優先度が高くなり、一時停止されなくなります。

00 20 * * * sudo nice -n -20 ~/projects/startLEDShow >~/log.txt 2>&1
4

1 に答える 1

0

リアルタイム オペレーティング システムを実行しているusleepとは思えないため、パフォーマンスを保証してプロセスをウェイクアップすることは保証されていません。さらに言えば、プロセスが適切なタイミングで起動されたとしても、カーネルがプロセスを中断して、任意の時間の間、他のことを実行する可能性は常にあります。

于 2013-10-30T23:54:39.630 に答える