Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EA3250 загрузка констант в DDR SDRAM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
cf7k
Всех приветствую smile.gif

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

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

Задача:
К основному проекту(кейловскому) сделал еще один - только для генерирования объектника с ресурсами.
scatter файл:
CODE
; *************************************************************
; *** 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 файл приведённый выше кусок:
CODE
; *************************************************************
; *** 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)
}
}

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

Далее делаю хирый финт ушами - вот такой скрипт загрузки
CODE
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.gif )
cf7k
Победил... окольными путями...
В файле проекта выбрасываются все ресурсы, убирается вся добавленная в scatter файл хрень, оставляется хидер с определением типа структуры (он общий для 2х проектов).

CODE
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й).
AlexandrY
Чет не могу осознать чем вызвано такое шаманство.
Сам отлаживаю проекты под мегабайт с JTAG-ом.
Для этого есть загрузчик в DataFlash.
А образ отлаживаемой проги гружу программатором Keil-а в NAND скажем.
Потом стартую отладку с JTAG-ом, ставлю брекпойнт в области программы в DDRAM и программа там и останавливается.
Загрузка из NAND в DDRAM загрузчиком проходит на глаз мгновенно, так что трудностей не создает.
cf7k
1. я еще не добрался до загрузчика,
2. в Keil'е среди имеющихся алгоритмов программирования (готовенькое) есть только LPC31xx NAND Flash LP и LPC3000 NAND Flash SP - один раз ткнулся - не завелось. Поэтому с загрузчиком пока идею оставил.
3. Искал способ "по старинке" - скриптом Keil'a инитить внешнее ОЗУ до загрузки программы, чтобы к моменту загрузки была бы просто "память".

(если всё и кратко - не освоил полноценно инструмент)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.