реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Keil. __main обнуляет переменные в Backup SRAM, как не дать ему этого делать?
ViKo
сообщение Apr 3 2015, 16:20
Сообщение #1


Универсальный солдатик
******

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



Жил-был проект, функция SystemInit была самодельная, задавала частоту PLL и от нее частоты шин. Дальше выполнялась __main, задавала переменные, и переходила к Main.
Решил я добавить в SystemInit инициализацию FSMC (контроллера внешней памяти). Не могу вспомнить, зачем. Вроде, что-то не инициализировалось. [Кстати, стандартная SystemInit тоже так делает.] Заодно и всю остальную периферию инициализировал. До выполнения __main. И теперь эта __main очищает мои переменные, отвечающие за режимы работы прибора, лежащие во внутренней Backup SRAM. Предполагаю, что раньше она просто не могла добраться до этих переменных.
Что наблюдаю в отладчике: Жму Reset - переменные заполнены абракадаброй, но это не настоящее их содержимое, просто доступа нет. После выполнения SystemInit читается их реальное значение, бывшее до сброса. После выполнения __main все эти переменные обнуляются!
Вопрос - что, так и должно быть? И раньше не обнулялись переменные только оттого, что __main не могла до них добраться? В исходниках переменные описаны с атрибутами, в скаттере секции описаны, переменные положены, куда положено ( biggrin.gif )... Типа, вот так:
volatile uint32_t Signature __attribute((section("backup")));

RW_IRAM2 0x40024000 UNINIT 0x00001000 { ; Backup RAM
Main.o (backup)
}
Да, имею вариант вернуться к прежней SystemInit. Но для чего-то мне же понадобилось инициализировать контроллер внешней памяти до __main...

Как заставить Keil не инициализировать избранные глобальные переменные?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 07:38
Сообщение #2


Универсальный солдатик
******

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



Так и есть. Задал остановку МК при записи к переменной в BackupRAM. Увидел в __main очистку своих переменных:
Код
0x0800AB14 C808      LDM      r0!,{r3}
0x0800AB16 1F12      SUBS     r2,r2,#4
0x0800AB18 C108      STM      r1!,{r3}
0x0800AB1A 2A00      CMP      r2,#0x00
0x0800AB1C D1FA      BNE      0x0800AB14

Остановился при r1 = 0x40024008, r3 = 0, r2 = 0x38.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 07:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Странно, UNINIT у меня работал корректно. И это не очистка, а копирование.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 07:50
Сообщение #4


Универсальный солдатик
******

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



Цитата(aaarrr @ Apr 6 2015, 10:43) *
Странно, UNINIT у меня работал корректно. И это не очистка, а копирование.

Копирование. Нуля {r3}. rolleyes.gif По 4 байта.
У меня тоже работало. Или казалось, что работает. Пока не перенес инициализацию BackupRAM в SystemInit.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 07:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Apr 6 2015, 10:50) *
Копирование. Нуля. rolleyes.gif Побайтно.

Пословно sm.gif Ну а все же, куда R0 указывает?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 08:07
Сообщение #6


Универсальный солдатик
******

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



Цитата(aaarrr @ Apr 6 2015, 10:52) *
Пословно sm.gif Ну а все же, куда R0 указывает?

Да, пословно. R0 = 0x08016114, чисто данные во флэш. ~56 нулевых байтов. Вся моя управляющая структура, надо думать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 08:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Вот копирование меня и смущает: структура в Backup RAM по логике должна быть ZI, а не RW. Можете map-файл привести?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 08:21
Сообщение #8


Универсальный солдатик
******

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



Код
    Signature                                0x40024000   Data           4  siluet_main.o(backup)
    Ctrl                                     0x40024004   Data          44  siluet_main.o(backup)

Execution Region RW_IRAM2 (Base: 0x40024000, Size: 0x00000040, Max: 0x00001000, ABSOLUTE, UNINIT)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x40024000   0x00000004   Data   RW         3116    backup              siluet_main.o
    0x40024004   0x0000002c   Data   RW         3117    backup              siluet_main.o
    0x40024030   0x00000010   Data   RW         3118    backup              siluet_main.o

Я к этой структуре Ctrl обращаюсь постоянно в процессе работы, читаю, изменяю...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 08:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А как она объявлена, структура эта?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 08:53
Сообщение #10


Универсальный солдатик
******

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



Там структура из структур. Атрибут - только общий, секция. Может, no_init надо? ищу по документации на линкер. _DECL задает extern, если надо.
Код
typedef struct {
  uint8_t    Filt    : 2;
  ...
  uint8_t    dummy2    : 2;
} Acqu_t;

typedef struct {
  Acqu_t Acqu;            // 2 (1)
  ...
  Curs_t Curs;            // 8 (2)
  uint32_t Crc;            // 4
} Ctrl_t;

_DECL Ctrl_t Ctrl __attribute((section("backup")));


Не в структурах дело. Есть простая переменная Signature (начальная версия работы с Backup), она также обнуляется.
_DECL volatile uint32_t Signature __attribute((section("backup")));
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 08:59
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Надо разбираться, почему они получили атрибут RW вместо ZI.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Apr 6 2015, 09:25
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Если в ИАРе, добавьте __no_init и наверняка проблема решится.

Тьфу, это ж кейл :-)))))) Но наверняка такой квалификатор должен быть..
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 09:29
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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)

разве это не говорит, что инициализации быть не должно?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 09:32
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2015, 09:41
Сообщение #15


Универсальный солдатик
******

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



Я вже попробовав ось таке. Помогло. Спасибо! У вас тот же совет.
Я йопнусь с этого Кейла. rolleyes.gif

Цитата(Dr.Alex @ Apr 6 2015, 12:25) *
Если в ИАРе, добавьте __no_init и наверняка проблема решится.
Тьфу, это ж кейл :-)))))) Но наверняка такой квалификатор должен быть..

zero_init, и кто бы мог догадаться? Помнится, сталкивался с неким подобным.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 6 2015, 09:46
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Apr 6 2015, 12:41) *
zero_init, и кто бы мог догадаться? Помнится, сталкивался с неким подобным.

Я сталкивался и с вещами похуже. Например, за счет оптимизации код из RAM оказывался перенесенным во флеш с полным игнорированием атрибутов секций. Просто оптимизатор инлайнил код с потерей атрибутов.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 22:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016