GPSモジュールからデータを取得して処理するRaspberry-Pi(linux)で動作するプログラムを開発しています。Cでシグナルを使用する方法、タイマー終了時にプログラムを停止し続ける方法
今のところ、プログラムはGPSデータを取り込み、GPSモジュールの周波数でストリーミングされたwhile(1)
ループを中心にしています。
しかし、私はwhile(1)
が非常に効率的な解決策ではないことを知っています(このRPiは後で無人機に座る予定です)。
私はタイマーを設定したいと思います。タイマーが終了したときだけ、プログラムはGPSデータを取得しますか?理想的には、タイマーが終了するまでプログラムが完全に停止し、CPUが時間/エネルギーを無駄にしないようにします。
sigaction()
コールでSIGSTOP
シグナルが許可されていない場合は、どうすればできますか?あなたのループでは
void timer_handler(int signum){
/* what can I do to make a program stop and coninue,
so that no CPU cycles are devoted to this program until
the timer is elapsed ? (SIGSTOP is not allowed) */
}
int main(int argc, char** argv){
struct sigaction sigAct;
struct itimerval timer;
sa.sa_handler = &timer_handler;
// SIGALRM is only a place holder here..
sigaction(SIGALRM, &sigAct, NULL);
/* Here would be some timer.it_value, timer.it_interval stuff,
setting it to some arbitrary time */
setitimer(ITIMER_REAL, &timer, NULL);
/* Main program loop here */
while(1){
// process GPS data.
// instead of while(1), I'd like this loop to run only when
// the timer ends.
}
}
「スリープ」を呼び出すことはできませんか? – kaylum
私はちょうど秒より大きな解像度が必要です。 私は 'nanosleep()'を認識していますが、この関数を呼び出すと、このプログラムの実行を完全に放棄するかどうかわかりません。私が見つけることができる限り。 –
はいそれは完全にプロセスを中断します。自分自身をチェックするには、nanosleepを呼び出してプロセスの状態をチェックするだけです。 – kaylum