RaspberryPi[42] タイマー割込み
ESP32のタイマー割込みは書いたけど、ラズパイのタイマー割込みは書いていなかったので書いておきます。
#include <sys/time.h>
#include <signal.h>
int irq_timer1_10msec;
int irq_timer2_10msec;
int irq_timer3_10msec;
// タイマーハンドラ 10msecごとに呼ばれるので、呼ばれるたびにセットした値をデクリメントする。
// タイマーの確認で必要なタイマーが0になっていたら経過時間終了です。
// 新たに値をセットして、また確認の繰り返しです。
void timer_handler(int signum)
{
irq_timer1_10msec--;
if (irq_timer1_10msec < 0)
irq_timer1_10msec = 0;
irq_timer2_10msec--;
if (irq_timer2_10msec < 0)
irq_timer2_10msec = 0;
irq_timer3_10msec--;
if (irq_timer3_10msec < 0)
irq_timer3_10msec = 0;
}
// main 関数
int main(){
struct itimerval times;
struct sigaction act, oldact;
// シグナルハンドラの登録
act.sa_handler = timer_handler;
act.sa_flags = SA_RESTART;
if (sigaction(SIGALRM, &act, &oldact) < 0)
{
perror("sigaction()");
return -1;
}
// タイマ割り込みを発生させる
times.it_value.tv_sec = 1; // 最初の1回目は1秒後 これを書いておかないとタイマーが動かないみたい。
times.it_value.tv_usec = 0;
times.it_interval.tv_sec = 0;
times.it_interval.tv_usec = 10000; // 2回目以降は10msec間隔
// タイマの作成
if (timer_create(CLOCK_REALTIME, NULL, &tid) < 0)
{
perror("timer_create");
return -1;
}
// タイマのセット
if (setitimer(ITIMER_REAL, ×, NULL) < 0)
{
perror("timer_settime");
return -1;
}
irq_timer1_10msec = 6000;
while(1){
if(irq_timer1_10msec == 0) { // 1minごとに実行
func();
irq_timer1_10msec = 6000;
}
}
return 0;
}