[英]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
函數的返回值和常量LPUART_STAT_RDRF_MASK
之間的按位 AND 運算符。
像這樣使用按位 AND 運算符是測試是否設置了特定標志的常用方法。
在您的情況下, kLPUART_RxDataRegFullFlag
值為0x200000
對應於位模式0000 0000 0010 0000 0000 0000 0000 0000
。
因此,如果在LPUART_GetStatusFlags
函數的 32 位返回值中未設置位編號 22, LPUART_GetStatusFlags
位 AND 運算將計算為零。 如果它被設置,結果將是非零的,並且受 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))
{
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.