2013-10-05 42 views
2

我是arduino和編程的新手。 我已經在arduino中的自己的庫中包含了一個庫,但是第一個庫包含一個具有指針函數作爲參數的函數。這是一箇中斷服務例程(ISR),但是當發生中斷時,我需要在我的cpp文件中調用一個函數。所以我需要將該函數的指針傳遞給第一個庫代碼。它工作得很好,當我在.ino文件中使用它,我可以通過它喜歡,使用範圍分辨率運算符傳遞函數指針arduino

attachInterrupt(functionISR_name); 

,但是當我在.cpp文件中使用它,我得到的錯誤。我的功能就像,

void velocity::functionISR_name(){ 
//some code 
} 

但我該如何將該函數的指針傳遞給第一個庫函數?我試過這種方式,但得到錯誤,

attachInterrupt(velocity::functionISR_name); 
+2

「我得到錯誤」。什麼是錯誤? – BoBTFish

回答

1

你傳遞一個指向函數的指針,但函數是一個類成員。可能調用將是無效的,因爲this指針將是垃圾(可能編譯正常,但會在運行時拋出奇怪的錯誤)。

您需要定義一個普通的香草函數,在任何類之外,然後使用它。 如果你沒有一個非常複雜的項目,你可以使用一個全局指針指向你應該使用的類實例,並將這個調用委託給你的新函數。 如果你想以正確的方式做事,你需要一些機制來獲得我上面提到的實例指針。通常這涉及單身人士或一些工廠模式。

例子:

class Foo { 
    void method() { 
    x = 5; 
    } 
    int x; 
} 

有方法上的回調會崩潰,因爲你有this無效的指針,以便x=5會在內存中寫入5隨機地方。 你需要的是服用點,如:

static Foo* foo_instance; // Initialized somewhere else. 
void method_delegator() { 
    foo_instance->method(); 
} 

現在,你可以通過method_delegator的功能。它會工作,因爲你現在也通過foo_instancethis指針。

+0

你能給我一個使用上述場景的示例代碼嗎? – YasithLokuge

+0

@ user2473756添加了示例。讓我知道現在是否清楚。 – Sorin

3

您不能將方法傳遞給需要函數的函數,除非將其定義爲static。

寫靜:

static void velocity::functionISR_name() 

attachInterrupt(&velocity::functionISR_name); 

不幸的是靜態方法不綁定到特定的實例了。你應該只和單身人士一起使用它。在Arduino的,你應該寫像剪斷的代碼如下所示的類:

class velocity 
{ 
    static velocity *pThisSingelton; 
public: 
    velocity() 
    { 
     pThisSingelton=this; 
    } 

    static void functionISR_name() 
    { 
     pThisSingelton->CallWhatEverMethodYouNeeded(); 
     // Do whatever needed. 
    } 

    // … Your methods 
}; 

velocity *velocity::pThisSingelton; 
velocity YourOneAndOnlyInstanceOfThisClass; 

void setup() 
{ 
    attachInterrupt(&velocity::functionISR_name); 

    // …other stuff… 
} 

這看起來醜陋,但在我看來,這是完全沒關係與Arduino的作爲機會非常這樣的系統上的限制。

再想一想,我會親自去索林在上面的回答中提到的方法。那更像是這樣的:

class velocity 
{ 
public: 
    velocity() 
    { 
    } 

    static void functionISR_name() 
    { 
     // Do whatever needed. 
    } 

    // … Your methods 
}; 

velocity YourOneAndOnlyInstanceOfThisClass; 

void functionISR_name_delegation() 
{ 
    YourOneAndOnlyInstanceOfThisClass.functionISR_name(); 
} 

void setup() 
{ 
    attachInterrupt(functionISR_name_delegation); 

    // …other stuff… 
} 

它也可以爲你節省一些字節,你需要在第一個例子中。

作爲網站備註:未來,請發佈確切代碼(例如attachInterrupt需要更多參數)並複製&粘貼錯誤消息。通常錯誤在你不懷疑的地方是確切的。這個問題是個例外。通常我和其他人會要求更好的規格。