Я использую циклы for / while для реализации задержки в моем коде. Длительность задержки здесь не важна, хотя она достаточно велика, чтобы быть заметной. Вот фрагмент кода.
uint32_t i;
// Do something useful
for (i = 0; i < 50000000U; ++i)
{}
// Do something useful
Проблема, которую я наблюдаю, заключается в том, что этот цикл for не выполняется. Вероятно, компилятор игнорирует / оптимизирует его. Однако, если я квалифицирую счетчик цикла i
как volatile, цикл for, кажется, выполняется, и я замечаю желаемую задержку в выполнении.
Такое поведение кажется немного противоречащим моему пониманию оптимизации компилятора с / без ключевого слова volatile.
Даже если счетчик цикла оптимизируется и сохраняется в регистре процессора, не должен ли счетчик по-прежнему работать, возможно, с меньшей задержкой? (Поскольку накладные расходы на выборку из памяти устранены.)
Платформа, для которой я создаю, - это процессор Xtensa (от Tensilica), а компилятор C - это тот, который предоставляется Tensilica, компилятор Xtensa C / C ++, работающий с высочайшим уровнем оптимизации.
Я пробовал то же самое с gcc 4.4.7
с -o3
и высокими уровнями оптимизации. Кажется, что в этом случае задержка работает.
nanosleep
или что-то подобное? Действительно ли требуется временная задержка или есть переход между состояниями, который может вызвать выполнение кода и т. Д.? - person rickhg12hs   schedule 13.05.2015_delay_us()
на AVR. Такие функции часто пишутся на ассемблере и довольно точны, если вы их используете. Даже если вам не нужна такая точность, это самое чистое решение, поскольку, как видите, любое другое решение можно оптимизировать. - person glglgl   schedule 13.05.2015