Я кодирую на C на компиляторе IAR и имею два цикла 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;
}
Проверено Ready как volatile, --i вместо i-- и удалено Ready. Все не удалось. Тестирование:
}while(((i--) > 0) && !Ready);
Все еще не удается, это должен быть компилятор IAR, который неправильно читает i-- и должен удалить операцию -- из функции while. Дайте мне знать, если у вас есть что-нибудь еще, что я могу попробовать, но я уверен, что закрою эту проблему.
i--
, чтобы соответствовать второму, разве это не должно бытьwhile(i-- > 0 && !Ready)
? - person gmiley   schedule 28.04.2016while
,i--
оценивается либо какtrue
(когдаi != 0
), либо какfalse
(когдаi = 0
) — оба проверяются до фактического уменьшения. - person Jongware   schedule 28.04.2016i--
, это уменьшает переменнуюi
на 1. - person gmiley   schedule 28.04.2016do
всегда выполняется хотя бы один раз.. вы говорите, что даже не получаете ни одногоTask_sleep()
с первым циклом? - person yano   schedule 28.04.2016i = 5; do { printf ("%d\n", i); } while (i--);
не сработает? (Осторожно: я проверял это.) - person Jongware   schedule 28.04.2016Ready
изменчивой? Если нет, компилятор может закоротить это. - person Jongware   schedule 28.04.2016Ready
по-прежнему устанавливается наtrue
. Попробуйте распечатать текущее значениеReady
в цикле. - person gmiley   schedule 28.04.2016i
, а связана сReady
. Полностью согласен с тем, что сказал @RadLexus. Это также может быть какое-то состояние гонки между настройкой потокаReady
и тем, который здесь читает его ... недостаточно кода, чтобы сказать. - person yano   schedule 28.04.2016while (i--) if (!READY) Task_sleep (1000);
- person David C. Rankin   schedule 28.04.2016Ready
из условияwhile
, тогда вы можете играть сi
сколько хотите. Попробуйтеi--
,--i
в условиях, уменьшитеi
в цикле, что угодно. Это должно сказать вам, действительно ли это проблема сi
илиReady
бросает вам гаечный ключ - person yano   schedule 28.04.2016Ready
значением 0/false перед входом в опубликованный цикл? - person user3629249   schedule 28.04.2016__delay_cycles()
код вставки, ожидающий заданное количество циклов. Этот код не будет затронут компилятором. - person Lindydancer   schedule 03.06.2016