Перейти к содержанию
    

EA3250 загрузка констант в DDR SDRAM

Всех приветствую :)

 

В связи с полным провалом предполагаемого простейшего варианта http://electronix.ru/forum/index.php?showtopic=80943

пилю другой вариант.

 

Вводная:

На данный момент в проге имеется некоторое количество ресурсов - шрифты и картинки. Эти ресурсы генерируются внешней прогой - просто в виде Си-шных константных массивов. И занимают эти ресурсы чуть более 1 МБ (в бинарном виде). В дальнейшем это всё поделие будет загружаться загрузчиком, постадийно и проблем не предвидится, а на данный момент требуется удобство отладки.

 

Задача:

К основному проекту(кейловскому) сделал еще один - только для генерирования объектника с ресурсами.

scatter файл:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_SDRAM 0x80100000 0x00200000
{
RES_EXTRAM 0x80100000 FIXED UNINIT 0x00200000
{
	Elements.o	(+RO)
	Fonts.o			(+RO)

	arrow_down_blue.o	(+RO)
	arrow_small_down_cyan.o (+RO)
	arrow_small_left_cyan.o (+RO)
	arrow_small_right_cyan.o (+RO)
	arrow_small_up_cyan.o (+RO)
; тут еще куча всякого

	font_big_black.o (+RO)
	font_huge_black.o (+RO)
	font_normal_black.o (+RO)
; тут еще куча всякого
}
}

Keil это проглатывает (естественно, с предупреждением об отсутствии EntryPoint). На выходе имею желанный объектник ***.axf .

 

в основном проекте вставляют в scatter файл приведённый выше кусок:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_SDRAM 0x80100000 0x00200000
{
RES_EXTRAM 0x80100000 FIXED UNINIT 0x00200000
{
;идентичная копия того, что было перечислено в предыдущем куске
}
}

LR_IROM1 0x00000000 0x00030000  		; load region size_region
{    

 ER_IROM1 0x00000000 0x00020000  	; load address = execution address
{  
  *.o (RESET, +First)
  *(InRoot$$Sections)
  .ANY (+RO)
 }

 RW_IRAM1 0x00020000 0x00020000  	  ; RW data
{
  .ANY (+RW +ZI)
 }
}

т.е. пытаюсь получить точно такую-же линковку, как и во вспомогательном проекте, но только штоб эта секция не загружалась (отсутствовала в объектнике основного проекта).

 

Далее делаю хирый финт ушами - вот такой скрипт загрузки

DEFINE INT  Entry;
DEFINE LONG SYS;


//загрузка во внутреннюю статическую память (по заремапленному адресу)
//линкер тоже должен подготовить объектник для работы по этим адресам
Entry = 0x00000000;

//адрес блока управления системными функциями
SYS    = 0x40004000;



//-------------------------------------------------------------------------------------------------
FUNC void Remap (void) 
{
 LONG BOOT_MAP;

 BOOT_MAP = SYS + 0x14;              // Boot Map Control        Address
 _WDWORD(BOOT_MAP, 0x00000001);      // Remap IRAM to 0
}
//-------------------------------------------------------------------------------------------------



//-------------------------------------------------------------------------------------------------
 RESET
 Remap();
 exec("LOAD ..\\_obj\\MainProject.axf INCREMENTAL");
 PC = Entry;
 exec("g,main");
 P 2
 exec("LOAD ResourceProject.axf INCREMENTAL");
//-------------------------------------------------------------------------------------------------

 

Т.е. цель проста:

1. загрузить основной проект во внутреннюю SRAM (а проект без ресурсов туда помещается),

2. выполнить startup код,

3. выполнить пару шажечков отладки - в main'е сразу стоит вызов Init, который производит инициализацию DDR SDRAM (собственно из-за этого куска вся свистопляска)

4. загрузить файл ресурсов в теперь уже доступную DDR SDRAM

5. продолжить отлаживаться

 

Итого:

1. В основном проекте секция ресурсов остаётся в объектнике (превышает бинарник объём внутреннего ОЗУ)

? как сделать так, чтобы её не было, а код, использующий ресурсы нормально бы слинковался.

 

2. Вынужден все ресурсы пометить противооптимизаторным атрибутом __attribute__((used))

(просто чтоб лежал один раз сгенерированный объектник и не отвлекаться на него в зависимости от меры пользования ресурсами, да и нет внутри никакого кода, который бы обращался к этим ресурсам)

 

3. в scatter файлах вынужден перечислять все свои объектники, которые нужно разместить во внешней памяти, хотя имею пару массивов указателей с обращением ко всем ресурсам (этакий интерфейс).

? как сделать проще, компактнее и чтоб ручками файлики не прописывать.

 

 

??? может есть более простой путь? (пока что без записи/чтения из внешней флэши; COM/USB/... на плате нет - ну не нужны были вот и не запасся :01: )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Победил... окольными путями...

В файле проекта выбрасываются все ресурсы, убирается вся добавленная в scatter файл хрень, оставляется хидер с определением типа структуры (он общий для 2х проектов).

 

typedef struct {
 T_Font  *Font1;
 T_Font  *Font2;
...
 T_BitMap *Picture1;
 T_BitMap *Picture2;
...
} ResStruct;

#define ResAccess ((ResStruct *)0x80100000)

 

и далее везде в коде основного проекта : ResAccess->Font1; ResAccess->Picture2

 

А в ресурсном проекте уже определяется переменная ResStruct и инициализируется указателями на конкретные ресурсы.

 

Единственный минус подобного решения: SlickEdit отказывается выдавать подсказки (по крайней мере 13й).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чет не могу осознать чем вызвано такое шаманство.

Сам отлаживаю проекты под мегабайт с JTAG-ом.

Для этого есть загрузчик в DataFlash.

А образ отлаживаемой проги гружу программатором Keil-а в NAND скажем.

Потом стартую отладку с JTAG-ом, ставлю брекпойнт в области программы в DDRAM и программа там и останавливается.

Загрузка из NAND в DDRAM загрузчиком проходит на глаз мгновенно, так что трудностей не создает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. я еще не добрался до загрузчика,

2. в Keil'е среди имеющихся алгоритмов программирования (готовенькое) есть только LPC31xx NAND Flash LP и LPC3000 NAND Flash SP - один раз ткнулся - не завелось. Поэтому с загрузчиком пока идею оставил.

3. Искал способ "по старинке" - скриптом Keil'a инитить внешнее ОЗУ до загрузки программы, чтобы к моменту загрузки была бы просто "память".

 

(если всё и кратко - не освоил полноценно инструмент)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...