zxc126128 发表于 2020-7-19 15:23:40

代码中的一个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 ;    uint8buffer ;     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 ;      }    }    return regval ;}

uwb 发表于 2020-7-19 16:01:36

这个表达式,你得分开解读,
!((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:43

uwb 发表于 2020-7-19 16:01
这个表达式,你得分开解读,
!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | S ...

刚开始不明白什么是掩码,查了一下,加上你的讲解,现在理解了这个语句
非常感谢
页: [1]
查看完整版本: 代码中的一个while循环(轮询接收帧)理解不了,望各位前辈指教