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;
}