我正在将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)
答案 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))
{
...