【问题标题】:Calling function with a '&' in front of the function name调用函数名前带有“&”的函数
【发布时间】:2019-01-15 16:17:54
【问题描述】:

我正在为一个项目使用 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(DEMO_LPUART) & (kLPUART_RxDataRegFullFlag)一样重写它
  • 如果我们放弃带有括号疾病的蹩脚编码风格可能会更清楚:if (kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(DEMO_LPUART))。现在,如果问题是 flag_register & mask 应该做什么,那么答案就是研究按位运算符。

标签: c embedded nxp-microcontroller


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢你的回答,我知道了。主要是我不清楚的语法。 '&' 字符粘在函数名上的事实非常令人困惑。
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 2018-10-12
  • 2019-11-23
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多