いくつかの 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