基本ライブラリ
デジタルIO
アナログIO
拡張IO
時間
数学
三角関数
乱数
ビットバイト操作
割り込み
シリアル通信
標準ライブラリ
Ethernet
サーボモーター
ステッピングモーター
キャラクタ液晶表示
SPI通信
I2C通信(Wire)
SD
SD(File操作)
周期処理(MsTimer2)
時計(RTC)
PPG(パルス生成)
WiFiEsp
ICS(シリアルサーボ)
FreeRTOS Tips
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"の周期を短くしています。