割り込み / staticなメンバー函数としてISRをクラス内に記述する

pp.39-40

前回と同じことを今度はstaticなメンバー函数として記述する。前回と違うのは★印をつけたところである。このへんのしくみはよくわからない。

#include "mbed.h"

class MyTimeout{
    typedef Kernel::Clock::duration_u32 chrono_t;

    private:
    static uint8_t on; // ★static函数内のメンバーはstaticでなければならない。

    // Mbed Timeoutクラスをインスタンス化する。
    Timeout timer;

    // ★これがISR。static修飾する。
    static void at_timeout(){
        on = 0;
    }

    public:
    void start(chrono_t time){
        on = 1;

        // Mbed TimeoutクラスのインスタンスにISRをattachする。
        // ★attachするときはcallback()函数は使わない。
        timer.attach(&at_timeout, time);
    }
    uint8_t IsOn(){
        return on;
    }

    // コンストラクタ
    MyTimeout(){}
};
uint8_t MyTimeout::on; // ★staticデータメンバーはクラスの外部で定義しなければならない。

int main(){
    DigitalOut led(PA_10);

    MyTimeout timer;
    timer.start(5s);

    while(timer.IsOn()){
        led = !led;
        ThisThread::sleep_for(250ms);
    }

    return 0;
}