2016-05-17 39 views
2

我正在嘗試編寫一個庫來使用中斷來計算PWM佔空比。我知道一個類成員不是attachInterrupt函數的正確格式。一個類中的中斷

不過,我曾試圖遵循這個帖子Calling an ISR from a classNick Gammon,誰擁有一個變通,但令人沮喪的我仍然得到錯誤:

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

可有人請照有什麼錯一些輕我的代碼或任何其他建議?

這是cpp文件:

#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(); 
    } 
} 

這是頭文件:

#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

在你的頭文件,你已經聲明瞭功能static,因此在您的.cpp文件中不需要再次這樣做。

有關類似問題here的一個很好的答案,爲了進一步澄清原因。

+0

其實這並不是真正的「再次這樣做」的問題。問題在於,靜態關鍵字在第二個地方有着完全不同的含義(這不適用於成員函數)。 – Frax