ARV писал(а):как видите, в первом случае считывание в регистр было 1 раз, а потом этот регистр плюсовался к исходному, а во втором случае считывание переменной сделано трижды
Ну про ситуацию с плюсами никто и не спорит, тут мотивы так поступать понятны. А вот с "ИЛИ" даже интересно стало
ARV, RMW - бич старых пЫков где были только PORT и TRIS . Все операции ( аппаратно)с портом идут через тот самый RMW .
В AVR PORT в продвинутых пЫк LATCH ...
Последний раз редактировалось dosikus Пт апр 25, 2014 22:52:01, всего редактировалось 1 раз.
А не надо путать сказки про идеальный компилятор и реальный оптимизатор... разные вещи...
а я и не путаю. как весьма хорошее приближение к стандарту языка Си я вижу GCC - и показанный мной пример это подтверждает: volatileполностью связывает руки оптимизатору, как и должно по стандарту. а ничего иного я и не хотел сказать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Аlex писал(а):Я сравнивал обработку 2-х разных переменных. Битовые операции тут не при чём
протестируйте мой пример с троекратным сложением
Последний раз редактировалось AlekseyEnergo Вс май 04, 2014 20:04:25, всего редактировалось 1 раз.
Причина:Нарушение пункта 2.2 правил форума. Предупрежден!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
dosikus писал(а):При командах записи . Да и AVR не исключение , из за чего думаешь есть PORT и PIN ?
повторяю: модификация отдельного бита в регистре/порте делается, как вы говорите, - я в курсе. но делается это ассемблерными командами, например, SBI или SBR.
однако пока не вижу, каким боком это соотносится с моим высказыванием о том, что если бы топикстартер не использовал нестандартные трюки компилятора, на битовые операции он не нарвался бы никогда? ну, во всяком случае, при соответствии его компилятора стандарту Си...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):
повторяю: модификация отдельного бита в регистре/порте делается, как вы говорите, - я в курсе. но делается это ассемблерными командами, например, SBI или SBR.
Мля , а как работает сия команда на уровне железа ты в курсе ?
Считывается состояние всего порта , Модифицируется тот самый бит и только потом результат целиком заносится обратно.
А если на каком то пине провал ?
Тут речь не о ассемблерных командах а о аппаратных операциях ...
Последний раз редактировалось dosikus Пт апр 25, 2014 23:12:40, всего редактировалось 3 раза.
Аlex писал(а):Ну про ситуацию с плюсами никто и не спорит, тут мотивы так поступать понятны
дело в том, что мотив у компилятора может быть только один - следовать стандарту языка. и это означает, что volatile запретит компилятору вместо считывания байта в промежуточную переменную использовать ассемблерную команду модификации бита - это абсолютно однозначно!
мотивы могут быть разными у нас, но не у компилятора! а мы должны одинаково воспринимать язык - без мотивов и разночтений. только в этом случае наши программы будут понятны друг другу и не будут содержать не понятных нам скрытых ошибок.
dosikus писал(а):Мля , а как работает сия команда на уровне железа ты в курсе ?
Считывается состояние всего порта , Модифицируется тот самый бит и только потом результат целиком заносится обратно.
А если на каком то пине провал ?
я вам третий раз повторяю, большими буквами: Я В КУРСЕ если вы не уследили за нитью моих рассуждений, прошу вас перечитать мои сообщения, а не толочь воду в ступе.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):мотив у компилятора может быть только один - следовать стандарту языка
Объясните мне тогда (а лучше ткните носом где это написано) то, что строку a=a|(1<<7); , c отключеной оптимизацией для переменной "a", компилятор должен создать ещё одну переменную. Не вижу никакой логической связи этой строки с использованием дополнительной памяти. И это с учётом того, что для компилятора эта строка абсолютно эквивалентна строке a |= (1<<7);