你能告诉我一些代码吗?
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)
谢谢。
答案 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)