Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: xmega +extern sram
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ведущий_специалист
Вобщем собрал отладочную платку с 512 кило SRAM. Подключил все как положено по EBI, поставил 2 573х... Вобщем все работает как надо. То есть стандартный апнот от атмела всяко пашет.
пишу тестовую прогу:
так записываю
for (i = 0; i < video_memory; i++)
{
buff[i]=color;
ch=0xff;
__far_mem_write(i+SRAM_ADDR,ch);
i++;
cl=0х00;
__far_mem_write(i+SRAM_ADDR,cl);
}

color = 0;
так читаю
for ( i = 0; i <video_memory; i++)
{
color=__far_mem_read(i+SRAM_ADDR)<<8;
i++;
color=color + __far_mem_read(i+SRAM_ADDR);
ili9320_WriteData(color);
Clr_nWr;
Set_nWr;

}
Set_Cs;
}
все работает идеально.
Собственно вопрос. Как заставить компилятор работать с переменными во внешней памяти. Типа
u16 buff[20000];
ну и собственно запись чтение в этот буфер.
Сразу оговорюсь в настройках проекта в system ставил галку enable external sram. Memory model ставил HUGE.
Просто чутка недопонял в 3х пунктах
RAM ROM Non volatile
В RAM я так понял ставим стандартный адрес внутренней срам с адреса 0х2000 длиной в 0х1000(4 кило)
в ROM я ничего не пишу, не знаю что
в Non Volatile - (я так понял это внешняя срам) я прописал соответственно 512 кило срам.
Просьба не обсмеивать мои предположения ( в настройках иар лазил редко да и подключение срам внешней делаю в первый раз).
Щас компилер понимает запись типа u16 buff[20000];
ошибка не вызывается о переполнении, но там всегда 00, что туда ни пиши. То же самое наблюдается с остальными переменными.
То есть запись типа а=0хffff при проверки к примеру той же записью в жк выдается черной точкой(00) хотя передача функе напрямую обходя переменную работает.
Подскажите пожалуйста что не так.
alexeyv
Не знаю как в ИАР, но в ВинАВР можно делать так.

1. привязать объект по фиксированному адресу. Сам привязавал только к области SRAM, но скорее всего можно и к внешней памяти.
Код
// привязка секции (имени) к определенному адресу
//  выполняется в Настройках Проекта => Custom Options => Linker Options

// адрес в БАйтах
// попробуй поменять значение на величину большую размера SRAM
-Wl,--section-start=.TableCoef=0x0800

// привязка объекта к фиксированной по адресу секции (имени)
ubyte        tcoef2[N] __attribute__((section(".TableCoef"))) =
{ ....,.......,.........,......,........,...,.....,....};


2. Соответственно надо настроить интерфейс внешней памяти.

В ИАР должны присутсвовать такие же вещи!!
SasaVitebsk
Цитата(ведущий_специалист @ Sep 25 2010, 12:45) *
Щас компилер понимает запись типа u16 buff[20000];

Это вам не Паскаль. smile.gif
Компилятор пропустит всё что угодно. Границы не контролируются. Линкер может указать, что "не влазит".
Цитата
ошибка не вызывается о переполнении, но там всегда 00, что туда ни пиши. То же самое наблюдается с остальными переменными.
То есть запись типа а=0хffff при проверки к примеру той же записью в жк выдается черной точкой(00) хотя передача функе напрямую обходя переменную работает.
Подскажите пожалуйста что не так.

Вы должны указать место, куда размещаете массив.
Смысл в том, что скорее всего, компилятор размещает это всё единым куском. Поэтому открытие массива может осуществлятся и во внутренней памяти. Либо просто адреса попутаны и линкер не туда "укладывает".

Проверить это просто. Перейдите в ассемблер и посмотрите по какому адресу обращается.

Как настроить.
1) Можно в настройках линкера установить галочку на вывод листинга. И тогда, в заголовке файла вы увидите тот стандартный xcl файл, который подключает линкер по умолчанию. Его можно и просмотреть.
2) Можно написать свой файл xcl (и это будет лучший вариант), взяв за основу файл с п.1. Там разместить сегменты так, как вам надо. Ну а массив располагать уже в конкретном сегменте памяти. В опциях указать имя этого xcl файла.
ведущий_специалист
Чучуть дело продвинулось. Очередной раз читая даташит понял, что срам адресована через задний проход. Короче, все связано оказывается с CS сигналом. Эти уроды ничего более правильного не могли придумать как повесить CS на адресные линии (управляющие линии EBI). Вот и результат, что срамка "открывается только при обращении не ниже адреса 0х80000 (у меня 512 кило одним чипом, поэтому один банк и такая адресация).
Вобщем катит такая запись __no_init unsigned char buff[20000]@ 0xне ниже 80000. Уже можно работать с этой переменной полноценно.
Единственно так и осталась неясной в настройках проекта функа включения внешней памяти. Да, кстати....(странно что никто не сказал) non volatile memory это ничто иное как еепром микры....(странно что я сам затупил).
Пробывал прописывать размер внешней памяти и так и сяк....пофиг веники. А жаль, не писать же каждой переменной её непосредственный адрес, знаете ли, напрягает так следить.
GDI
Так чтоб не следить, Вам и написали выше про свой xlc. Опишите в нем Вашу память и будут переменные туда автоматом ложиться.
demiurg_spb
Помните и о стеке, и о том куда он ляжет, ведь внешняя рама медленнее внутренней...
KKV2003
И доступ к внешней памяти SDRAM через полу-байтную шину, при одиночном чтении - со всеми тактами ( команда активации, команда чтения/записи, адрес, и 1 байт данных = 2 полубайта )... Гадство.
demiurg_spb
Так автор вроде как SRAM а не SDRAM навешивает.
ведущий_специалист
Я срам навесил. При выводе из внешней срам в жк заметна отрисовка экрана. По моему, если не ошибаюсь, 4 такта кушает запись / чтение (по крайней мере в обычной меге так) в хмега индексные регистры 24 бита, возиожно и более длительное обращение.
Короче так мне и не удалось ничего внятного сделать с компилером. В xlc ничего непонятно, то есть понятно, но все мои там лазанья приводят либо никчему либо к повисшей программе. Сразу говорю, руки из нормального места растут, адекватные решения принимать умею. Видимо связано с такой адресацией внешней памяти.
Кому интересно, могу прикрепить сдесь xlc файл и показать что где менял. Там вроде вразумительно все написано.
Тайлер Дерден
На меге я бы такое не делал...
ведущий_специалист
прикрепил кодер джипег (не rst7, китайский какой то), вроде как работает. Памяти хавает конечно много. Чуть более 150 кб(экран 320х240) жмет в цвете почти 3 секунды. Декодер так и не заработал. Видимо с адресацией памяти намудрил. Но stm32 разжимает то что накодировала хмега хорошо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.