Цитата(Alechin @ Feb 27 2006, 19:34)

Насчет выкидывания volatile: при этом действительно можно получить неработоспособный код - IAR "слишком умный" - если в какой-либо процедуре идет чтение глобальной переменной, и перед этим в процедуре нет записи в нее - компилятор использование этой переменной молча (заметьтьте - молча) выбрасывает из кода. Я для MSP430 очень долго не мог понять - почему основной цикл программы с условием завершения по такой, не описанной как volatile, переменной полностью был исключен из кода! Компилятор посчитал, что раз переменная в цикле нигде не модифицируется, то цикл никогда не будет выполнен.
И совершенно правильно он делает. И то, что докапывается до этого - честь ему и хвала, потому как действительно дотошный и придирчивый компилятор, генерирующий хороший код, глядя на который, писать что-то на асме пропадает в подавляющем большинстве случаев само собой.
Что касается volatile. Volatile, как сказали, указание компилятору не оптимизировать объект. На самом деле это не совсем правильно, не совсем точно. Volatile - более близкий по смыслу перевод, - означает, что объект "подвижный", асинхронно изменяемый, т.е. объект может быть срытно изменен вне данного потока управления программы. И, следовательно, запрещает не все оптимизации, а только те, которые могут нарушить правильность работы по причине асинхронной изменяемости. Другие оптимизации вполне имеют право быть. Например, есть в EWAVR оптимизация clustering variables. Она сводится к тому, что компилятор логически объединяет рядом объявленные глобальные/статические объекты в "вируальную структуру" и обращается к этим объектам, не загружая каждый раз полный адрес для каждого объекта, а загрузив одни раз базовый адрес этой "виртуальной структуры", обращается к объектам со смещением, что есть наиболее эффективный способ адресации в AVR. И если пропускать обращение к объекту, объявленному как volatile, компилятор не имеет права, то делать кластеризацию с этим объектом - пожалуйста.
Т.ч. тут все не в компилятор упирается, а в программиста. Ошибка эта очень распространенная, все на эти грабли наступают и не один раз. И даже опытные товарищи забывают (вернее, упускают из виду) и тоже мимо граблей не проходят. Но откаываться от хорошей оптимизации, имхо, все-таки неправильно.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков