-
- Эээ... Это хоку?! - IBAH(17.03.2016 15:06)
- "Паки, паки… иже херувимы!" - SciFi(18.03.2016 10:40)
- танки - Крок(17.03.2016 20:17)
- не... это танки-онлайн - IBAH(18.03.2016 08:15)
- практический ответ VL(380 знак., 17.03.2016 11:51, )
- Мое ИМХО - никакие глобальные переменные не следует объявлять через volatile. В местах, где нужна эта волатильность следует объявить через volatile локальную переменную и работать через нее. Как правило это - ожидание (поллинг) какого-либо флага, il-2(522 знак., 16.03.2016 16:17)
- Эээ.. а как локальная переменная может быть волатильна? Волатильность по определению изменяемость не только программой, если у область действия блок, как "не только программа" про переменную узнает (ДМА в расчет не берем) - IBAH(17.03.2016 15:13)
- К примеру, организовать задержку for( volatile uint8_t i=0; i<20; i++ ); без volatile компилятор оптимизирует цикл - 0men(17.03.2016 16:29)
- Ну и пускай оптимизирует, всё равно раз i снаружи недоступна. - Yft(18.03.2016 12:53)
- в некоторых случаях он этот цикл просто выкинет )) - 0men(18.03.2016 13:01)
- мне кажется что и с волитейтом оптимизирует, я бы на месте компилятора оптимизировал - IBAH(17.03.2016 16:55)
- Не, проверьте :) - 0men(17.03.2016 17:04)
- Не, с volatile не оптимизирует. - Apтём(17.03.2016 16:58)
- Ну и пускай оптимизирует, всё равно раз i снаружи недоступна. - Yft(18.03.2016 12:53)
- По стандарту - может. Зачем - отдельный вопрос, вон ниже тебе пример привели :-) - il-2(17.03.2016 16:23)
- если компилятор не ругается это не значит, что
это стандарттак можно и/или нужно делать - IBAH(17.03.2016 16:53)
- если компилятор не ругается это не значит, что
- А почему нет? Apтём(352 знак., 17.03.2016 15:22)
- Мосье знает толк в извращениях! - IBAH(17.03.2016 15:29)
- К примеру, организовать задержку for( volatile uint8_t i=0; i<20; i++ ); без volatile компилятор оптимизирует цикл - 0men(17.03.2016 16:29)
- А я всегда через преобразование типа указателя делал. Не поручусь, что соответствует стандарту, но вроде работает. йцукен(70 знак., 16.03.2016 19:22, )
- Походу, у тебя правильный подход, и в стандарте про это пишут: il-2(404 знак., 17.03.2016 12:28)
- Приведение типа всегда соответствует, и оно означает "пошли все нах, папка лучше знает". А если не знает, то это обезьяна с гранатой :-) - SciFi(16.03.2016 20:07)
- Какой ужасный говнокод. Будет работать через раз, в зависимости от того, как сложатся звёзды. Всё как раз наоборот: там, где хочется оптимизировать доступ к volatile переменной, создаётся её локальная копия (не volatile), и с ней ведётся работа. - SciFi(16.03.2016 16:23)
- Короче, из-за прогрессирующего склероза я написал вначале невесть что :-) Так действительно делать нельзя. Я уже лет 5 как программирую в основном под RTOS и за ненадобностью забыл про volatile :-). - il-2(17.03.2016 12:41)
- Хм, RTOS говорите... Apтём(239 знак., 17.03.2016 13:14)
- В общем, все оказалось как в анекдоте про сороконожку, когда ее вдруг спросили как она не путается в ногах когда ходит: il-2(923 знак., 17.03.2016 16:17)
- Правило тут такое, все, что меняется в прерывании и используется в фоне должно быть volatile - 0men(17.03.2016 16:21)
- Короче, все переменные, которые используются в двух потоках. Хотя, я бы подумал над исключениями, но сходу ничего в голову не приходит. - SciFi(17.03.2016 18:01)
- Правильнее сказать не в прерывании, а в разных потоках исполнения - разные задачи RTOS могут использовать общие переменные для взаимодействия. - Apтём(17.03.2016 16:29)
- согласен :) - 0men(17.03.2016 16:32)
- Правило тут такое, все, что меняется в прерывании и используется в фоне должно быть volatile - 0men(17.03.2016 16:21)
- Связался я с вами :-) Cейчас всю плешь на маковке себе прочешу :-) - il-2(17.03.2016 15:47)
- В общем, все оказалось как в анекдоте про сороконожку, когда ее вдруг спросили как она не путается в ногах когда ходит: il-2(923 знак., 17.03.2016 16:17)
- Хм, RTOS говорите... Apтём(239 знак., 17.03.2016 13:14)
- Блин. Что-то вы меня с Артемом озадачили... Чешу репу... - il-2(17.03.2016 11:41)
- Короче, из-за прогрессирующего склероза я написал вначале невесть что :-) Так действительно делать нельзя. Я уже лет 5 как программирую в основном под RTOS и за ненадобностью забыл про volatile :-). - il-2(17.03.2016 12:41)
- Оригинально... Apтём(119 знак., 16.03.2016 16:22)
- Эээ.. а как локальная переменная может быть волатильна? Волатильность по определению изменяемость не только программой, если у область действия блок, как "не только программа" про переменную узнает (ДМА в расчет не берем) - IBAH(17.03.2016 15:13)
- Вряд ли компилер сможет наоптимизировать массив. Потому не вижу смысла. - ASDFS(16.03.2016 15:15)
- Кажись, сообразил. Нужно их делать volatile, чтобы компилятор не поменял местами запись в FIFO и запись в указатель: SciFi(445 знак., 16.03.2016 15:38 - 15:49)
- Массив - чтобы компилятор не выкинул считывание из якобы пустого, голову - чтобы с хвостом нормально сравнивал. Это то, на что с иаром нарвался... Andreas(172 знак., 18.03.2016 09:48)
- это похоже на "функциональщину головного мозга" - IBAH(17.03.2016 15:21, ссылка)
- Зависит от... В общем случае volatile не является memory barrier'ом, ровно как и наоборот, явный memory barrier (__sync_syncrhronize() в gcc) может ничего никуда не записать, если без volatile. Вот страшненькая история по ссылкам. Могу добавить, fk0(200 знак., 17.03.2016 12:21 - 12:32, ссылка)
- Очевидно, этот gcc недоделанный. Кстати, в стандарте про барьеры ни слова. Как так? - SciFi(18.03.2016 13:26)
- Тебе вдогонку ещё баг. Операция txhead++ нихрена не атомарная на многих архитектурах: честный инкремент умеют только m68k, x86, z80 и прочее CISC старьё, да и там жди проблем если процессоров больше одного. На современных RISC это, как правило, fk0(343 знак., 17.03.2016 12:31)
- Тут атомарность по барабану. В более сложных случаях - хз, будет день - будет пища. - SciFi(17.03.2016 17:33)
- Не догоняю. a=2; b=2; c=a+b; может компилироваться как a=2; c=a+b; b=2; ? - VL(17.03.2016 12:07, )
- У тебя хреновый пример, ибо содержит подъ2,718бку. Но суть именно такова: компилятору не запрещено менять порядок действий. Никогда не видел штоле, как курсор скачет, когда идёшь по коду в отладчике на высоком уровне оптимизации? - SciFi(17.03.2016 18:07)
- Прыжки видел тыщу раз, потому что все проекты на высшей оптимизации. Но ни разу не видел ошибок из-за изменения порядка. Ты придумал хреновое объяснение для втыркивания volatile. - VL(17.03.2016 21:48, )
- Ошибок не было, должно быть, потому, что ты таки ставишь volatile там, где оно надо. Такшта норамальное объяснение, пеши исчо :-) - SciFi(18.03.2016 08:40)
- не могу понять - то ли доброе слово сказал, то ли нахрен послал :) Но тебя куда-то не туда несет - с разными строками проблем быть не может, компилятор разруливает это без всяких volatile. - VL(18.03.2016 11:10, )
- Нет, не так. Может переставлять, ему разрешено (если volatile там нет). Лень копаться в дизассемблере, чтобы пример привести. Вот тебе с просторов тырнета --> - SciFi(18.03.2016 11:23 - 11:27, ссылка)
- Угу, интересно. Только нужно здраво обозначить угрозу и простые способы решения. Флаги обновления обычно ставятся в прерываниях, в основном цикле будет пофиг, в какой последовательности что ставилось. Volatile нужен, чтобы вообще флаг прочитался. VL(185 знак., 18.03.2016 12:44, )
- Я уже утомился тебе что-либо доказывать. Доказывай сам :-) - SciFi(18.03.2016 12:49)
- Повторюсь, но и при наличии volatile операции в функции могут быть переставлены если результат на выходе функции такой же получается. - fk0(18.03.2016 11:24)
- Это уже сектантство какое-то. Откуда дровишки? Как компилятор может знать, что "результат такой же"? Может быть, чьи-то шаловливые ручки накрутили зависимостей снаружи неочевидным образом? - SciFi(18.03.2016 11:29)
- Ссылку я тебе уже давал. Не знаю какой стандарт об этом говорит, но синхронизация обращений к памяти производится далеко не всегда, а только при вызове функций и ещё когда-то. В теле функции синхронизации никто не обещает. Далее, стандарт C fk0(497 знак., 18.03.2016 13:04, ссылка)
- Ты рассказываешь про sequence points штоле? Коли так, имей в виду, они не только на входе в функцию, но и ещё в 100500 местах: SciFi(1103 знак., 18.03.2016 13:28)
- Ссылку я тебе уже давал. Не знаю какой стандарт об этом говорит, но синхронизация обращений к памяти производится далеко не всегда, а только при вызове функций и ещё когда-то. В теле функции синхронизации никто не обещает. Далее, стандарт C fk0(497 знак., 18.03.2016 13:04, ссылка)
- Это уже сектантство какое-то. Откуда дровишки? Как компилятор может знать, что "результат такой же"? Может быть, чьи-то шаловливые ручки накрутили зависимостей снаружи неочевидным образом? - SciFi(18.03.2016 11:29)
- Угу, интересно. Только нужно здраво обозначить угрозу и простые способы решения. Флаги обновления обычно ставятся в прерываниях, в основном цикле будет пофиг, в какой последовательности что ставилось. Volatile нужен, чтобы вообще флаг прочитался. VL(185 знак., 18.03.2016 12:44, )
- Нет, не так. Может переставлять, ему разрешено (если volatile там нет). Лень копаться в дизассемблере, чтобы пример привести. Вот тебе с просторов тырнета --> - SciFi(18.03.2016 11:23 - 11:27, ссылка)
- не могу понять - то ли доброе слово сказал, то ли нахрен послал :) Но тебя куда-то не туда несет - с разными строками проблем быть не может, компилятор разруливает это без всяких volatile. - VL(18.03.2016 11:10, )
- Ошибок не было, должно быть, потому, что ты таки ставишь volatile там, где оно надо. Такшта норамальное объяснение, пеши исчо :-) - SciFi(18.03.2016 08:40)
- Прыжки видел тыщу раз, потому что все проекты на высшей оптимизации. Но ни разу не видел ошибок из-за изменения порядка. Ты придумал хреновое объяснение для втыркивания volatile. - VL(17.03.2016 21:48, )
- Ваащета НОРМАЛЬНЫЙ компилятор обязан ЭТО скомпилировать в a=2; b=2; c=4; :)) - MBedder(17.03.2016 12:13)
- Ага, щас. Если ни одна переменная не используется, скомпилируется в пустой код. - SciFi(17.03.2016 17:37)
- У тебя хреновый пример, ибо содержит подъ2,718бку. Но суть именно такова: компилятору не запрещено менять порядок действий. Никогда не видел штоле, как курсор скачет, когда идёшь по коду в отладчике на высоком уровне оптимизации? - SciFi(17.03.2016 18:07)
- Иар уже побеспокоился за индусов:) Если и массив и указатель volatile и меняются в одной строке то будет предупреждение>>> - 1111111(16.03.2016 16:16, ссылка)
- Знаю я эту фишку. Жутко раздражает, когда не по делу, то есть в 95% случаев :-) - SciFi(16.03.2016 16:28)
- #pragma diag_suppress=Pa082 спасет отца русской демократии. Я отключил, реально опасных случаев немного и они известны еще на этапе продумывания алгоритма - 1111111(16.03.2016 16:37)
- Iar, етить. Иначе задолбает... Гудвин(212 знак., 16.03.2016 16:48)
- #pragma diag_suppress=Pa082 спасет отца русской демократии. Я отключил, реально опасных случаев немного и они известны еще на этапе продумывания алгоритма - 1111111(16.03.2016 16:37)
- Знаю я эту фишку. Жутко раздражает, когда не по делу, то есть в 95% случаев :-) - SciFi(16.03.2016 16:28)
- А по сути? Не уходите от вопроса. Как насчёт указателя на голову этого FIFO? Он в обработчике прерывания не меняется, как и тот массив. - SciFi(16.03.2016 15:28)
- Кажись, сообразил. Нужно их делать volatile, чтобы компилятор не поменял местами запись в FIFO и запись в указатель: SciFi(445 знак., 16.03.2016 15:38 - 15:49)
- Эээ... Это хоку?! - IBAH(17.03.2016 15:06)