-
- Там надо static. Без этого будет временная переменная в стеке. - SciFi(21.08.2023 16:38)
- Ага. Ещё рекомендую "volatile" добавить. Дескать, она изменчива, на
всякий случай перечитай из флеш заново. Но будет тормозить
исполнение доступом к памяти. - Nikolay_Po(21.08.2023 17:08)
- Компилерское volatile не должно влиять на растасовку по адресам, чем занимается линкер. Если работало в частном случае, значит где-то в скрипте или сам линкер чухал доп.атрибут и решал что надо быть отнести данный адреск к той или иной области, в данном случае FLASH. - RxTx(21.08.2023 18:48)
- Вредные советы. Читать из флеш будет DMA, и ему всё равно, напишете
volatile или нет. - SciFi(21.08.2023 17:10)
- Успех будет лишь в том случае, если адрес константы будет даден
правильный. А если вдруг компилятор решил (допустим, оптимизация на
скорость) оставить константу в ОЗУ? И даст контроллеру ПДП адрес из
ОЗУ, с которым тот не совладает? Volatile заставляет компилятор,
при обращении к константе, обращаться именно к флэш. А значит, и
адрес для ПДП будет взят и передан верный. - Nikolay_Po(21.08.2023 17:14)
- Это не так работает. В заповедях написано, что переменная static
живёт от начала работы программы и до конца. Если взят её адрес,
переменную нельзя выкидывать. Всё, больше там ничего нет. Вы просто
транслируете распространённые мифы. - SciFi(21.08.2023 17:18)
- ну, кстати, Николай интересные вещи говорит ) статик не означает, что переменная обязательно во флэше расположится - 0men(21.08.2023 17:29)
- Так компилятор и не выкинет переменную (константу), и адрес сохранит. Просто модифицирует адресную арифметику под ту область памяти, куда ему удобно эту константу положить. К примеру, GCC с -O3 -flto, может хранить константы в ОЗУ лишь потому, что для чтения ПЗУ нужна особая процедура, увеличивающая время выполнения кода (к примеру, в AVR). И я не мог заставить программу читать серийный номер прямо из ПЗУ, до тех пор, пока не объявил константу volatile. - Nikolay_Po(21.08.2023 17:25)
- Это не так работает. В заповедях написано, что переменная static
живёт от начала работы программы и до конца. Если взят её адрес,
переменную нельзя выкидывать. Всё, больше там ничего нет. Вы просто
транслируете распространённые мифы. - SciFi(21.08.2023 17:18)
- Успех будет лишь в том случае, если адрес константы будет даден
правильный. А если вдруг компилятор решил (допустим, оптимизация на
скорость) оставить константу в ОЗУ? И даст контроллеру ПДП адрес из
ОЗУ, с которым тот не совладает? Volatile заставляет компилятор,
при обращении к константе, обращаться именно к флэш. А значит, и
адрес для ПДП будет взят и передан верный. - Nikolay_Po(21.08.2023 17:14)
- Проверил еще раз. Нет, показалось. Адрес в ОЗУ. А если static, то во флеше. Спасибо. - my504(21.08.2023 16:50)
- Но у меня был const uint16_t startTMR2 = 0x1; И ее адрес был во флеше - он начинался с 0x0800.... - my504(21.08.2023 16:43)
- Ага. Ещё рекомендую "volatile" добавить. Дескать, она изменчива, на
всякий случай перечитай из флеш заново. Но будет тормозить
исполнение доступом к памяти. - Nikolay_Po(21.08.2023 17:08)
- Там надо static. Без этого будет временная переменная в стеке. - SciFi(21.08.2023 16:38)