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

 
 
> 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



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

 


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


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