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