1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spresense Arduinoの周期タイマ割り込みについて

Posted at

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のような感覚で使った結果事故りました.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?