我在寫一個使用C++類的Arduino庫。在類內部,我有一個私有成員變量,它是一個指向函數的指針。指向函數的volatile指針,顯示使用時沒有使用typedef時的編譯錯誤;需要幫助w /「void(* volatile userFunc)(void)」
的問題是,我需要的指針是易失性,因爲指針指向功能將被設置外一個ISR,並且可以在程序執行期間被改變,但該函數將被稱爲內部一個ISR。因此,我認爲我需要一個非易失性函數的volatile指針,對嗎?
無論如何,我正在做的是創建一個機制,允許自定義用戶函數,這將定期由我的庫調用。
這裏的基礎知識:
這恰恰說明了主要部分給你看。
h文件
class myLib
{
public:
void attachOverflowInterrupt(void (*myFunc)());
private:
volatile void (*userOverflowFunction)(void);
}
cpp文件
void myLib::attachOverflowInterrupt(void (*myFunc)())
{
//ensure atomic access
uint8_t SREGbak = SREG; //back up interrupt state
noInterrupts(); //interrupts off
userOverflowFunction = myFunc; //attach function //<--the part that matters to my problem here
SREG = SREGbak; //restore interrupt state
}
//inside the interrupt, their function is called essentially like this:
this->userOverflowFunction();
的Arduino .ino文件(僅示出了基本部分)
void doSomething()
{
}
myLib1.attachOverflowInterrupt(doSomething);
此代碼不編譯。我得到這個錯誤:
error: invalid conversion from 'void (*)()' to 'volatile void (*)()' [-fpermissive] userOverflowFunction = myFunc; //attach function
如果我這樣做的類代替,但是,它編譯:
class myLib
{
public:
void attachOverflowInterrupt(void (*myFunc)());
//volatile void (*userOverflowFunction)(void); //compile error
void (* volatile userOverflowFunction)(void); //<---compiles
}
,或者,如果我這樣做,相反,它編譯:
typedef void (*voidFuncPtr)(void);
class myLib
{
public:
void attachOverflowInterrupt(void (*myFunc)());
//volatile void (*userOverflowFunction)(void); //compile error
//void (* volatile userOverflowFunction)(void); //compiles
volatile voidFuncPtr userOverflowFunction; //<---compiles
}
那麼,這三件事情之間的區別是什麼,使得第一件失敗,而後者則編譯?
volatile void (*userOverflowFunction)(void); //compile error
void (* volatile userOverflowFunction)(void); //compiles
volatile voidFuncPtr userOverflowFunction; //compiles
背景閱讀中,我已經做了:
- http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword
- Why is a point-to-volatile pointer, like "volatile int * p", useful?
其他問題:
上述狀態的第一個背景鏈接:
「揮發性足尖RS非易失性數據是非常罕見的(我想我已經使用過一次),但我還是繼續前進,給你的語法:」
int * volatile p;
所以,當你將使用此技術之上?在我的情況?
有沒有這樣的事情作爲「非易失性函數」。除了非靜態類成員函數,函數不能被限定。 (甚至對於NSMF,該限定適用於隱式實例參數,而不適用於函數本身。) –
編譯器錯誤*被打印。*不被拋出。不工作和不編譯有一個主要的區別。 – EJP
@EJP,點了。 –