ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
389003 Топик полностью
3m (19.02.2013 20:58, просмотров: 262) ответил fk0 на Действительно, это легко увидеть на примере GCC на PC, вещи вроде while (variable); и затем доступ к каким-либо другим переменным ("защищённым" volatile variable) могут не работать, в том смысле, что компилятор "защищённые" переменные мог заранее
В листингах статьи "Скользкая дорожка для поклонников volatile" однозначно косяк компилятора. То что есть в ассемблерных листингах компилятор не имел права делать! Пинать афтароф ГЦЦ! Рекомендация писать *((volatile int*)base_addr + 0xff) = 0; фальшивая. Это присваивание а проблема при изменении volatile переменной. Барьер сродни гильотине против перхоти. Зачем скидывать ВСЕ регистры если критична только одна переменная ? Но проблема серьезная - в современных процессорах многоуровневые кэши, переупорядочивание инструкций, спекулятивное исполнение, агрессивная предвыборка, глубокая "прозрачная" буферизация и уж с этим компилятор и даже ассемблер вообще сделать ничего не могут.