ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
1283862 Топик полностью
Nikolay_Po (13.02.2023 14:15, просмотров: 111) ответил Bill на Вообще-то неплохо было бы на сгенерированный код взглянуть. Я думаю так. Компилятор копирует переменную systick в какой-нибудь регистр, а содержимое этого регистра копируется в обе переменные и далее сразу идёт проверка условия. Другими словами. компилятор может исходное выражение привести к виду
Если systick был объявлен как volaitle, то, вне зависимости от того, куда класть его значение, вне зависимости от переменных temp, должно быть обращение к systick принудительно. Простите, без подписей что к чему, в асм-е 

https://caxapa.ru/1283388.html

не разобрался. Там везде есть обращение к systick дважды? Хотя бы как (псевдокод C):


temp1=temp2=systick;
systick;


С какими компиляторами ни работал (Microchip XC8, XC16, avr-gcc, gcc-arm-none-eabi), всегда обращение к volatile беспрекословно соблюдалось. И если переменная использовалась в двух разных операторах, к ней обязательно было бы два обращения. Иначе даже с регистрами МК такой компилятор работать не сможет. Чего стоит, хотя бы, вычитка пустого значения из двунаправленного регистра данных SPI:


SPDR;


Никакого эффекта нет, кроме обращения к регистру. И компиляторы его обязаны исполнить. Если есть ";", значит, это разные операторы, разные обращения. Удивлюсь, если компилятор делает не так.