在函数名前加上'&'调用函数
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))
{
...
我正在为一个项目使用 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))
{
...