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
…….
}
}
FreeRTOS help with the time to active semapho
FreeRTOS help with the time to active semapho
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.
FreeRTOS help with the time to active semapho
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
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