在我們打算用 C 撰寫的專案中,我們使用了 C 庫。這個 C 庫提供函式來注冊回呼,在每個中斷上呼叫。我們在建構式中注冊我們的回呼。所以我們基本上有以下(簡化的)結構:
OurClass::OurClass() {
//the registerISRCallback is the C function, that accepts as first parameter the pin,
//the interrupt is expected on and as second parameter a function pointer:
//void (*callbackFunction)(int number, int time)
registerISRCallback(SCLK, handle_interrupt);
}
void OurClass::handle_interrupt(int pin, int time) {
//example: Blink a Led on the instance-LedPin
}
然而,問題是雙重的:
- 因為它是一個成員函式,所以 handle_interrupt 方法具有簽名
void (OurClass::*)(int, int)。因此不可能像這樣使用它。 - 這個類可以被多次實體化,所以使用單例也行不通,因為我們的回呼可能因實體而異(例如,每個實體可能有不同的 LedPin。
是否有更多的解決方案可以在我們的類中使用此 C API 函式并保持代碼清潔和可讀?
uj5u.com熱心網友回復:
您的類可以集成一個靜態方法,您將其作為 C 回呼函式傳遞(前提是呼叫約定兼容;如果不可能,請將其包裝在純 C 呼叫中)。
此外,讓您的類保留一個已創建實體的靜態表,與引腳相對應。呼叫回呼時,通過知道 pin,您將知道要激活哪個實體。
uj5u.com熱心網友回復:
創建一個 C 風格的 API(C 外部,C 內部),它本身注冊為單個回呼并允許注冊多個 C 回呼。這將需要一些串列處理。
當中斷發生時,呼叫它們,讓它們根據回呼引數決定是否需要回應。
或者,在 Story Teller 的評論中查看更豪華的建議(將 pin 映射到多個回呼之一),它基本上集中檢測需要哪個回呼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535458.html
標籤:C C
上一篇:如何在Eigen中創建對角矩陣
