FreeRTOS help with the time to active semapho

gary10es wrote on Monday, January 18, 2010:

Hello everybody

I need to improve the time to activate a Semaphore from the ISR. I don’t known what solution to apply.  The time is about 70 microsecond, maybe because there is a change of task.

Can i implement a different semaphore more fast?
Is there another alternative?

Another question. If the interrupt can´t switch the context, can i delete this sentences  portENTER_SWITCHING_ISR(); ?

Thank
Oliver

Code:

/**************************** INTERRUPT **********************/
_attribute__((__noinline__))
static portBASE_TYPE eic_int_handler_NonNakedBehaviour( void )
{
  portBASE_TYPE retstatus;
  portBASE_TYPE xTaskWoken = pdFALSE;

       /* Because FreeRTOS is not supposed to run with nested interrupts, put all OS
            calls in a critical section . */
            portENTER_CRITICAL();
            retstatus=xSemaphoreGiveFromISR( xSemaphoreReceived, xTaskWoken );
            portEXIT_CRITICAL();
       /* The return value will be used by portEXIT_SWITCHING_ISR() to know if it
                        should perform a vTaskSwitchContext(). */

               if (retstatus)
                xTaskWoken = pdTRUE;

      eic_clear_interrupt_line(&AVR32_EIC, EXT_INT2);
      return (xTaskWoken);
}

__attribute__((__naked__))
void eic_int_handler( void )
{
   /* This ISR can cause a context switch, so the first statement must be a
     call to the portENTER_SWITCHING_ISR() macro.  This must be BEFORE any
     variable declarations. */
     portENTER_SWITCHING_ISR();

     eic_int_handler_NonNakedBehaviour();

     /* Exit the ISR.  If a task was woken then a context switch will occur. */
     portEXIT_SWITCHING_ISR();
}

/************* TASK ******************/
static portTASK_FUNCTION( vTxRxPCUTask, pvParameters )
{

( void ) pvParameters;

   //first thing to do Take the Semaphore
   xSemaphoreTake(xSemaphoreReceived,portMAX_DELAY);

   while(1)
   {
     //wait for ISR free the semaphore
     xSemaphoreTake(xSemaphoreReceived,portMAX_DELAY);

          //Rest of the code
          …….
         }
}

davedoors wrote on Monday, January 18, 2010:

I don’t recognize this code, but generally taskENTER_CRITICAL() and taskEXIT_CRITICAL() should not be called from an interrupt. You might consider implementing portSET_INTERRUPT_MASK_FROM_ISR() and portCLEAR_INTERRUPT_MASK_FROM_ISR() which are intended for this type of scenario. If they are not defined then they are just removed using #defines.

gary10es wrote on Monday, January 18, 2010:

I have an AVR32  in EVK1100. In all example always appear these sentences.

If  i don´t change of  task in the interrupt, and i don´t call any function of S.O i have deleted this portENTER_CRITICAL(); and portEXIT_CRITICAL();. It´s work! but i don’t known if i can delete portENTER_SWITCHING_ISR(); and portEXIT_SWITCHING_ISR(); too. may i delete this sentences?

By the other hand, i want to improve the time beetwen the semaphore from it is given to it is taken
Can i create a little code for to comunicate the interrupt with task as soon as posible. this is my problem i have wasted 70 microsecond.

Thanks
Oliver

Thanks
Oscar