调用函数时,函数名称前应带有“&”

时间:2019-01-15 16:17:55

标签: c embedded nxp-microcontroller

我正在将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)

1 个答案:

答案 0 :(得分:1)

在这种情况下,使用&号来调用LPUART_GetStatusFlags函数的返回值和常量LPUART_STAT_RDRF_MASK之间的按位AND运算符。

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

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

因此,如果LPUART_GetStatusFlags函数的32位返回值中未设置第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))
{
    ...