2014-04-02 26 views
0

我已經寫在下面和樹莓PI未定義的參考`GOIO_SET」的Linux

#define GPIO_SET(g) (*(gpio.addr + 7) |= (1<<(g))) 

#define ALL_COL_HIGH (GPIO_SET(COL1) | GOIO_SET(COL2) | GPIO_SET(COL3) | GPIOO 
_SET(COL4)) 

工作出了一套功能宏當我編譯文件,我將獲得以下錯誤

**undefined reference to `GOIO_SET'** 

如何我能克服這個嗎?

回答

0

您是否注意到您定義了GPIO_SET,但隨後使用了GOIO_SET?第二個字母是不同的! A中的定義爲P,但使用O。最後一個還有其他錯字:GPIOO_SET有兩個O

由於GOIO_SET名稱沒有定義,編譯器認爲它必須是一個函數或其他東西,但它沒有定義,所以它會給你錯誤。

作爲一個方面說明,我認爲你的代碼是錯誤的。你ALL_COL_HIGH宏將擴展到類似:

(*(gpio.addr + 7) |= (1<<(COL1))) | (*(gpio.addr + 7) |= (1<<(COL2))) ... 

將修改同一個值(*(gpio.addr + 7))好幾次都沒有中間序列點,這是不確定的行爲。

您可以用逗號運營商解決這個問題,因爲在ALL_COL_HIGH|是沒有意義的:

#define ALL_COL_HIGH (GPIO_SET(COL1) , GPIO_SET(COL2) , GPIO_SET(COL3) , GPIO_SET(COL4)) 

逗號操作符不包括序列點,所以一切都會好起來的。

雖然將COLx值定義爲實際位並將所有位同時設置通常更容易。

#define COL1 (1<<1) 
#define COL2 (1<<2) 
#define COL3 (1<<3) 
#define COL4 (1<<4) //or whatever 

#define GPIO_SET(g) (*(gpio.addr + 7) |= (g)) 
#define ALL_COL_HIGH (GPIO_SET(COL1 | COL2 | COL3 | COL4))