
В связи с полным провалом предполагаемого простейшего варианта 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-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)
; тут еще куча всякого
}
}
в основном проекте вставляют в 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)
}
}
; *** 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");
//-------------------------------------------------------------------------------------------------
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/... на плате нет - ну не нужны были вот и не запасся
