FreeRTOS タイマー

タイマーは主に2つの使い方があり、一つ目は一定時間後に処理を行うこと、二つ目は定期的に処理を行うことです。

GR-ROSEのSDKには周期処理としてMsTimerライブラリを使用できますが、このMsTimerはFreeRTOSのタイマーを使用しています。

以下はタイマーの例です。


#include <Arduino.h>
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
 
TimerHandle_t xAutoReloadTimer, xOneShotTimer;
void oneShotTimerCallback(TimerHandle_t xTimer);
void autoReloadTimerCallback(TimerHandle_t xTimer);
 
void setup() {
  Serial.begin(9600);
  delay(3000); // for waiting to display a serial monitor
   
  xOneShotTimer    = xTimerCreate("OneShot", 1000, pdFALSE, 0, oneShotTimerCallback);
  xAutoReloadTimer = xTimerCreate("Reload" , 1000, pdTRUE , 0, autoReloadTimerCallback);
 
  if((xOneShotTimer != NULL) && (xAutoReloadTimer != NULL)){
    xTimerStart(xOneShotTimer, 0);
    xTimerStart(xAutoReloadTimer, 0);
  }
}
 
void loop() {
  static uint32_t old_time = millis();
  static bool flag = false;
  if((millis() - old_time) > 5000 && (flag == false)){ // after 5 seconds
    xTimerChangePeriod(xAutoReloadTimer, 100, 0);
    flag = true;
  }
}
 
void oneShotTimerCallback(TimerHandle_t xTimer){
  Serial.println("One-shot timer callback executing");
}
 
void autoReloadTimerCallback(TimerHandle_t xTimer){
  Serial.println("Auto-reload timer callback executing");
}

出力結果:
One-shot timer callback executing
Auto-reload timer callback executing
Auto-reload timer callback executing
Auto-reload timer callback executing
Auto-reload timer callback executing

上記のサンプルでは2つのタイマーを生成しています。一つは"xOneShotTimer"、もう一つは"xAutoReloadTimer"です。それぞれxTimerCreate()で生成していますが、第3引数で処理を変えています。

タイマーを生成してから5秒後にxTimerChangePeriod()を使って"xAutoReloadTimer"の周期を短くしています。