-
- Нашел... Я тотальный косяк. Короче. Объявил константу, адрес
которой писал в ДМА, как локальную - прямо перед строкой
инициализации адреса памяти в ДМА. Грешным делом полагал, что раз
это константа, то она все равно во флеше. Она и была во флеше,
только как то так, что ДМА в результате слала в периферию не 1, а
ноль.... - my504(21.08.2023 16:33)
- Там надо 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)
- Для начала проверить, что он стартует, если отладчиком туда
записать что надо. Может, банально тактирование на таймер не
подано. Или таймер неправильно сконфигурирован и не считает. - SciFi(21.08.2023 14:43)
- ЗЫ. Есть, правда, нюанс. Я использую на самом деле AT32, а в нем DMA flexible, то есть источники реквестов могут быть любыми на любом стриме. Но там все просто и другие стримы ДМА в таком режиме отлично работают... my504(94 знак., 21.08.2023 15:12)
- Не, с этим все ОК. Даже на лету пишу 1 в CR1 и он стартует. Контролирую TIM2CH2 прямо на ноге. Да и в окне среды видно когда тело таймера шевелится и 1 стоит в CR1. - my504(21.08.2023 14:47)
- Нашел... Я тотальный косяк. Короче. Объявил константу, адрес
которой писал в ДМА, как локальную - прямо перед строкой
инициализации адреса памяти в ДМА. Грешным делом полагал, что раз
это константа, то она все равно во флеше. Она и была во флеше,
только как то так, что ДМА в результате слала в периферию не 1, а
ноль.... - my504(21.08.2023 16:33)