Trending News
C的片段程式請大大們指點
片段中經常出現,可以幫我解釋一下嗎
請知道該如何去解釋,尤其是倒數1~2段
HAL_LED_SET_1();
#define HAL_LED_SET_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN)
#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin)
#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; )
#define st(x) do { x } while (__LINE__ == -1)
3 Answers
- 7 years agoFavorite Answer
ㄜ~ 你的順序應該寫反了吧! 正確的順序應該如下
#define st(x) do { x } while (__LINE__ == -1)
#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; )
#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin)
#define HAL_LED_SET_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN)
我想把這些巨集展開來你應該就懂了
在應用層面,你只要呼叫 HAL_LED_SET_1() 就會執行以上這些程序
所以我們先來看看 HAL_LED_SET_1() 是什麼(從字面上應該是讓LED亮)
MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN)
很明顯的,HAL_LED_SET_1()的內容就是呼叫MCU_IO_SET_HIGH並傳入HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN
而MCU_IO_SET_HIGH又是什麼呢
(從字面上的意思就是讓這個位置的腳位設成高電壓)
它只是又呼叫了MCU_IO_SET_HIGH_PREP這個函式,並把HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN傳進去
再來看到MCU_IO_SET_HIGH_PREP又是什麼呢
基本上就是呼叫st(),並且把P##port##_##pin## = 1;這個程序丟進去
最後只教檢視st()是什麼就OK了
do { x } while (__LINE__ == -1)
其實很簡單
就是只要__LINE__等於-1的話就一直作x這件事情
而__LINE__的值是硬體在控制的
講了這麼多,我把整個程式展開來,應該就很清楚了
(以下我寫成函式的形式可能會比較好懂)
void HAL_LED_SET_1()
{
port = HAL_BOARD_IO_LED_1_PORT;
pin = HAL_BOARD_IO_LED_1_PIN;
do
{
// 這個敘述只是將該腳位設成高電壓而已
// 不過這個語法應該是這個編譯器特有的才對
P##port##_##pin## = 1;
} while (__LINE__ == -1);
}
這樣應該懂了吧
Source(s): 我