簡體   English   中英

函數名前帶有“&”的調用函數

[英]Calling function with a '&' in front of the function name

我正在為一個項目使用 NXP SDK。 SDK 包含多個示例代碼。 此示例之一稱為“lpuart_interrupt”。 在本例中,LPUART_GetStatusFlags 函數的使用如下:

    /* If new data arrived. */
    if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))
    {
      ...

我不明白的是為什么函數名稱前面有一個“&”字符? 當以這種方式調用該函數時,該函數應該如何工作?

函數原型如下:

    uint32_t LPUART_GetStatusFlags(LPUART_Type *base);

kLPUART_RxDataRegFullFlag 是以下枚舉的一部分:

    enum _lpuart_flags
    {
        kLPUART_TxDataRegEmptyFlag = (LPUART_STAT_TDRE_MASK),
        kLPUART_TransmissionCompleteFlag = (LPUART_STAT_TC_MASK),
        kLPUART_RxDataRegFullFlag = (LPUART_STAT_RDRF_MASK),
        ...
    }

LPUART_STAT_RDRF_MASK 定義如下:

    #define LPUART_STAT_RDRF_MASK (0x200000U)

在這種情況下,與號用於調用LPUART_GetStatusFlags函數的返回值和常量LPUART_STAT_RDRF_MASK之間的按位 AND 運算符。

像這樣使用按位 AND 運算符是測試是否設置了特定標志的常用方法。

在您的情況下, kLPUART_RxDataRegFullFlag值為0x200000對應於位模式0000 0000 0010 0000 0000 0000 0000 0000

因此,如果在LPUART_GetStatusFlags函數的 32 位返回值中未設置位編號 22, LPUART_GetStatusFlags位 AND 運算將計算為零。 如果它被設置,結果將是非零的,並且受 if 子句保護的代碼將被執行。

通過引入這樣的輔助函數,if 子句的意圖將更容易理解。

static int RxDataRegisterIsFull(LPUART_Type *const uart)
{
    const uint32_t flags = LPUART_GetStatusFlags(uart);
    const uint32_t mask = kLPUART_RxDataRegFullFlag;
    return (flags & mask) ? 1 : 0;
}

/* If new data arrived. */
if (RxDataRegisterIsFull(DEMO_LPUART))
{
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM