Spresense Arduinoには時間割り込みの関数として attachTimerInterrupt()
が存在します.大変ありがたいです.
本記事の発端はちゃんと公式マニュアルをちゃんと読んでいなかったために生じた問題ですが,自戒の念を込めて記事にしておきます.
症状
周期タイマ割り込みにしたかったのに割り込みが一回で停止する.
問題となったコードは次の通りです.
#include <MP.h> // MPLog用
#define INTERVAL_US 500
void flip(){
MPLog("poyo\n");
}
void setup(){
attachTimerInterrupt(flip, INTERVAL_US);
}
void loop(){
}
こちらの気持ちとしてはシリアルモニターにつないだとき,500usごとにpoyoが続けて表示されてほしいのですが,このコードだと1回しか表示されません.
原因
割り込み関数で待ち時間を返す必要がある.
結論から言えば下記のように修正する必要があります.
#include <MP.h> // MPLog用
#define INTERVAL_US 500
unsigned int flip(){
MPLog("poyo\n");
return INTERVAL_US;
}
void setup(){
attachTimerInterrupt(flip, INTERVAL_US);
}
void loop(){
}
変更点としては,flip関数の型をunsigned intに変更したうえで,return文を追加しています.
マニュアルのattachTImerInterruptの項に次のように記載があります.
・この関数が 0 を return したときは、タイマーが停止し、ワンショットタイマーとして使用できます。
・周期タイマーとして使用したいときは、attachTimerInterrupt() で指定した us 時間と等しい値を return で返してください。
・その他、return で任意の値を返すことで、次のタイマー割り込みまでの時間を動的に変更することができます。
つまり割り込みの周期を動的に変更できるようになっているようです.
大変ありがたいんですが,例えばmbedのTickerのような感覚で使った結果事故りました.