Здравствуйте,
Цитата(aaarrr @ Apr 5 2008, 15:38)

С таблицей векторов в случае SAM7 все достаточно прозрачно - можно сделать remap и расположить её в RAM, или использовать ту же таблицу, что и bootloader.
В самом загрузчике перед передачей управления следует сбросить использованную периферию и запретить прерывания.
наверное я что-то делаю неправильно

потому как не работает должным образом.
Вот так отключаю прерывания и сбрасываю процессор и периферию в бутлоадере ПЕРЕД передачей управления (пропустил инклюды и пр. для экономии места):
Код
typedef void (*funct)(void);
//* external functions
extern unsigned disableIRQ();
...
int main(void)
{
AT91F_DBGU_Init();
AT91F_DBGU_Printk("before jump\n\r");
//Run the application
((funct)0x10058c)();
disableIRQ();
*AT91C_RSTC_RCR = 0xa500000d; //Reset device
}
А вот здесь я получаю управление и включаю прерывания:
Код
//* external functions
extern unsigned enableIRQ();
...
int main(void)
{
enableIRQ();
AT91F_DBGU_Init();
AT91F_DBGU_Printk("after jump\n\r");
while (1)
{
}
}
Вот функции disableIRQ и enableIRQ:
Код
#define IRQ_MASK 0x00000080
static inline unsigned __get_cpsr(void)
{
unsigned long retval;
asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ );
return retval;
}
static inline void __set_cpsr(unsigned val)
{
asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) );
}
unsigned disableIRQ(void)
{
unsigned _cpsr;
_cpsr = __get_cpsr();
__set_cpsr(_cpsr | IRQ_MASK);
return _cpsr;
}
unsigned enableIRQ(void)
{
unsigned _cpsr;
_cpsr = __get_cpsr();
__set_cpsr(_cpsr & ~IRQ_MASK);
return _cpsr;
}
Все компилируется успешно, загружаю в флеш. На всякий случай проверяю SAM-BA, что образы находятся по нужным адресам (все корректно), запускаю: работает нестабильно, иногда печатается before jump, потом after jump (то есть переход происходит), а иногда в момент перехода на второей образ сыпется мусор. После пересброса платы все повторяется.
Что я делаю не так?
Благодарю за помощь!
PS. на всякий случай прикрепляю ld-скрипты.
Первое приложение, размер 1420 байт (0x58c):
Код
/* Memory Definitions */
MEMORY
{
CODE (rx) : ORIGIN = 0x00100000, LENGTH = 0x00040000
DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
STACK (rw) : ORIGIN = 0x00204000,LENGTH = 0x00000000
}
...
Второе приложение (на которое передается управление):
Код
/* Memory Definitions */
MEMORY
{
CODE (rx) : ORIGIN = 0x0010058c, LENGTH = 0x00040000
DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
STACK (rw) : ORIGIN = 0x00204000,LENGTH = 0x00000000
}
...
// все остальное по умолчанию