-
- На моей практике просмотра компиляции Сишного кода (уже лет 8) всегда была ситуация, что при единственном использовании глобальной переменной (volatile не может быть локальной, это бессмыссленно) в вызываемой функции считывалось значение именно из VVB_(412 знак., 04.05.2010 12:12, )
- В начальном посте чётко сказано, что переменные изменяются в обработчике прерывания, а используются вне. Чтобы в коде фона оптимизатор не
покалечилзаменил обращения к этим переменнымконстантамикопиями, необходимо указывать volatile. - Vit(04.05.2010 12:58)- Начальный пост был примерно таков, как я понял из описания: VVB_(392 знак., 04.05.2010 13:12, )
- Я готов согласиться, что если volatile-переменная используется вне прерывания один раз, то все будет работать. Одна проблема - я НЕ ХОЧУ считать количество обращений к этой переменной. Достаточно сложный проект, есть над чем думать и без этого. Правило Vladimir Ljaschko(51 знак., 04.05.2010 13:43)
- В моей жизни пока не было случая, чтобы предполагалось, что переменная, изменяемая в прерывании, может измениться в последовательной цепочки обработки внутри какой-то функции. Как правило (в моих проектах), при входе в функцию надо один раз узнать VVB_(549 знак., 04.05.2010 13:58, )
- Мой случай Vladimir Ljaschko(538 знак., 04.05.2010 14:12)
- Ну и применительно к Вашему примеру наиболее безопасно будет при входе в функцию, расчитывающую усреднение (или перед операцией деления) запретить прерывания, создать локальные копии, снова разрешить прерывания, выполнить деление. Это из-за того, что за VVB_(211 знак., 04.05.2010 14:12, )
- Кроме случая, когда команды "прочитать переменные a,b и разделить" выполняются атомарно. Но это экзотика. - VVB_(04.05.2010 14:15, )
- В моей жизни пока не было случая, чтобы предполагалось, что переменная, изменяемая в прерывании, может измениться в последовательной цепочки обработки внутри какой-то функции. Как правило (в моих проектах), при входе в функцию надо один раз узнать VVB_(549 знак., 04.05.2010 13:58, )
- Плохой пример из-за возможного деления на ноль и лишней функции Vit(103 знак., 04.05.2010 13:19)
- Это очевидно. Я лишь показал идеологию использования переменных. - VVB_(04.05.2010 13:42, )
- Мне очевидно то, что Ваше утверждение об отсутствии необходимости в volatile у топикстартера, неверно. А Ваш опыт и некая идеология какие-то особенные. (не сочтите за грубость, плз) - Vit(04.05.2010 13:55)
- Если переменная используется только пару раз, то volatile ни на что не влияет, если больше, то есть риск. Ну и спрашивается, нафига вся эта головная боль? Чего ради? - =AlexD=(04.05.2010 13:47)
- Это очевидно. Я лишь показал идеологию использования переменных. - VVB_(04.05.2010 13:42, )
- Тело Count() должно быть таким (не смогу откорректировать пост): VVB_(54 знак., 04.05.2010 13:14, )
- И забыл </c> написать :-) - VVB_(04.05.2010 13:15, )
- Зарегистрированные пользователи могут редактировать сообщения. - =AlexD=(04.05.2010 13:25)
- И забыл </c> написать :-) - VVB_(04.05.2010 13:15, )
- Я готов согласиться, что если volatile-переменная используется вне прерывания один раз, то все будет работать. Одна проблема - я НЕ ХОЧУ считать количество обращений к этой переменной. Достаточно сложный проект, есть над чем думать и без этого. Правило Vladimir Ljaschko(51 знак., 04.05.2010 13:43)
- Начальный пост был примерно таков, как я понял из описания: VVB_(392 знак., 04.05.2010 13:12, )
- При оптимизации созданная копия может быть исключена. Походите в отладчике по оптимизированному коду - многих временных переменных просто нет. - Vladimir Ljaschko(04.05.2010 12:54)
- Чуть ошибся веткой. Это ответ для Сергей Борщ (извиняюсь, не знаю как фамилия склоняется). - VVB_(04.05.2010 12:18, )
- В начальном посте чётко сказано, что переменные изменяются в обработчике прерывания, а используются вне. Чтобы в коде фона оптимизатор не
- Объясните, почему? Мне необходимость очевидна. - Cepгeй Бopщ(30.04.2010 18:39 - 18:42)
- Попробуйте придумать, какая оптимизация нарушит логику этой программы при отсустствии volatile. Мне не удалось. Если нужно формальное обоснование со ссылками на стандарт, то это времени требует... - SciFi(30.04.2010 20:41)
- Обе переменные изменяются в прерывании, обрабатываются снаружи, это по-вашему не является необходимостью? Например, когда нужно дождаться определенного значения счетчика, чтобы после этого посчитать усредненное значение. - rezident(30.04.2010 20:46)
- Здесь ключевое слово "дождаться". При однократном доступе volatile не нужен, IMHO. - SciFi(30.04.2010 20:51)
- А если дожидаемся в цикле? Это же типовой пример необходимости применения volatile. - rezident(30.04.2010 20:52)
- Я о том же. А вот если цикла нет, то не надо спешить добавлять volatile, даже если переменная изменяется в прерывании. - SciFi(30.04.2010 20:55)
- Volatile здесь нужен, хотя бы для предотвращения ошибок при модификации программы. А чем volatile мешает? - Лeoнид Ивaнoвич(30.04.2010 21:22)
- Губит оптимизацию. Ну а если оставлять лишний volatile, то нужно в комментарии так и сказать "оно не надо, но на всякий случай оставлено". - SciFi(30.04.2010 22:02)
- Оптимизацию всегда можно "включить" просто скопировав содержимое волятильной переменной во временную для локальных вычислений, более того, это гораздо безопасней, понятней и удобнее чем ваш набор граблей. - =AlexD=(30.04.2010 22:07)
- А по-вашему оптимизация важнее/значимее корректности работы программы? О_о - rezident(30.04.2010 22:06)
- Всё можно довести до абсурда. Давайте каждую переменную объявлять как volatile. Или оптимизацию оставлять на уровне 0. - SciFi(01.05.2010 00:36)
- Вот и не доводите до абсурда. - =AlexD=(01.05.2010 09:20)
- Всё можно довести до абсурда. Давайте каждую переменную объявлять как volatile. Или оптимизацию оставлять на уровне 0. - SciFi(01.05.2010 00:36)
- Губит оптимизацию. Ну а если оставлять лишний volatile, то нужно в комментарии так и сказать "оно не надо, но на всякий случай оставлено". - SciFi(30.04.2010 22:02)
- Volatile здесь нужен, хотя бы для предотвращения ошибок при модификации программы. А чем volatile мешает? - Лeoнид Ивaнoвич(30.04.2010 21:22)
- Я о том же. А вот если цикла нет, то не надо спешить добавлять volatile, даже если переменная изменяется в прерывании. - SciFi(30.04.2010 20:55)
- А если дожидаемся в цикле? Это же типовой пример необходимости применения volatile. - rezident(30.04.2010 20:52)
- Здесь ключевое слово "дождаться". При однократном доступе volatile не нужен, IMHO. - SciFi(30.04.2010 20:51)
- Обе переменные изменяются в прерывании, обрабатываются снаружи, это по-вашему не является необходимостью? Например, когда нужно дождаться определенного значения счетчика, чтобы после этого посчитать усредненное значение. - rezident(30.04.2010 20:46)
- Попробуйте придумать, какая оптимизация нарушит логику этой программы при отсустствии volatile. Мне не удалось. Если нужно формальное обоснование со ссылками на стандарт, то это времени требует... - SciFi(30.04.2010 20:41)
- Согласен. Я бы там volatile не ставил. А вот прерывание запретил бы на время. - SciFi(30.04.2010 17:10)
- Судя по тому, что размер кода не меняется, это правда. Осталось понять почему. - Vladimir Ljaschko(30.04.2010 13:43)
- Потому что в данном конкретном случае компилятор не смог заоптимизировать ваш расчет так, чтобы закешировать переменную в регистре и исключить обращение к памяти. В следующей версии он может стать умнее и без volatile программа перестанет работать. - Cepгeй Бopщ(30.04.2010 18:51)
- Скорее всего переменные Глобальные !? вот именно по этому ! volatile нужен в том случае когда например В прерывании взводится флажок а в фоне в цикле while() он проверяется. в этом случае компилятор может создать след конструкцию. Сначала один раз =MIV=(111 знак., 30.04.2010 13:53, )
- volatile - "изменчивая" во времени - употребляется для указания типа доступа "всегда обращаться". В явном виде это относится к портам и счётчикам/таймерам. Доступ к переменным без модификатора volatile оптимизатор может организовать по своему Vit(53 знак., 30.04.2010 19:02)
- Разве глобальность переменных однозначно исключает ситуацию с регистром? Конечно, проект большой, больше вероятность, что регистров просто не хватит :) Но я не хотел бы оценивать необходимость volatile по размеру проекта. - Vladimir Ljaschko(30.04.2010 14:17)
- Как раз нет ! Не исключает. - =MIV=(30.04.2010 14:43, )
- На моей практике просмотра компиляции Сишного кода (уже лет 8) всегда была ситуация, что при единственном использовании глобальной переменной (volatile не может быть локальной, это бессмыссленно) в вызываемой функции считывалось значение именно из VVB_(412 знак., 04.05.2010 12:12, )