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

 
 
 
Reply to this topicStart new topic
> Как в программе разместить большой массив в SDRAM?
kolobochishe
сообщение Dec 2 2010, 10:45
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Товарищи smile.gif Объясните как разместить массив размером 10x10^6 во внешней SDRAM?

Плата LPC-2478STK. 64МБ SDRAM.

Пробовал задавать статический массив. Компилятор "съедает", но программа "виснет" при инициализации файловой системы и графики.

Также был тут уже вопрос - как узнать сколько ресурсов "съедает" RTOS PowerPac?
И вообще какие ограничения накладывает IAR на размер массивов? С какого адреса начинается адресное пространство SDRAM? Хочу использовать следующее:


#pragma location="адрес"
__no_init "объявление структуры"

Взято отсюда

#pragma location=0xXXXXXXXXX // Какой то адрес в SDRAM
__no_init U16 MyArray[10000000];
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 2 2010, 10:57
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



1) И вообще какие ограничения накладывает IAR на размер массивов?

Согласно адресного пространства и типа указателя, для ARM это 32 бит

2) С какого адреса начинается адресное пространство SDRAM?

Вы хоть мануал на процессор открывали ? там все написано

3) Надо в линкер файле добавить следующее

Код
define symbol REGION_SDRAM_start  = 0хххххх; //адрес начала памяти
define symbol REGION_SDRAM_end   = 0xххххх; //адрес конца памяти  


//обьявляем регион для SDRAM
define region SDRAM_region = mem:[from REGION_SDRAM_start to REGION_SDRAM_end];


//говорим какие секции туда положить
place in SDRAM_region {section .my};


//если SDRAM инициализируется после low_level_init тогда делаем всю память не инициализируюмую иначе ппц будет, в этом случае нельщзя ложить секции которые требуют инициализации

do not initialize  { section .my };


Вот теперь можно пользоваться

Код
#pragma location=".my"
my_array_in_SDRAM[SIZE];


Здесь __no_init убирается и переносится на плечи линкера, более крос платформенный подход.

P.S. И не забудьте вовремя и правильно инициализировать SDRAM контроллер.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 2 2010, 10:59
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Сильно подозреваю, что внешняя память начинается с определённого адреса (0х80000000 вроде как) и требует определённых телодвижений.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 2 2010, 12:21
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



В даташите LPC2478 на 28 стр. есть таблица memory mapping. И мне, честно-говоря, непонятно где там SDRAM

0xF000 0000 to 0xFFFF FFFF AHB peripherals

Есть подозрение что это оно.

И еще. Все таки приложение написано под RTOS. Я, почему-то, считал что все там уже инициализировано. Так как проект создаю на базе PowerPac-вского примера.

Все. Нашел. Там дальше рисунок 4. Все указано. Действительно с 0x8000 0000

Ошибочка в компиляторе выходит

Error[Lc037]: ambiguous section match: "zi section .bss in FS_ConfigMMC_CardMode.o" matches more than one pattern

Ругается на строчки:

place in RAM_region { readwrite, block HEAP }; // Было до меня

place in RAM_region { readwrite, section MyData }; // Добавил я

Т.е. получается HEAP занимает всю SDRAM?

ЗАРАБОТАЛО! smile.gif

#pragma location = "HEAP"
U16 MyArray[MyMaxArrayIndex];

По другому не получается. Массив создается. Значения пишутся

Свою строчку я убрал в файле линкера.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 2 2010, 12:22
Сообщение #5


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



1.RAM_region я у вас в линкере не SDRAM регион, но если вы адреса RAM_region перенесли на адреса SDRAM тогда надо написать так

Код
place in RAM_region { readwrite, block HEAP, sectoin MyData }; // Было до меня


Цитата
ЗАРАБОТАЛО!


Здается мне что рано радуетесь smile.gif
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 2 2010, 12:43
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



[quote name='MALLOY2' date='Dec 2 2010, 17:22' post='848774']

Код
place in RAM_region { readwrite, block HEAP, sectoin MyData }; // Было до меня


Код
define symbol __ICFEDIT_region_RAM_start__  = 0xA0000000;           // 32MByte SDRAM
define symbol __ICFEDIT_region_RAM_end__    = 0xA3FFFFFF;
define symbol __ICFEDIT_region_iRAM_start__ = 0x40000000;
define symbol __ICFEDIT_region_iRAM_end__   = 0x4000FFFF;

place in RAM_region   { readwrite, block HEAP };

place in iRAM_region  { block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
                        block UND_STACK, block ABT_STACK };


iRAM - внутреннее ОЗУ, как я понял
RAM - внешнее. Кучу программисты из IAR поместили в RAM. Которая, как я понял, и есть нужная мне SDRAM. По диапазону адресов совпадает

И вообще, что-то я совсем запутался. Работает и без всего этого. Просто объявил массив глобально. Похоже в RTOS есть какие-то ограничения на размер массива для конкретной задачи. Потому как локально объявленный массив не работал.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 2 2010, 13:27
Сообщение #7


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Гы,
Цитата
Потому как локально объявленный массив не работал
вы его что внутри таска обьявили ???, дык естественно программа упадет, он ведь в стек ляжет, у вас размера стека хватает ???
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 3 2010, 06:02
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(MALLOY2 @ Dec 2 2010, 18:27) *
Гы, вы его что внутри таска обьявили ???, дык естественно программа упадет, он ведь в стек ляжет, у вас размера стека хватает ???

.
да. именно внутри таска rolleyes.gif сейчас при размере массива 12 млн. элементов все вроде работает. но при инициализации графики GUI_Init() все виснет. Массив глобальный.

OS_STACKPTR int StackSpeed[512]; /* Task stacks */

Это стэк таска.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 3 2010, 09:11
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



И еще. На плате LPC-2478STK есть 2 чипа SDRAM по 32МБ. Одна из них указана в linker файле в диапазоне адресов 0xA0000000...0xA1FFFFFF. А где находятся другие 32МБ? В linker файле расширяю диапазон RAM с 0xA1FFFFFF до 0xA2FFFFFF и создаю массив 48МБ -> прога виснет. Массив чуть меньше 32МБ -> все нормально
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:04
Рейтинг@Mail.ru


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