Свежие обсуждения
Микроконтроллеры

Как пользоваться volatile на СИ ?

1 2

Насчет значения после выхода из цикла - значение переменной не определено по стандарту С, независимо от того, что это за переменная - локальная или глобальная, и volatile она или нет. Причина простая - в целях оптимизации компилятор может "прокрутить" цикл в обратном порядке. Почти на 100% уверен, что для АНТОХИного пример компилер построит код for (i = 200; i > 0; i--).

 

chav1961: Почти на 100% уверен, что для АНТОХИного пример компилер построит код for (i = 200; i > 0; i--).

Это зависит от уровня оптимизации. Может скомпилировать в ret. С точки зрения компилятора, результат не меняется - никакие переменные не модифицируются, никаких вызовов не производится
Мне лень сейчас искать стандарты, но я точно помню, что компилятор имеет на это право.
Могу привести листинг компилятора для Fujitsu MB90.

 

гм... озадачили господа вы меня.....

т.е. получается что если я закручу такой цикл то отсчет будет в обратном порядке.... ну и бог с ним если в теле for ничего не выполняется - тут он имеет право это сделать мне без разницы главное что 200 циклов открутит, ну а ежели так

void delay(void) {
int i;
for (i = 0; i < 200; i++);
temp = mas[i];
......
......
}

то, что из массива тоже в обратном порядке будут читаться элементы??? Это не есть хорошо....

 

то АНТОХА
Lerik: Это еще с какой стати?????

Это назывется оптимизация. Компилятор много чего может...

т.е. ты все же хочешь сказать что 200 циклов не открутит? Или открутит все же, но в другую сторону? как говорит chav1961 ?

 

Lerik: (компилятор не имеет права менять логику)

Он имеет право даже переставлять разные действия местами.

 

Ну в вашем-то случае вряд ли он будет извращаться насчет прямого/обратного порядка. Тут действительно будет логика нарушена.

 

Lerik: т.е. ты все же хочешь сказать что 200 циклов не открутит?

Я хочу сказать, что может не открутить. Это называется
"Redundant code", код, который вызывается, но не оказывает влияния на выход программы. (http://en.wikipedia.org/wiki/Redundant_code)

Некоторые компиляторы при определённых уровнях оптимизации выкинут этот цикл.

Поэтому надо явно указать компилятору, что тебе важно увеличить переменную i 200 раз, написав volatile.

Вот, посмотри, сколько всего разных оптимизаций : http://en.wikipedia.org/wiki/Category:Compiler_optimizations

Это в основном про gcc, другие компиляторы могут делать по другому.

...

ЗЫ. Посмотрел как-то, что вытворяет компилятор Keil для 51х... Впечатлился. Программисты на асме отдыхают

 

Спасибо за консультациии всем откликнувшимся.... Впечатляет.

 
1 2