0

次の MBED ベースの C++ プログラムは、Nucleoboard マイクロコントローラー用に取り組んでいるより詳細なプロジェクトの実験として作成しました。

#include "mbed.h"

DigitalOut greenLed(PA_5);

#include "mbed.h"
class TimedLED
{
    public:
        TimedLED()
        {
            Ticker t;
            t.attach_us(this, &TimedLED::flip, 1000000);
        }

        void flip(void)
        {
           static int count = 0;
           greenLed.write(count%2); //-- toggle greenLed
           count++;
        }
};

int main()
{
    TimedLED flash;
    while (1);
}

私が見たすべての参照は、 t.attach_us(this, &TimedLED::flip, 1000000) がメソッドを呼び出す必要があることを示しているようで、毎秒「フリップ」し、LED のオンとオフを切り替えます。しかし、これは起こっていません。何が問題なのかわかりません。誰かがこれを解決するのを手伝ってくれることを願っています。

この形式が非推奨であることを示す次の警告メッセージが表示されますが、ドキュメントへのリンクが壊れているため、詳細を取得できませんでした:

Function "mbed::Ticker::attach_us(T *, M, us_timestamp_t) [with T=TimedLED, M=void(TimedLED::*)()]" (declared at /extras/mbed_fd96258d940d/drivers/Ticker.h:122) was declared "deprecated" "t.attach_us(this, &TimedLED::flip, 1000000);"

廃止されたとしても、まだ機能するはずですよね?また、おそらく非推奨メッセージが正しい場合、同じことを行う新しい方法があります。どこにも代替方法への参照が見つかりません。

4

1 に答える 1

2

Ticker t;スタック上のコンストラクターで宣言すると、コンストラクターが終了するとオブジェクトがクリアされるため、コードは実行されません。

クラスで変数を宣言すると、期待どおりに実行されます。

class TimedLED
{
    public:
        TimedLED()
        {
            t.attach(callback(this, &TimedLED::flip), 1.0f);
        }

        void flip(void)
        {
            static int count = 0;
            greenLed.write(count%2); //-- toggle greenLed
            count++;
        }

    private:
        Ticker t;
};

また、コンストラクターの変更にも注意してください。これは、mbed OS 5 でコールバックをアタッチするための推奨される (非推奨ではない) 方法です。

于 2017-09-21T07:51:37.127 に答える