-
- Пришел погромистъ следующего поколения и повыбивал все костыли :-) Ставь volatile всегда и везде - никаких исключений!!! И твоя программа будет работать надежно как танк :-) - il-2(09.06.2021 06:21, youtube)
- volatile не нужно только тогда, когда значение объекта полностью
под контролем текущего процесса в контексте текущей страницы
исходного кода. Если значение может изменяться неожиданно для
процесса (как ниже заметили - DMA, прерывания, регистр периферии),
то, в таком случае, для гарантии предсказуемости поведения кода,
требуется модификатор volatile. Если старые компиляторы могли
подразумевать необходимость принудительного чтения значения по
указателю, то у современных, за Nikolay_Po(946 знак., 08.06.2021 14:19)
- Ну в том то и вопрос, как гарантировано определить, что для
компилятора " текущий процесс", и "контекст текущей страницы
исходного кода". - misyachniy(08.06.2021 14:35)
- Буквально. DMA-модуль микроконтроллера тоже компилятор скомпилировал? Похоже, вы не понимаете, как работает код, который вы пытаетесь "улучшить". В противном случае вам было бы ясно, может измениться значение или нет. Ещё раз: если память, где находится массив, может быть изменена в прерывании или аппаратно (DMA), то код, в котором идёт обращение к этим данным, этого не знает. Компиляторы пока не отслеживают прерываний. И, без модификатора volatile, не станут писать в Nikolay_Po(1062 знак., 08.06.2021 14:48)
- Ну в том то и вопрос, как гарантировано определить, что для
компилятора " текущий процесс", и "контекст текущей страницы
исходного кода". - misyachniy(08.06.2021 14:35)
- И да, на всякий случай, и volatile не гарантирует целостность
данных =))) то есть можно для двухбайтового int получить первый
байт от одного цикла, а второй - от другого =))) конечно, смотря
какой процессор и каким младшим минимальным размером данных
оперирует... - sav6622(08.06.2021 13:13)
- Волотиле гарантирует, что эту переменную и всё, что с ней связано
компилятор не выкинет нах, при оптимизаццыи. - mse homjak(08.06.2021 13:19)
- Но не гарантирует, что переменная будет обновляться в кеше. Так что
атомики лучше - lloyd(08.06.2021 15:22)
- ПМСМ, atomic - это дополнение к volatile, но не замена. Nikolay_Po(455 знак., 08.06.2021 16:59)
- Но не гарантирует, что переменная будет обновляться в кеше. Так что
атомики лучше - lloyd(08.06.2021 15:22)
- Волотиле гарантирует, что эту переменную и всё, что с ней связано
компилятор не выкинет нах, при оптимизаццыи. - mse homjak(08.06.2021 13:19)
- Компилятор имеет право не перечитывать переменную по указателю. SciFi(416 знак., 08.06.2021 13:00)
- Кстати, поправочка, плохо я правило сформулировал. Например,
рассмотрим схему уарт — прерывания — кольцевой буфер на отправку —
указатели на голову и хвост кольцевого буфера. Указатель на голову
не меняется в прерывании, как и буфер на отправку. Но оба должны
быть volatile, чтобы компилятор не имел права поменять местами
запись в буфер и в указатель, иначе прерывание обработает отправку
неправильно. SciFi(181 знак., 08.06.2021 13:29)
- Никогда такого не наблюдал, хотя в каждом первом проекте VLLV(129 знак., 08.06.2021 16:38)
- Я наблюдал. Но это неточно :-) - SciFi(08.06.2021 16:39)
- Никогда такого не наблюдал, хотя в каждом первом проекте VLLV(129 знак., 08.06.2021 16:38)
- Чепуха. Всегда объявлял массивы приема передачи как обычные, ни
разу не было проблем с чтением переменных из массивов. Для IAR ARM.
Значит есть скрытое знание ;-) - misyachniy(08.06.2021 13:01)
- volatile нужно только для одиночных переменных типа int qaz; yuri_t2(51 знак., 08.06.2021 14:33,
)
- Нет. - SciFi(08.06.2021 15:03)
- Вот ссылка: yuri_t2(490 знак., 08.06.2021 22:51,
, ссылка)
- Там какая-то пурга написана. Не читайте всякую чушь, обращайтесь к
первоисточникам. - SciFi(09.06.2021 07:29)
- Может хватить балаболить? Выкладывайте первоисточники. - misyachniy(09.06.2021 08:12)
- А я не выложил? Прошу пардону >>> - SciFi(09.06.2021 08:16, ссылка)
- Может хватить балаболить? Выкладывайте первоисточники. - misyachniy(09.06.2021 08:12)
- Спасибо за ссылку. Всё же, как я читаю, это пояснение не говорит об отсутствии необходимости в модификаторе, а лишь уточняет, что наличие volatile не гарантирует атомарности доступа. - Nikolay_Po(09.06.2021 00:09)
- Там какая-то пурга написана. Не читайте всякую чушь, обращайтесь к
первоисточникам. - SciFi(09.06.2021 07:29)
- Типа баба Яга против? - misyachniy(08.06.2021 15:12)
- Нет в смысле "неправда". - SciFi(08.06.2021 15:13)
- Вот ссылка: yuri_t2(490 знак., 08.06.2021 22:51,
- Ммм... А где такое оговорено? В инструкции компилятора? Тоже где-то
попадалось, но, по-моему, справедливо только для старых
компиляторов. Современные уже оптимизируют работу с указателями,
структурами и массивами, поэтому можно "попасть". - Nikolay_Po(08.06.2021 14:51)
- А где такое оговорено "Современные уже оптимизируют работу с
указателями, структурами и массивами" и как определить по дате? Мой
2003 года выпуска. ;-) - misyachniy(08.06.2021 15:10)
- До появления link time optimization - старые. - Nikolay_Po(08.06.2021 16:52)
- А где такое оговорено "Современные уже оптимизируют работу с
указателями, структурами и массивами" и как определить по дате? Мой
2003 года выпуска. ;-) - misyachniy(08.06.2021 15:10)
- Нет. - SciFi(08.06.2021 15:03)
- Выходил победителем в русской рулетке? Везунчик, наверное :-) - SciFi(08.06.2021 13:03)
- Может просто оптимизацию отключал? Тогда это русская рулетка без патронов. - Andreas(08.06.2021 13:13)
- Я играю только с револьвером, с макаровым, говорят дела похуже
будут. - misyachniy(08.06.2021 13:04)
- С макаровым - это лига "чемпион чемпионов" специальной олимпиады. - Evgeny_CD(08.06.2021 13:12)
- volatile нужно только для одиночных переменных типа int qaz; yuri_t2(51 знак., 08.06.2021 14:33,
- Кстати, поправочка, плохо я правило сформулировал. Например,
рассмотрим схему уарт — прерывания — кольцевой буфер на отправку —
указатели на голову и хвост кольцевого буфера. Указатель на голову
не меняется в прерывании, как и буфер на отправку. Но оба должны
быть volatile, чтобы компилятор не имел права поменять местами
запись в буфер и в указатель, иначе прерывание обработает отправку
неправильно. SciFi(181 знак., 08.06.2021 13:29)
- Если "взор" компилятора не увидит перезагрузки/модификации
указателя в данном текущем блоке компиляции, то и перечитывать его
значение не будет. Ему, как и программисту, тоже лень лишнюю работу
делать :) - rezident(08.06.2021 12:58)
- Хорошая мысль. К ней бы еще печать, подпись, протокол ;-) - misyachniy(08.06.2021 13:02)
- Все есть в стандарте. Компилятор отслеживает изменения, сделанные
через указатели. Это в некоторых случаях дает некоторый излишний
код. Но для таких крохоборов как ты в стандарте C99 придумали
ключевое слово __restrict. Причем его мало кто использует, а вот в
библиотечных функциях (memcpy и пр.) оно встречается повсеместно.
Но лично для тебя я советую повсеместно использовать volatile,
чтобы не попасть впросак. votatile даст стопудов
ыйо рабочий код :-) - il-2(09.06.2021 06:34)- Можно просто оптимизацию не включать. - SciFi(09.06.2021 07:27)
- Проведите простой эксперимент: сделайте глобальную замену в тексте
volatile на Volatile во всех местах, где хотите оптимизации и перед
первым Volatile напишите что-то Boвa(120 знак., 08.06.2021 17:42)
- #define true false - lloyd(09.06.2021 06:58)
- Программирование по Оруэллу: SciFi(66 знак., 09.06.2021 07:27)
- #define const /*Нет в мире постоянства ибо всё тленно*/ - Boвa(09.06.2021 09:37)
- Программирование по Оруэллу: SciFi(66 знак., 09.06.2021 07:27)
- #define true false - lloyd(09.06.2021 06:58)
- Если у вас есть своя точка зрения на это явление, то зачем
спрашиваете? Попробуйте договориться напрямую с компилятором, без
посредников-толкователей :-P - rezident(08.06.2021 13:05)
- RTFM misyachniy(862 знак., 08.06.2021 13:43)
- Ну-ну, надейтесь. Только учтите, что компилятор может знать
содержимое памяти на которую указывает указатель и подставлять
непосредственно его (содержимого памяти) значение. - rezident(08.06.2021 13:58)
- У меня более 20 тысяч переменных по указатель. - misyachniy(08.06.2021 14:08)
- И чо? Был как-то раз случАй - бы выделен сегмент Flash для
перезаписи настроек объемом 2К, объявленный как const и имеющий
инициализацию конкретными значениями. Дык без указания volatile
компилятор, сцука такая, подставлял в выражения значения констант,
известные ему на момент компиляции, совершенно пилюя на то, что эти
константы могли быть модифицированы по связи во время работы
программы. Так что задача кодера - объяснится с компилятором так,
шоб ему стало понято, шо вы от rezident(16 знак., 08.06.2021 14:37)
- +1 точно такой-же случай :-) Причем код был рабочий до тех пор, пока не перескочили на новую версию Keil с более новой версией компилятора - il-2(09.06.2021 06:27)
- +1 Тоже вляпался, причем не сразу. Добавил в структуру во флеше еще одну переменную и компилятор решил оптимизировать. Поэтому не сразу и нашел в чем дело. - Andreas(08.06.2021 15:03)
- +1. Сейчас не упомню, но, вроде, пришлось использовать volatile
const. - Nikolay_Po(08.06.2021 14:52)
- Та я тоже всех подробностей не упомню, т.к. лет 7 уже "не брал в руки шашек". Да и ваще я не программист :) - rezident(08.06.2021 15:10)
- И чо? Был как-то раз случАй - бы выделен сегмент Flash для
перезаписи настроек объемом 2К, объявленный как const и имеющий
инициализацию конкретными значениями. Дык без указания volatile
компилятор, сцука такая, подставлял в выражения значения констант,
известные ему на момент компиляции, совершенно пилюя на то, что эти
константы могли быть модифицированы по связи во время работы
программы. Так что задача кодера - объяснится с компилятором так,
шоб ему стало понято, шо вы от rezident(16 знак., 08.06.2021 14:37)
- У меня более 20 тысяч переменных по указатель. - misyachniy(08.06.2021 14:08)
- в случае с DMA ещё больше плохих новостей для процов с кэшем - надо
сбрасывать линии кэша повязанные на адреса в которые DMA гадит. - Mahagam(08.06.2021 13:51)
- Кеша в процессоре нет. - misyachniy(08.06.2021 13:57)
- Бывают когерентные кеши. В которых измененные данные
инвалидизируются железом. - Evgeny_CD(08.06.2021 13:54)
- Это между кешами разных процессоров бывает делают специальный
аппаратный протокол когерентности, но про ДМА я ничего такого не
читал, там проще программно отследить и сбросить линии - =AlexD=(08.06.2021 14:24, ссылка)
- не то что "бывает", а жёстко есть. иначе винда на многоядерном
проце бы не встала. - Mahagam(08.06.2021 14:37)
- Бывает - это значит что не везде есть в контексте микроконтроллеров
для встраиваемых систем. - =AlexD=(08.06.2021 14:41)
- в таком контексте да. - Mahagam(08.06.2021 14:58)
- Бывает - это значит что не везде есть в контексте микроконтроллеров
для встраиваемых систем. - =AlexD=(08.06.2021 14:41)
- не то что "бывает", а жёстко есть. иначе винда на многоядерном
проце бы не встала. - Mahagam(08.06.2021 14:37)
- хм. про такие связи между контроллерами кэшей я знаю только в контексте x86 и винды. когерентность кэшей между ядрами одного проца и даже между процами - условие выживания винды. а чтобы какой-нить DMA контроллер, кроме того что он по внутренней шине гоняет данные, ещё бы и тыкал в кэш палочкой "сброс вон ту строчку" - не слышал. по крайней мере в тем простых МК которые годны для всяких там фриртосов. но согласен, такое должно быть. - Mahagam(08.06.2021 14:00)
- Это между кешами разных процессоров бывает делают специальный
аппаратный протокол когерентности, но про ДМА я ничего такого не
читал, там проще программно отследить и сбросить линии - =AlexD=(08.06.2021 14:24, ссылка)
- В общем случае на это нельзя рассчитывать. Но валяйте, жизнь скучна без риска. - SciFi(08.06.2021 13:46)
- Ну-ну, надейтесь. Только учтите, что компилятор может знать
содержимое памяти на которую указывает указатель и подставлять
непосредственно его (содержимого памяти) значение. - rezident(08.06.2021 13:58)
- Это как? Взятку ему дать штоле? :-) - SciFi(08.06.2021 13:07)
- RTFM misyachniy(862 знак., 08.06.2021 13:43)
- Все есть в стандарте. Компилятор отслеживает изменения, сделанные
через указатели. Это в некоторых случаях дает некоторый излишний
код. Но для таких крохоборов как ты в стандарте C99 придумали
ключевое слово __restrict. Причем его мало кто использует, а вот в
библиотечных функциях (memcpy и пр.) оно встречается повсеместно.
Но лично для тебя я советую повсеместно использовать volatile,
чтобы не попасть впросак. votatile даст стопудов
- Хорошая мысль. К ней бы еще печать, подпись, протокол ;-) - misyachniy(08.06.2021 13:02)