我正在为项目使用NXP SDK。SDK包含几个示例代码。其中一个示例称为“lpuart_interrupt”。在此示例中,LPUART_GetStatusFlags函数的用法如下:
…
在这种情况下,使用&符号来调用返回值之间的按位AND运算符 LPUART_GetStatusFlags 功能和常数 LPUART_STAT_RDRF_MASK 。
LPUART_GetStatusFlags
LPUART_STAT_RDRF_MASK
像这样使用按位AND运算符是测试是否设置了特定标志的常用方法。
在你的情况下的价值 kLPUART_RxDataRegFullFlag 是 0x200000 对应于位模式 0000 0000 0010 0000 0000 0000 0000 0000 。
kLPUART_RxDataRegFullFlag
0x200000
0000 0000 0010 0000 0000 0000 0000 0000
因此,如果未在32位返回值中设置位号22,则按位AND运算将评估为零 LPUART_GetStatusFlags 功能。如果已设置,则结果将为非零,并且将执行由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)) { ...