-
- Тут проще можно.. Рэйлвэй Каген(470 знак., 30.04.2010 20:57)
- Это к атомарности доступа к переменным относится, а не к признаку "изменчивости" их. - rezident(30.04.2010 21:50)
- а нынешние компилеры поддерживают что-то типа gcc-шного asm volatile ("":::"memory") , чтобы задать порядок обращений? ыыыы(21 знак., 30.04.2010 19:04, )
- Современные компиляторы все ближе к стандарту стараются делать. - rezident(30.04.2010 20:03)
- Очень просто. Чтение volatile-переменных может иметь побочные эффекты. Cepгeй Бopщ(666 знак., 30.04.2010 18:49)
- Угу, понял. Но формально временная переменная - это лишняя операция. Хотя, по идее, можно рассчитывать на то, что компилятор соптимизирует эту временную переменную, фактически учтет в последовательности чтения переменных, т.е. жертвы будут минимальны. - Vladimir Ljaschko(30.04.2010 18:57)
- соптимизирует, не бойтесь, особенно если Вы минимизируете область видимости переменной koyodza(145 знак., 30.04.2010 21:02)
- Угу, понял. Но формально временная переменная - это лишняя операция. Хотя, по идее, можно рассчитывать на то, что компилятор соптимизирует эту временную переменную, фактически учтет в последовательности чтения переменных, т.е. жертвы будут минимальны. - Vladimir Ljaschko(30.04.2010 18:57)
- Да всё так делаешь ! Просто IAR тебя предупреждает о том что не определён порядок доступа к этим переменным, т.е. ему не сказано что раньше из RAM вытаскивать переменную A или переменную B, и если это для алгоритма не критично то на этот warning можно =MIV=(64 знак., 30.04.2010 13:43, )
- Для описанного случая не видно необходимости использовать модификатор volatile - VVB_(30.04.2010 13:17, )
- На моей практике просмотра компиляции Сишного кода (уже лет 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, )
- Не факт, должны быть volatile только если снаружи они проверяются в цикле, в одной функции (чтоб компилятор каждый раз проверял, а не оптимизировал этот процесс). Кроме того, если доступ к переменной не атомарный -- НУЖНЫ КРИТИЧЕСКИЕ СЕКЦИИ для чтения и fk0(41 знак., 30.04.2010 12:59)
- Ребят, про критические секции я помню с до-сишных времен 8080. - Vladimir Ljaschko(30.04.2010 13:09)
- Volatile для компилятора - чтобы не пытался заоптимизировать че-нить. А вот за целостностью этой переменной надо уже "ручками" следить, если она бОльшей разрядности, чем может обработать процессор "за один присест". О чем вероятно и предупреждает Гудвин(95 знак., 30.04.2010 12:28)
- не, он предупреждает о том, что в выражении использована более чем одна volatile переменная, и непонятно в каком порядке их вычитывать. Чуть ниже об этом уже написали. А атомарный доступ к переменным тут ни при чём - koyodza(30.04.2010 12:41)
- Тем не менее, volatile не обеспечивает атомарности доступа. А это ничем не лучше, чем неправильный порядок вычитывания переменных. - Лeoнид Ивaнoвич(30.04.2010 12:48)
- volatile только показывает, что "здесь и сейчас" нужно эту переменную вычитать из памяти (или записать). А в выражении a = b + c порядок вычитывания b и с не определён, вот и получается предупреждение koyodza(75 знак., 30.04.2010 12:56)
- Это довольно распространенное заблуждение, что volatile гарантирует атомарность. Поэтому не лишним будет еще раз напомнить :) - Лeoнид Ивaнoвич(30.04.2010 13:12)
- "volatile гарантирует атомарность" Хм ! странно, неужели кто-то так думает ? :) - =MIV=(30.04.2010 13:46, )
- Да тут совсем недавно (в рамках последних пяти лет) был грозный пост, что, оказывается, атомарность нужно обеспечивать ручками, volatile не хватает :) - Лeoнид Ивaнoвич(30.04.2010 13:59)
- Ну если не хватает volatile :) тада да ручками :) - =MIV=(30.04.2010 14:44, )
- Да тут совсем недавно (в рамках последних пяти лет) был грозный пост, что, оказывается, атомарность нужно обеспечивать ручками, volatile не хватает :) - Лeoнид Ивaнoвич(30.04.2010 13:59)
- да вроде человек говорит, что помнит - koyodza(30.04.2010 13:19, ссылка)
- "volatile гарантирует атомарность" Хм ! странно, неужели кто-то так думает ? :) - =MIV=(30.04.2010 13:46, )
- Это довольно распространенное заблуждение, что volatile гарантирует атомарность. Поэтому не лишним будет еще раз напомнить :) - Лeoнид Ивaнoвич(30.04.2010 13:12)
- volatile только показывает, что "здесь и сейчас" нужно эту переменную вычитать из памяти (или записать). А в выражении a = b + c порядок вычитывания b и с не определён, вот и получается предупреждение koyodza(75 знак., 30.04.2010 12:56)
- Тем не менее, volatile не обеспечивает атомарности доступа. А это ничем не лучше, чем неправильный порядок вычитывания переменных. - Лeoнид Ивaнoвич(30.04.2010 12:48)
- не, он предупреждает о том, что в выражении использована более чем одна volatile переменная, и непонятно в каком порядке их вычитывать. Чуть ниже об этом уже написали. А атомарный доступ к переменным тут ни при чём - koyodza(30.04.2010 12:41)
- Все так. Чтобы избавиться от сообщения простое правило - в одной формуле не более 1-й volatile переменной. Достигается вводом временных промежуточных переменных. - Михаил Е.(30.04.2010 12:22 - 12:25)
- ОК. Что ж, будем строки наращивать... Пусть платят. - Vladimir Ljaschko(30.04.2010 12:46)
- Тут проще можно.. Рэйлвэй Каген(470 знак., 30.04.2010 20:57)