-
- Хорошая мысль. К ней бы еще печать, подпись, протокол ;-) - 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)