Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в программе разместить большой массив в SDRAM?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
kolobochishe
Товарищи 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];
MALLOY2
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 контроллер.
MrYuran
Сильно подозреваю, что внешняя память начинается с определённого адреса (0х80000000 вроде как) и требует определённых телодвижений.
kolobochishe
В даташите 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];

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

Свою строчку я убрал в файле линкера.
MALLOY2
1.RAM_region я у вас в линкере не SDRAM регион, но если вы адреса RAM_region перенесли на адреса SDRAM тогда надо написать так

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


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


Здается мне что рано радуетесь smile.gif
kolobochishe
[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 есть какие-то ограничения на размер массива для конкретной задачи. Потому как локально объявленный массив не работал.
MALLOY2
Гы,
Цитата
Потому как локально объявленный массив не работал
вы его что внутри таска обьявили ???, дык естественно программа упадет, он ведь в стек ляжет, у вас размера стека хватает ???
kolobochishe
Цитата(MALLOY2 @ Dec 2 2010, 18:27) *
Гы, вы его что внутри таска обьявили ???, дык естественно программа упадет, он ведь в стек ляжет, у вас размера стека хватает ???

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

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

Это стэк таска.
kolobochishe
И еще. На плате LPC-2478STK есть 2 чипа SDRAM по 32МБ. Одна из них указана в linker файле в диапазоне адресов 0xA0000000...0xA1FFFFFF. А где находятся другие 32МБ? В linker файле расширяю диапазон RAM с 0xA1FFFFFF до 0xA2FFFFFF и создаю массив 48МБ -> прога виснет. Массив чуть меньше 32МБ -> все нормально
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.