Цитата(sergeeff @ Jul 29 2009, 17:27)

Не видел ни одного компилятора без startup'a. Вы посмотрите map файл вашей программы. Там что, адрес main совпадает со стартовым адресом вашей программы?
Да, конечно, адрес main не совпадает со стартовым. Я неправильно использую слово стартап.
Попытаюсь описать задачу.
Есть отлаженная на х86 программа, выполняющая некий расчет и выводящая результат в консоль.
Добавляю инициализацию UART и кнопок со светодиодами.
Компилирую ее GCC, в мэйкфайле указываю линкеру файл скрипта, взятый из примера:
CODE
/*------------------------------------------------------------------------------
* Linker script for running in external SDRAM on the AT91SAM9263
*----------------------------------------------------------------------------*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(entry)
MEMORY
{
sram (W!RX) : ORIGIN = 0x300000, LENGTH = 0x14000
sdram (W!RX) : ORIGIN = 0x20000000, LENGTH = 0x4000000
}
SECTIONS
{
.fixed :
{
. = ALIGN(4);
_sfixed = .;
*(.text*)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.data)
. = ALIGN(4);
_efixed = .;
} >sdram
.prerelocate : AT (_efixed)
{
. = ALIGN(4);
_sprerelocate = .;
. = ALIGN(4);
_eprerelocate = .;
}
.postrelocate : AT (_efixed + SIZEOF(.prerelocate))
{
. = ALIGN(4);
_spostrelocate = .;
*(.vectors);
*(.ramfunc)
. = ALIGN(4);
_epostrelocate = .;
} >sram
.bss (NOLOAD) : {
_szero = .;
*(.bss)
_ezero = .;
} >sram
_sstack = 0x22000000;
}
end = .;
С помощью самбы загружаю в SDRAM - все работает.
Хочу чтобы программа работала из флэш. Для этого беру бутлоадер, задаю константы
#define IMG_ADDRESS 0x20000 /* Image Address in NandFlash */
#define IMG_SIZE 0x40000 /* Image Size in NandFlash */
#define JUMP_ADDR 0x20000000 /* Final Jump Address */
Записываю во флеш бутлоадер и свою программу. Бутлоадер загружается во внутреннюю SRAM, инициализирует PLL, регистры необходимые для работы с SDRAM, еще что то, после этого копирует программу по указанному адресу из флэш в SDRAM и переходит по этому адресу. Правильно ли я этот момент понимаю?
Далее... программа работает, но медленнее чем при загрузке самбой в SDRAM (меряю по RTC).
Хочу установить частоту. Меняю в бутлоадере константы для регистра PLLA:
#define MASTER_CLOCK (239669000/2) //(199919000/2)
#define PLLA_SETTINGS 0x20CCBF0E //0x20AABF0E
#define PLLB_SETTINGS 0x10483F0E
Ничего не меняется. Читаю в программе регистр AT91C_CKGR_PLLAR - содержиме не зависит от того, что я прописываю в бутлоадере. Почему?? Что я здесь не понимаю?
Второй непонятный момент: если в JUMP_ADDR вместо 0x20000000 пишу 0x23F00000 - программа не загружается.
По моменту начальной загрузки: внутренний загрузчик находит во флэш мой загрузчик (по наличию 8 векторов перехода по исключениям), загружает его в SRAM, делает REMAP и после этого выполняется мой загрузчик?
Поправьте, пожалуйста, где я не правильно понимаю ход процесса.
Надеюсь на понимание, хотелось бы разобраться..