ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
105137 Топик полностью
Сергей Борщ (16.11.2007 19:37, просмотров: 156) ответил Argon на 2 Сергей Борщ и всем, кто в лодке! 2nd stage bootloader и scmRTOS.
Делаю по второму варианту. LPC, SAM7. Работает без нареканий. Надо только не забыть в основной программе зарезервировать 40 байт в начале ОЗУ под вектора, правильно линковать вектора (они у меня находятся в начале первого сектора флеш (00101000 в SAM7), но слинкованы так, как будто находятся в нулевых адресах:
// link code to flash
-DROMSTART=00101000
-DROMEND=0010FFFF

-DRAMSTART=00200040   // reserve space for remapped vectors
-DRAMEND=00203FFF

// Intvec always linked to 0x00-0x3F
-Z(CODE)INTVEC=00000000-0000003F

// ROM
-Z(CODE)INTVEC_I=ROMSTART-ROMEND  // place vectors to start of app. ROM
-QINTVEC=INTVEC_I
ну и загрузчик копирует вектора, делает remap и переходит на вектор ресета - а там после ремапа уже находится вектор входа в приложение:<c> if (!crc) // Application Section OK { dir_out(MANUAL_PROG); // set MANUAL_PROG as output // copy application INTVEC_ID to remapped INTVEC uint32_t const *Src = (uint32_t *)APP_START; uint32_t *Dst = (uint32_t *)0x00200000; //RAMSTART uint_fast8_t Size = 0x40 / sizeof *Dst; do { *Dst++ = *Src++; } while (--Size); AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB; // REMAP __program_start(); } </c>