Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 7 years ago

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

Rating
  • 7 years ago
    Favorite 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):
  • 7 years ago

    > 片段中經常出現

    小弟資淺...從未看過這些程式...

  • ?
    Lv 7
    7 years ago

    > 請知道該如何去解釋,尤其是倒數1~2段

    是在問神啊?

    2014-02-17 13:40:04 補充:

    ## 在C macro 裡面是"paste" operator

Still have questions? Get your answers by asking now.