I don't really know how vector table works but my code is like this now :
void _binExec (void * l_code_addr)
{
__asm ( "mov r1, r0 \n"
"ldr r0, [r1, #4] \n"
"ldr sp, [r1] \n"
/*"msr msp, [r1] \n"*/
"blx r0"
);
}
unsigned int main (void)
{
void *vAppStartAddress = (void *)((unsigned int) 0x88000);
int i;
// -- Disable interrupts
// Disable IRQ
__disable_irq();
// Disable IRQs
for (i = 0; i < 8; i ++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
}
// Clear pending IRQs
for (i = 0; i < 8; i ++)
{
NVIC->ICPR[i] = 0xFFFFFFFF;
}
// -- Modify vector table location
// Barriars
__DSB();
__ISB();
// Change the vector table
SCB->VTOR = ((uint32_t)vAppStartAddress & SCB_VTOR_TBLOFF_Msk); // = 0x88 0000
// Barriars
__DSB();
__ISB();
// -- Enable interrupts
__enable_irq();
_binExec(vAppStartAddress);
return (unsigned int) vAppStartAddress;
}
Test programs given by Atmel still blink but Arduino binary doesn't blink.