Цитата(Пришелец @ Feb 9 2007, 16:22)

Мне казалось что наоборот вся специфика сосредоточена в записи во flash остальное в принципе у нас будет своё.
Да вся специфика свелась к этому:
Код
inline void ClearFlashBuffer() {
uint8_t Size = PAGE_SIZE / sizeof(uint32_t);
uint32_t const *r = (uint32_t *)0;
do {
spmWriteWord(r++, ~(uint32_t)0);
} while (--Size);
}
//-----------------------------------
case TYPE_PROGRAM: // Program page buffer into flash page
{
uint32_t *q = pageBuffer;
uint32_t const *r = address;
ClearFlashBuffer(); // page erasing emulation
do {
__watchdog_reset();
spmWriteWord(r++, *q++);
} while (--size);
spmProgramPage(address);
}
break;
файлы с реализацией spmXXX я выкладывал выше.
Цитата(Пришелец @ Feb 9 2007, 16:22)

брали готовые лоадеры - все они грохаются где-то на REMAPE
Это надо отладчиком отлавливать. У меня старт примерно такой:
Код
extern "C" __arm void __program_start();
int main(void) {
// Check that the Application Section contents is undamaged
// by calculating the CRC of the whole memory.
if( (!dir(MANUAL_PROG)) // if power-on reset
&& (!signal(MANUAL_PROG))) {
uint16_t crc = 0;
uint8_t const *p = (uint8_t *)APP_START;
uintptr_t n = APP_END - APP_START + 1;
do { crc = CRC(crc, *p++); } while (--n);
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();
}
}
loader();
}