Пишу bootloader.
Контроллер AT91SAM7S64.
Компилятор IAR.
Вот код самой процедуры самопрограммирования
Код
void flash_init (void)
{
*AT91C_MC_FMR = ((AT91C_MC_FMCN)&(72 <<16)) | AT91C_MC_FWS_1FWS;
}
void flash_write(unsigned int page, unsigned int* flash_buf)
{
unsigned int* flash;
unsigned int i;
*AT91C_MC_FCR = (0x5A<<24) | (page<<8 & AT91C_MC_PAGEN) | AT91C_MC_FCMD_UNLOCK; //Unlock Region
while((*AT91C_MC_FSR & AT91C_MC_FRDY) != AT91C_MC_FRDY );
flash = (unsigned int *) 0x00100000 + 4*page*FLASH_PAGE_SIZE_WORDS;
for(i=0; i < FLASH_PAGE_SIZE_WORDS; i++) flash[i] = flash_buf[i];
__disable_interrupt();
*AT91C_MC_FCR = (0x5A<<24) | (page<<8 & AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG; // | (1 << 8); //0x5A000001; //
while((*AT91C_MC_FSR & AT91C_MC_FRDY) == 0);
while((*AT91C_MC_FSR & AT91C_MC_FRDY) != AT91C_MC_FRDY );
__enable_interrupt();
}
Где-то внутри функции flash_write(...) вылетает в Prefetch Abort.
Точное место определить не могу, т.е. при использовании JTAG и прохождении программы по шагам все работает нормально.
Подскажите пожалуйста в чем может быть причина.
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.