2016-05-17 29 views
2

割り込みを使用してPWMデューティを計算するライブラリを作成しようとしています。私はクラスメンバーがattachInterruptの関数の正しいフォーマットではないことを理解しています。クラス内の割り込み

しかし、私の周りに仕事を持っているNick Gammon、でこのポストCalling an ISR from a classに従うことを試してみましたが、イライラ、私はまだエラーを取得しています:

cannot declare member function 'static void PWMin::risingInt()' to have static linkage

誰かがと間違っているものにいくつかの光を当てるてくださいすることができ私のコードまたは他の提案?

これは、cppのファイルです:あなたがstaticとしてあなたの関数を宣言している、あなたのヘッダファイルで

#ifndef PWMin_h 
#define PWMin_h 

class PWMin { 
    public: 
     PWMin(int intPin, int* outputTime, bool direction); 
     unsigned long lastElapsedTime(); 

    private: 
     static PWMin *instance; 

     int _intPin; 
     int* _outputTime; 
     bool _direction; 
     unsigned long start, timeElapsed; 

     void attachInt(); 
     void risingISR(); 
     void fallingISR(); 
     static void risingInt(); 
     static void fallingInt(); 
}; 

#endif /* PWMin_h */ 

おかげで、 ショーン

+0

あなたが行ったように、クラス定義にメンバ関数を 'static'で入れます。行外関数の本体でそれを繰り返さないでください –

+0

@ M.M申し訳ありませんが、私はあなたが「行外関数体」と言うときには厳密に従っていません。あなたはもっと詳しく説明できますか?ありがとう –

+1

'static void PWMin :: risingInt(){'と 'static void PWMin :: fallingInt(){' –

答えて

2

、:これは、ヘッダファイルである

#include "PWMin.h" 

PWMin::PWMin(int intPin, int* outputTime, bool direction=true){ 
    instance = this; 

    this->_intPin = intPin; 
    this->_outputTime = outputTime; 
    this->_direction = direction; 

    pinMode(this->_intPin, INPUT); 
    attachInt(); 
} 

void PWMin::attachInt(){ 
    attachInterrupt(this->_intPin, this->_direction ? risingInt : fallingInt, this->_direction ? RISING : FALLING); 
} 

void PWMin::risingISR(){ 
    this->start = micros(); 
    this->_direction = false; 
    this->attachInt(); 
} 

void PWMin::fallingISR(){ 
    this->timeElapsed = micros() - this->start; 
    *_outputTime = this->timeElapsed; 
    this->_direction = true; 
    this->attachInt(); 
} 

unsigned long PWMin::lastElapsedTime(){ 
    return this->timeElapsed; 
} 

static void PWMin::risingInt(){ 
    if(PWMin::instance != NULL){ 
     PWMin::instance->risingISR(); 
    } 
} 

static void PWMin::fallingInt(){ 
    if(PWMin::instance != NULL){ 
     PWMin::instance->fallingISR(); 
    } 
} 

したがって、.cppファイルでこれを再度行う必要はありません。

なぜ同様の質問hereに良い答えがあります。

+0

実際には、それは実際にはもう一度やっている問題ではありません。問題は、 'static'キーワードがこの2番目の場所で全く異なる意味を持つことです(メンバ関数には適用できません)。 – Frax