在函数名前加上'&'调用函数

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 函数的 return 值与常量 LPUART_STAT_RDRF_MASK.

之间的按位与运算符

像这样使用按位与运算符是测试是否设置了特定标志的常用方法。

在您的情况下,kLPUART_RxDataRegFullFlag 的值是 0x200000 对应于位模式 0000 0000 0010 0000 0000 0000 0000 0000

因此,如果未在 LPUART_GetStatusFlags 函数的 32 位 return 值中设置位编号 22,则按位与运算的计算结果将为零。如果它被设置,结果将是非零的并且被 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))
{
    ...