|
Keil. __main обнуляет переменные в Backup SRAM, как не дать ему этого делать? |
|
|
|
Apr 3 2015, 16:20
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Жил-был проект, функция SystemInit была самодельная, задавала частоту PLL и от нее частоты шин. Дальше выполнялась __main, задавала переменные, и переходила к Main. Решил я добавить в SystemInit инициализацию FSMC (контроллера внешней памяти). Не могу вспомнить, зачем. Вроде, что-то не инициализировалось. [Кстати, стандартная SystemInit тоже так делает.] Заодно и всю остальную периферию инициализировал. До выполнения __main. И теперь эта __main очищает мои переменные, отвечающие за режимы работы прибора, лежащие во внутренней Backup SRAM. Предполагаю, что раньше она просто не могла добраться до этих переменных. Что наблюдаю в отладчике: Жму Reset - переменные заполнены абракадаброй, но это не настоящее их содержимое, просто доступа нет. После выполнения SystemInit читается их реальное значение, бывшее до сброса. После выполнения __main все эти переменные обнуляются! Вопрос - что, так и должно быть? И раньше не обнулялись переменные только оттого, что __main не могла до них добраться? В исходниках переменные описаны с атрибутами, в скаттере секции описаны, переменные положены, куда положено (  )... Типа, вот так: volatile uint32_t Signature __attribute((section("backup"))); RW_IRAM2 0x40024000 UNINIT 0x00001000 { ; Backup RAM Main.o (backup) } Да, имею вариант вернуться к прежней SystemInit. Но для чего-то мне же понадобилось инициализировать контроллер внешней памяти до __main... Как заставить Keil не инициализировать избранные глобальные переменные?
|
|
|
|
|
Apr 6 2015, 09:29
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(aaarrr @ Apr 6 2015, 11:59)  Надо разбираться, почему они получили атрибут RW вместо ZI. Если в map написано Код Execution Region RW_IRAM2 (Base: 0x40024000, Size: 0x00000040, Max: 0x00001000, ABSOLUTE, UNINIT) разве это не говорит, что инициализации быть не должно?
|
|
|
|
|
Apr 6 2015, 09:32
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Попробуйте это. Цитата(ViKo @ Apr 6 2015, 12:29)  Если в map написано Код Execution Region RW_IRAM2 (Base: 0x40024000, Size: 0x00000040, Max: 0x00001000, ABSOLUTE, UNINIT) разве это не говорит, что инициализации быть не должно? Не-инициализации подлежат только ZI-данные, но не RW.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|