【发布时间】:2016-04-28 08:09:20
【问题描述】:
我在 IAR 编译器上使用 C 语言进行编码,并且有两个 while 循环:
i= 5;
do {
Task_sleep(1000);
}while(i-- && !Ready);
if (!Ready)
{
dprint("No ready response!");
return false;
}
和
i= 5;
do {
Task_sleep(1000);
i--;
}while(i > 0 && !Ready);
if (!Ready)
{
dprint("No ready response!");
return false;
}
第一个将跳过 while 循环,第二个可以正常工作。 “就绪”布尔值设置在另一个线程中。第一个循环将返回 false,第二个循环将通过,因此 Ready 未设置为 true。
我认为编译器暂时不知道如何处理 i-- 并将其设置为 false。还有其他可能发生的事情吗?使用我的设置,我无法在调试中单步执行代码。
编辑添加到功能:
if(!Ready)
{
dprint("No Ready responce!");
return false;
}
Tested Ready 为 volatile,--i 而不是 i--,并删除 Ready。都失败了。测试:
}while(((i--) > 0) && !Ready);
仍然失败,它必须是 IAR 编译器没有正确读取 i-- 并且需要从 while 函数中删除 -- 操作。如果你们还有什么我可以尝试的,请告诉我,但我有信心结束这个问题。
【问题讨论】:
-
在第一个中,您没有将您的
i--与任何东西进行比较,为了匹配第二个,不应该是while(i-- > 0 && !Ready)吗? -
@gmiley 嗯?不是隐含的吗?
-
@gmiley:没有。就
while而言,i--的计算结果为true(当i != 0)或false(当i = 0)——两者都在实际递减之前检查。 -
一个
do循环总是至少执行一次......你是说你甚至没有得到一个Task_sleep()第一个循环? -
Ready变量是 volatile 变量吗?如果没有,编译器可能会将其短路。