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
…….
}
}