fk0, легенда (19.02.2013 18:49, просмотров: 304) ответил fk0 на В продолжение темы. Разрыв шаблонов.
Действительно, это легко увидеть на примере GCC на PC, вещи вроде while (variable); и затем доступ к каким-либо другим переменным ("защищённым" volatile variable) могут не работать, в том смысле, что компилятор "защищённые" переменные мог заранее набрать в регистры, например, особенно если к ним ранее было обращение, либо вовсе вычислить (!!!) на этапе компиляции. Отсюда, видимо, и совет объявлять volatile переменные в разделяемой (между задачами, например) памяти (не работающий, как показал автор статьи). Просто на такие вещи мало натыкаются пока современные компиляторы недостаточно хорошо оптимизируют. Кстати автор зря приплёл sequence points языка C (легко убедиться, они влияют только на "побочные эффекты", как и обещано, а не гарантируют ничего относительно доступа к памяти). И вызов функции может не быть барьером, GCC запросто инлайнит глобальные функции (из того же модуля). В общем для себя вынес две вещи -- вместо volatile переменной в *.h можно просто написать *(volatile typeof(variable)*)&variable именно там где нужно, и нужна какая-то форма memory barrier для каждого конкретного компилятора. С последним не совсем ясно (после ссылки на mikrocontroller.net) как это вообще делать-то.
[ZX]