Амперсанд используется в этом случае для вызова побитового оператора И между возвращаемым значением функции LPUART_GetStatusFlags
и константой LPUART_STAT_RDRF_MASK
.
Использование побитового оператора AND, подобного этому, является обычным способом проверить, установлен ли определенный флаг.
В вашем случае значение kLPUART_RxDataRegFullFlag
равно 0x200000
, соответствующее битовой комбинации 0000 0000 0010 0000 0000 0000 0000 0000
.
Таким образом, побитовая операция И оценивается как ноль, если бит 32 не установлен в 32-битном возвращаемом значении функции 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))
{
...