Itch 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Хочу использовать в проекте код предварительной инициализации, который загружается раньше основной программы, включает SDRAM, меняет частоты PLL и т.п. Раскопал такой вот проект: Blackfin\ldr\init_code\ADSP-BF533 INIT CODE в VDSP. Взял оттуда файлик init_code.asm и создал новый проект под свой процессор (BF531). Все бы хорошо, так он, зараза, требует чтобы была описана функция main. Если её описать, скомпилять и получившийся .dxe добавить в свой проект, то при загрузке процессор считывает первую половину программы и зависает. Пробовал вообще убирать код инициализации, оставлял только сохранение/восстановление регистров - бестолку. Есть подозрение, что надо как-то линкеру объяснить, куда по какому адресу помещать код инициализации, но вот как это сделать - проблема. В документации этот момент не очень то освещён. Может кто использовал код инициализации, расскажете по шагам что и куда прописывать? :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmf 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Скорее всего вы сгенерили свой LDF, вместо того чтобы взять из примера. Он написан вручную и main не требует. После генерации dxe забиваете его в опцию Load->Options->Initialisation file основного проекта и все. Ну и не забудьте подправить LDF под BF531 всесто BF533. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба А по какому адресу размещать код для BF531? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 10 июля, 2007 Опубликовано 10 июля, 2007 · Жалоба А по какому адресу размещать код для BF531? Ничего вам размещать не надо - возьмите ldf файл из того же проекта, там уже все написано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 10 июля, 2007 Опубликовано 10 июля, 2007 · Жалоба Тогда в моем проекте при сборке возникает ошибка "Error: no section in the code memory space". Где-то вычитал, что надо в ldf файл добавить строчки: RESOLVE(initcode,0xFFA00000) KEEP(initcode) Добавил - другая ошибка - "[Error li1170] Failed to extract symbol 'initcode' needed for absolute placement.", хотя .GLOBAL initcode; описан. Можете скинуть заведомо рабочий ldf файл для загрузочного проекта и для того, куда он подключается, желательно для BF531 или BF532. Буду очень благодарен, давно бьюсь над этой проблемой :( Мыло oai на gorodok.net. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmf 0 10 июля, 2007 Опубликовано 10 июля, 2007 · Жалоба правильные строчки для BF531 будут: ARCHITECTURE(ADSP-BF531) .... PROGRAM { TYPE(RAM) START(0xFFA08000) END(0xFFA13FFF) WIDTH(8) } //L2 ... взяты из стандартного LDF для 531 ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 10 июля, 2007 Опубликовано 10 июля, 2007 · Жалоба Тогда в моем проекте при сборке возникает ошибка "Error: no section in the code memory space". Где-то вычитал, что надо в ldf файл добавить строчки: RESOLVE(initcode,0xFFA00000) KEEP(initcode) Добавил - другая ошибка - "[Error li1170] Failed to extract symbol 'initcode' needed for absolute placement.", хотя .GLOBAL initcode; описан. Можете скинуть заведомо рабочий ldf файл для загрузочного проекта и для того, куда он подключается, желательно для BF531 или BF532. Буду очень благодарен, давно бьюсь над этой проблемой :( Мыло oai на gorodok.net. Да, вроде, правильно все. У меня в ldf файле аналогично (правда, у меня тут для 533-го): /* Following address must match start of MEM_L1_CODE */ RESOLVE(rtinit_start, 0xFFA00000) KEEP(rtinit_start) а на асме: .extern _HardwareInit; .global rtinit_start; .section program; .align 2 //------------------------------------------------------------------------------ rtinit_start: [--sp] = astat; //save regs onto stack [--sp] = rets; [--sp] = (r7:0); ... Тут у вас дело не в ldf'е, а в том, что линкер почему-то не находит имени в объектных файлах. Посмотрите на файл листинга, который генерит линкер (в html формате он), там должны быть перечислены все имена, в том числе и их видимость - глобальные или локальные. Например, в моем файле есть (табличка там): Symbol Address Size Binding rtinit_start 0xffa00000 0x56 GLOBAL rtinit_start.end 0xffa00056 0x0 LOCAL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmf 0 10 июля, 2007 Опубликовано 10 июля, 2007 · Жалоба .. RESOLVE(initcode,0xFFA00000) KEEP(initcode) .. это если вы подключаете код(например startup) в котором эта метка определена. в приведенном примере загрузчика все находится в одном файле вообще без метки начала и соответственно эти строчки будут ошибкой адреса в LDF надо указывать в диапазоне реальные для данного процессора для кода BF533 0xFFA00000..0xFFA07fff BF532 0xFFA08000..0xFFA0ffff BF531 0xFFA08000..0xFFA0BFFF рабочий файл для 532 ARCHITECTURE(ADSP-BF532) SEARCH_DIR( $ADI_DSP\Blackfin\lib ) $OBJECTS = $COMMAND_LINE_OBJECTS; MEMORY { PROGRAM { TYPE(RAM) START(0xFFA08000) END(0xFFA0ffff) WIDTH(8) } //L2 SDRAM { TYPE(RAM) START(0x00000000) END(0x07FFFFFF) WIDTH(8) } //SDRAM } PROCESSOR p0 { OUTPUT( $COMMAND_LINE_OUTPUT_FILE ) SECTIONS { code { // Align all code sections on 2 byte boundary INPUT_SECTION_ALIGN(2) INPUT_SECTIONS( $OBJECTS(program)) }>PROGRAM SDRAM { INPUT_SECTION_ALIGN(1) INPUT_SECTIONS( $OBJECTS(sdram) ) } >SDRAM stack { // The data sections shouldn't be aligned. INPUT_SECTION_ALIGN(1) INPUT_SECTIONS( $OBJECTS(stack)) }>PROGRAM } } как правило в коде инициализации внутрення память данных не используется для переменных, поэтому и ее описания нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Itch 0 11 июля, 2007 Опубликовано 11 июля, 2007 · Жалоба Спасибо большое за помощь, все заработало! Теперь и грузится с AT45 гораздо быстрее (до 2МБ в сек.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться