C语句的含义

时间:2014-04-04 07:12:15

标签: c while-loop

你能告诉我一些代码吗?

C代码:

while((INT_STATUS() & ISR_RX_MASK)
       ||(event & TIMER_EXPIRED)
       ||(event & MEM_BLOCK_AVAILABLE))
{.........

下面:

event is UNT32 local variable in function   

INT_STATUS() = Some Address location

ISR_RX_MASK = 0x01 (Some value in HEX)
TIMER_EXPIRED = 0x02 (Some value in HEX)
MEM_BLOCK_AVAILABLE = 0x03 (Some value in HEX)

谢谢。

3 个答案:

答案 0 :(得分:0)

当INT_STATUS()的位0为1或事件的位1或事件的位2设置为1时,循环将执行

答案 1 :(得分:0)

首先,您可能会对binary numbers representation感兴趣。

我建议MEM_BLOCK_AVAILABLE实际上是0x04而不是0x03,更多信息如下。

二进制(0x表示数字以十六进制表示,但由于下面的所有数字都小于10,它们也可以用十进制显示 - 但我们通常使用hexa或octal来写数字文字兴趣是他们的二元表示),我们有

Hexa    Binary
0x01 is 0001
0x02 is 0010
0x03 is 0011
0x04 is 0100 ...

两个数字A和B之间的bitwise operator &保持1二进制中的 dcba dcba 0110 & 0011 gives 0010 since only the 1 at position b is in both numbers 两个数字在同一个地方

like(二进制表示)

while( expr )

最后expr循环而&非零。因此,在两个数字之间执行1会得到一个结果(expr),其中至少有一个1(非零)或没有while(零)。因此具有while((INT_STATUS() & ISR_RX_MASK) ||(event & TIMER_EXPIRED) ||(event & MEM_BLOCK_AVAILABLE)) 循环(非零)或结束(零)。

在你的情况下,做

while
如果三个表达式中的任何一个非零(true),则

表示||循环,ISR_RX_MASK表示逻辑OR。如果TIMER_EXPIRED为1,MEM_BLOCK_AVAILABLE为2且while为(我假设)为4,则会得到(INT_STATUS() & 1) || (event & 2) || (event & 4) 表达式

while

意味着如果来自INT_STATUS & 1的结果1继续,即其第一位(右侧)是1(或 a 在我的上面显示的> dcba 符号),或者如果事件的第二位(或 b dbca 符号中的 b )是1(来自右侧) ),或者如果事件的第三位(或 dcba 符号中的 c )为INT_STATUS() & 1

例如,如果INT_STATUS为14,即二进制为1110,则其第一位为0,因此0将产生event & 2

我假设MEM_BLOCK_AVAILABLE为4(或2> 2的另一个幂)而不是3的原因是因为如果它是3或二进制的0011,则{{1}时前一个event & 3将始终为真是真的,因此在这种情况下没有意义。它似乎没有MEM_BLOCK_AVAILABLE和TIMER_EXPIRED根据它们的名字相关,这是主观的,但是...

答案 2 :(得分:0)

while((INT_STATUS() & ISR_RX_MASK) ||(event & TIMER_EXPIRED) ||(event & MEM_BLOCK_AVAILABLE))

如果出现以下任何一种情况,则继续循环

1)在INT_STATUS()函数的返回值和ISR_RX_MASK之间执行逻辑AND运算后的结果为真,我假设正在检查某些中断条件

2)在变量事件之间执行逻辑AND运算后的结果(我假设这包含某些寄存器的值),TIMER_EXPIRED十六进制值为TRUE。也就是说,Timer Expire的指示标志位于第1位(0000 0010)

3)在变量事件之间执行逻辑AND运算后的结果(我假设这包含某些寄存器的值),MEM_BLOCK_AVAILABLE十六进制值为TRUE。这是可用存储块的指示标志位于第0位和第1位(0000 0011)