This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Enable Reentrant interrupt handlers in kinetis K70

I have a TWR-K70F120M: kinetis k70 120MHz Tower System Module.

I have connected a elettric signal to PORTB and i have connected e isr handler to signal transition.

Electric signal

     _____          ______          ______

    |         |         |          |         |          |

__|          |_____|          |_____|          |_____  ------> PORTB  

  ( 1 )             ( 2 )                ( 3 )

     

Interrupt handler is called every transition of the elettric signal ( in the figure is 1,2,3 ).

The interrupt handler is the follow code:

#define EN_ERR_SCHEDULER_INT_TOO_LONG (10)

static bool wbFlag = false; /* control the reentrant function */

__ isr void isr_handler( void )

{

  /* l'interrupt precedente è durato troppo ? */

  if ( wbFlag != true )

  {

    /* flag reentrant function  */

    wbFlag = TRUE;  

  }

  else

  {  

    vDebugPrint( EN_ERR_SCHEDULER_INT_TOO_LONG );

  }

   while(1);

   wbFlag = false;

}

at the step ( 1 ) the program jump to the handler but not in the 2nd e third impulse. Is it possible to enable a reentrand interrupt in kinetis k70?

 

the setup is follow ( setup is call one time at the startup of the system ):

sllRq = 88; /*Port control module Pin Detect (Port B) */

void vEnableIrq (SLONG slIRQ)

{

  SLONG slDiv;

 

  /* Make sure that the IRQ is an allowable number. Right now up to 91 is

  * used.

  */

  if ( slIRQ > 91 )

  {

    vDebugPrint("\nERR! Invalid IRQ value passed to enable irq function!\n");

  }

 

  /* Determine which of the NVICISERs corresponds to the irq */

  slDiv = ( slIRQ / 32 );

 

  switch ( slDiv )

  {

    case 0x0:

      NVICICPR0 = 1 << ( slIRQ % 32 );

      NVICISER0 = 1 << ( slIRQ % 32 );

    break;

    case 0x1:

      NVICICPR1 = 1 << ( slIRQ % 32 );

      NVICISER1 = 1 << ( slIRQ % 32 );

    break;

    case 0x2: /* program execute this case !!!!! */

      NVICISER2 = 1 << ( slIRQ % 32 );

      NVICICPR2 = 1 << ( slIRQ % 32 );

      PORTB_PCR18 |= PORT_PCR_ISF(0) | PORT_PCR_IRQC(9) |  PORT_PCR_MUX(1);

      NVICIP88 = 0x00;

    break;

  }             

}

I need to control the reentrant interrupt because this application must check the excessive duration of the code in isr handler.

Parents
  • Thank you for your timely reply. You are exactly right. That solves my confusion about why my code works abnormally only for certain programs but not others. If at the time of interrupt, the core is executing a PUSH, POP, it will do that twice and mess up the stack? Debugging my code seems confirmed the stack has duplicated data when hard fault happens. Those may be data that got pushed twice. Since there are no way to write to EPSR as you said, SVC seems the only option.

    Thank you for the clarification and the code that save my day.

    Peng

Reply
  • Thank you for your timely reply. You are exactly right. That solves my confusion about why my code works abnormally only for certain programs but not others. If at the time of interrupt, the core is executing a PUSH, POP, it will do that twice and mess up the stack? Debugging my code seems confirmed the stack has duplicated data when hard fault happens. Those may be data that got pushed twice. Since there are no way to write to EPSR as you said, SVC seems the only option.

    Thank you for the clarification and the code that save my day.

    Peng

Children