AnsweredAssumed Answered

jump to new application code

Question asked by mehdikarimibiuki on Sep 3, 2014
Latest reply on Sep 18, 2014 by Travis Long

I have a new application and I have created a new srec file based on the linker below:

MEMORY {

  m_interrupts (RX) : ORIGIN = 0x00040000, LENGTH = 0x000001E0

  m_text       (RX) : ORIGIN = 0x00040410, LENGTH = 0x00019410

  m_data       (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000

  m_factory_param (R) : ORIGIN = 0x0007C000, LENGTH = 0x00000400

  m_data_20000000 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000

  m_cfmprotrom   (RX) : ORIGIN = 0x00040400, LENGTH = 0x00000010

}

 

I believe that I have to jump to the start address of the vector table which is 0x40000 here.

 

My jump function is looking like this:

 

void switch_mode(UINT32 IMAGE_ADDR)

{

 

  static uint_32 New_sp,New_pc; /* stack pointer and program counter */

  volatile uint_32 temp = 1; /* default the button is not pressed */

 

  /* Get PC and SP of application region */

  New_sp = ((uint_32 *) IMAGE_ADDR)[0];

  New_pc = ((uint_32 *) IMAGE_ADDR)[1];

 

  if (temp) {

  if ((New_sp != 0xffffffff) && (New_pc != 0xffffffff)) {

    /* Run the application */

  asm {

  ldr r4,=New_sp

  ldr sp, [r4]

  ldr r4,=New_pc

  ldr r5, [r4]

  blx r5

  }

  } /* EndIf */

  }

} /* EndBody */

 

 

But when I use this function by calling it and pass-in the starting address of my application (0x40000), it resets my core and starts my old application (which is at address zero).

I pass in switch_mode(0x00040000)

 

Can you tell me if my function is correct? and if so, why it is not jumping to the start of my new application and instead it is jumping back to the start of my old application which is located at address zero. How can this be possible?

 

Thanks

 

Ps. BTW, and FYI, My chip is MK60DN512VLL10, and I am using CodeWarrior 10.5 - bare board with Processor expert.

Outcomes