跳转前指定sp和msp:
#if defined(__GNUC__) __attribute__(( naked )) static void set_sp(unsigned long addr) { __asm volatile ( "mov sp, r0 " "bx lr " ); } __attribute__(( naked )) static void set_msp(void) { __asm volatile ( "mrs r0, control " "bic r0, #2 " "msr control, r0 " "bx lr " ); } #else __asm static void set_sp(unsigned long addr) { mov sp, r0 bx lr } __asm static void set_msp(void) { mrs r0, control bic r0, #2 msr control, r0 bx lr } #endif
跳转到指定地址:
1 typedef int (*jump_fun)( void ); 2 3 void jump( unsigned int addr ) 4 { 5 volatile int *ptr = (int *)addr; 6 jump_fun jump; 7 8 set_msp(); 9 set_sp(ptr[0]); 10 11 jump = (jump_fun)(ptr[1]); 12 13 jump(); 14 }