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

 
 
> STM32F429 + SDRAM + Keil, Расположение переменных в памяти
MiklPolikov
сообщение Dec 3 2015, 14:53
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Есть STM32F429 + SDRAM IS42S16400J-7TLI 64Мбит , проект в Keil.

Возникли вопросы:
1) Можно ли сделать так, что бы обращение к памяти было не через указатель на её адрес, а просто путем инициализации переменной ?
Т.е. что бы в коде декларировалась переменная char x[100000]; а уже компилятор сам размещал её по адресу внешней памяти ?
2) Нужно сообщить компилятору о наличие этой памяти, а для этого адрес и размер памяти нужно указать вот тут (картинка) в строке RAM1 ? И поставить галочку слева ?
А что означает галочка справа no init ?
3) Нужно ли заботится о том, что бы во внешней памяти размещались только большие массивы, а все часто используемые переменные были во внутренней ?
4) Какие ещё тонкости нужно учитывать ?

Заранее спасибо !
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Dec 3 2015, 17:11
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(MiklPolikov @ Dec 3 2015, 15:53) *
Есть STM32F429 + SDRAM IS42S16400J-7TLI 64Мбит , проект в Keil.
Возникли вопросы:

Мне кажется, ультимативный подход - это размещение переменных для внешней RAM путем размещения их в определенной секции с последующим указанием в скрипте компоновщика (скаттере), что секция должна попасть во внешнюю RAM.

Четыре шага:
1. В опциях проекта, именно в том диалоге, что Вы привели в картинке, активировать либо IRAM2, либо RAM1, с указанием области адресов и размера.
2. Переменная для той RAM получит атрибут с именем секции:

char BlaBla[1000] __attribute__((section("EXTRAM")));

3. Скаттер, который генерируется по-умолчанию (имя проекта.SCT), дополнить (сразу за RW_IRAM1):

RW_IRAM2 <begin address> <size> {
*(EXTRAM)(+RW +ZI)
} ; если активирована IRAM2


или

RW_RAM1 <begin address> <size> {
*(EXTRAM)(+RW +ZI)
} ; если активирована RAM1


4. Переименовать скаттер файл и указать его явно в опциях проекта в секции компоновщика.
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 3 2015, 18:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(KnightIgor @ Dec 3 2015, 20:11) *
Четыре шага:

При указании массива с атрибутом +ZI будет произведена его инициализация?
В какой момент производится инициализация? До main() в startup?
Внешняя память (интерфейс) настраивается после вызова main() и обращения к ней ранее не допустимы.

Что делать?:
1. Указать, что память не нуждается в инициализации и всю жизнь помнить об этом? Как это сделать?
2. Перенести инициализацию интерфейса внешней памяти вместе с тестированием в startup?
Нужно ли в нем заботится об инициализации областей data и bss или все случится на автомате?
А если это плюсы то, там, вроде, еще и конструкторы нужно инициализировать? Ничего не забыл?
Что делать если память не проходит тест? До инициализации памяти нужно еще много чего проиницализировать (RCC, GPIO).
Причем, такая инициализация использует переменные, которые тоже должны быть проинициализированы.
Или забыть о Си и шпарить без переменных на асме в startup?

Короче, кто как делает?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 3 2015, 19:08
Сообщение #4


Гуру
******

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



Цитата(adnega @ Dec 3 2015, 21:08) *
При указании массива с атрибутом +ZI будет произведена его инициализация?

ZI - это не атрибут переменной, а тип секции. Атрибут переменной - __attribute__((zero_init)),
при присвоении этого атрибута переменной, она будет помещена в секцию типа ZI.
Как ясно из названия, будет инициализирован нулями.

Цитата(adnega @ Dec 3 2015, 21:08) *
В какой момент производится инициализация? До main() в startup?

Уже после startup, внутри __main():
startup -> __main -> 'C' main()

Цитата(adnega @ Dec 3 2015, 21:08) *
1. Указать, что память не нуждается в инициализации и всю жизнь помнить об этом? Как это сделать?

В scatter-файле через атрибут секции UNINIT.

Цитата(adnega @ Dec 3 2015, 21:08) *
2. Перенести инициализацию интерфейса внешней памяти вместе с тестированием в startup?
Нужно ли в нем заботится об инициализации областей data и bss или все случится на автомате?
А если это плюсы то, там, вроде, еще и конструкторы нужно инициализировать? Ничего не забыл?
Что делать если память не проходит тест? До инициализации памяти нужно еще много чего проиницализировать (RCC, GPIO).
Причем, такая инициализация использует переменные, которые тоже должны быть проинициализированы.
Или забыть о Си и шпарить без переменных на асме в startup?

А смысл тестировать память? Внутреннюю тоже тестируете? Неисправная железка - это неисправная железка, ничего не поделаешь.

Инициализацию можно написать на 'C', не будут доступны для использования только глобальные инициализированные переменные.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 14th August 2025 - 23:21
Рейтинг@Mail.ru


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