51uwb.cn

标题: 代码中的一个while循环(轮询接收帧)理解不了,望各位前辈指教 [打印本页]

作者: zxc126128    时间: 2020-7-19 15:23
标题: 代码中的一个while循环(轮询接收帧)理解不了,望各位前辈指教
      while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
      { };

这个while循环理解不了,括号里面会出现1或0吗?


下面是这个函数原型  
#define SYS_STATUS_ID           0x0F           
#definedwt_read32bitreg(x)        dwt_read32bitoffsetreg(x,0)
uint32dwt_read32bitoffsetreg(int regFileID,int regOffset)
{
    uint32 regval = DWT_ERROR ;
    int    j ;
    uint8  buffer[4] ;
    int result =dwt_readfromdevice(regFileID,regOffset,4,buffer); // Read 4 bytes (32-bits)register into buffer
    if(result == DWT_SUCCESS)
    {
        for (j = 3 ; j >= 0 ; j --)
        {
            regval = (regval << 8) +buffer[j] ;
        }
    }
    return regval ;
}


作者: uwb    时间: 2020-7-19 16:01
这个表达式,你得分开解读,
!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))

去掉!运算符,
(status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)

这就是一个按位与表达式,左侧为
status_reg = dwt_read32bitreg(SYS_STATUS_ID),
右侧为
SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR

右侧就是一个包括SYS_STATUS_RXFCG和SYS_STATUS_ALL_RX_ERR的掩码,左侧为一个赋值语句,把dwt_read32bitreg(SYS_STATUS_ID)的返回值赋给status_reg,最后结果为status_reg的值

简言之,该语句表达了把dwt_read32bitreg(SYS_STATUS_ID)的返回值与掩码SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR进行按位或,1). 如果结果不为零,取反后为假,while退出,2). 如果结果为零,取反后为真,while循环继续执行
作者: zxc126128    时间: 2020-7-21 09:41
uwb 发表于 2020-7-19 16:01
这个表达式,你得分开解读,
!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | S ...

  刚开始不明白什么是掩码,查了一下,加上你的讲解,现在理解了这个语句
非常感谢  




欢迎光临 51uwb.cn (http://51uwb.cn/) Powered by Discuz! X3.3