您是否注意到您定義了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))