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

 
 
 
Reply to this topicStart new topic
> xmega +extern sram, Как заставить си работать с переменными в ex sram
ведущий_специали...
сообщение Sep 25 2010, 09:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 24-11-07
Пользователь №: 32 645



Вобщем собрал отладочную платку с 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) хотя передача функе напрямую обходя переменную работает.
Подскажите пожалуйста что не так.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Sep 30 2010, 07:46
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Не знаю как в ИАР, но в ВинАВР можно делать так.

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

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

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


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

В ИАР должны присутсвовать такие же вещи!!

Сообщение отредактировал alexeyv - Sep 30 2010, 07:47
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 30 2010, 09:04
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

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

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

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

Как настроить.
1) Можно в настройках линкера установить галочку на вывод листинга. И тогда, в заголовке файла вы увидите тот стандартный xcl файл, который подключает линкер по умолчанию. Его можно и просмотреть.
2) Можно написать свой файл xcl (и это будет лучший вариант), взяв за основу файл с п.1. Там разместить сегменты так, как вам надо. Ну а массив располагать уже в конкретном сегменте памяти. В опциях указать имя этого xcl файла.
Go to the top of the page
 
+Quote Post
ведущий_специали...
сообщение Oct 6 2010, 19:37
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 24-11-07
Пользователь №: 32 645



Чучуть дело продвинулось. Очередной раз читая даташит понял, что срам адресована через задний проход. Короче, все связано оказывается с CS сигналом. Эти уроды ничего более правильного не могли придумать как повесить CS на адресные линии (управляющие линии EBI). Вот и результат, что срамка "открывается только при обращении не ниже адреса 0х80000 (у меня 512 кило одним чипом, поэтому один банк и такая адресация).
Вобщем катит такая запись __no_init unsigned char buff[20000]@ 0xне ниже 80000. Уже можно работать с этой переменной полноценно.
Единственно так и осталась неясной в настройках проекта функа включения внешней памяти. Да, кстати....(странно что никто не сказал) non volatile memory это ничто иное как еепром микры....(странно что я сам затупил).
Пробывал прописывать размер внешней памяти и так и сяк....пофиг веники. А жаль, не писать же каждой переменной её непосредственный адрес, знаете ли, напрягает так следить.
Go to the top of the page
 
+Quote Post
GDI
сообщение Oct 7 2010, 08:41
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Так чтоб не следить, Вам и написали выше про свой xlc. Опишите в нем Вашу память и будут переменные туда автоматом ложиться.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 10 2010, 21:12
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Помните и о стеке, и о том куда он ляжет, ведь внешняя рама медленнее внутренней...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KKV2003
сообщение Oct 11 2010, 05:01
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 11-02-08
Пользователь №: 34 931



И доступ к внешней памяти SDRAM через полу-байтную шину, при одиночном чтении - со всеми тактами ( команда активации, команда чтения/записи, адрес, и 1 байт данных = 2 полубайта )... Гадство.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 11 2010, 09:05
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Так автор вроде как SRAM а не SDRAM навешивает.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ведущий_специали...
сообщение Oct 15 2010, 19:35
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 24-11-07
Пользователь №: 32 645



Я срам навесил. При выводе из внешней срам в жк заметна отрисовка экрана. По моему, если не ошибаюсь, 4 такта кушает запись / чтение (по крайней мере в обычной меге так) в хмега индексные регистры 24 бита, возиожно и более длительное обращение.
Короче так мне и не удалось ничего внятного сделать с компилером. В xlc ничего непонятно, то есть понятно, но все мои там лазанья приводят либо никчему либо к повисшей программе. Сразу говорю, руки из нормального места растут, адекватные решения принимать умею. Видимо связано с такой адресацией внешней памяти.
Кому интересно, могу прикрепить сдесь xlc файл и показать что где менял. Там вроде вразумительно все написано.
Go to the top of the page
 
+Quote Post
Тайлер Дерден
сообщение Oct 17 2010, 18:25
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 3-01-10
Из: хз
Пользователь №: 54 614



На меге я бы такое не делал...


--------------------
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Go to the top of the page
 
+Quote Post
ведущий_специали...
сообщение Oct 22 2010, 17:15
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 24-11-07
Пользователь №: 32 645



прикрепил кодер джипег (не rst7, китайский какой то), вроде как работает. Памяти хавает конечно много. Чуть более 150 кб(экран 320х240) жмет в цвете почти 3 секунды. Декодер так и не заработал. Видимо с адресацией памяти намудрил. Но stm32 разжимает то что накодировала хмега хорошо.
Go to the top of the page
 
+Quote Post

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

 


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


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