2010-10-12 77 views
5

我使用C.嵌入式C函數宏觀問題

#define EnterPWDN(clkcon) ( (void (*)(int))0xc0080e0) (clkcon) 

我不知道這是怎麼函數宏工作過這個排在嵌入式硬件。我知道clkcon是EnterPWDN的函數參數,但是之後發生了什麼?

回答

8

它施放地址0xc0080e0的指針函數獲取int和返回void,並調用該函數,傳遞clkcon作爲參數。

闡明:

typedef void (func_ptr*)(int); 
func_ptr func = (func_ptr)0xc0080e0; 
func(clkcon); 

(如果您有沒有碰到過的函數指針來了,你可能想grab a good C introduction,並在主題讀了)

5

它是一個空函數指針,它接受一個int作爲參數。該函數保存在特定的內存地址0xc0080e0處。

(void (*)(int)) 

以上是函數指針聲明。首先是無效返回類型。接下來的事實是,它的指針,最後是int告訴你函數的參數是什麼。內存地址是函數存儲的位置,整個過程將該內存地址轉換爲正確的函數指針類型,然後調用該函數並將「clkcon」傳遞給它。

3

優秀的答案Gozsbi,而是換一種方式:

在內存中的特定地址(0xc0080e0),可能是在ROM中,有一個函數。您可以使用int clkcon參數調用此函數。