Компилятор C, похоже, оптимизирует переменную, которую я не ожидаю. Этот код ниже:Оптимизатор C, устраняющий непредвиденную переменную
uint32_t GetSysTick(void);
uint32_t timeout = GetSysTick() + 9000; //9sec
while(len && (GetSysTick() < timeout))
{
... some code that will decrement len
}
Компилятор оптимизирует переменную «тайм-аут». Обычно цикл while выйдет, как только len достигнет нуля, но если процесс занимает больше времени, чем ожидалось, когда systick превышает таймаут, тогда он также должен выйти, конечно, ничего из этого не происходит, если тайм-аут оптимизирован. Я уверен, что я определяю тайм-аут как изменчивый, который не должен его оптимизировать, но технически это не изменчиво. Что мне здесь не хватает? Должен ли я использовать volatile для возвращаемого значения из GetSysTick()? (не уверен, что это даже законно)
Для полноты здесь GetSysTick и декларация системы. Оба находятся в другом файле C. systick получает приращение каждые миллисекунды в прерывании.
static volatile uint32_t systick=0;
uint32_t GetSysTick(void)
{
return systick;
}
Какой компилятор, как & where is 'GetSysTick' объявлен? См. [Ask] и укажите [mcve]. Обратите внимание, что ожидание - это не очень хорошая идея. Лучше использовать прерывания/семафоры/таймеры/и т. Д. – Olaf
Что заставляет вас думать, что компилятор это делает? У вас есть тайм-аут в цикле? –
@AlexK .: У вас есть точка. Но добавление кода для печати переменной может повлиять на генерацию кода (Heisenberg-Effect). Лучше проверить код сборки или использовать отладчик. – Olaf