Context swicht on PIC32

jarielmar wrote on Thursday, February 05, 2009:

How can I force a context swicht after xSemaphoreGiveFromISR funtion return value equal pdTRUE in interrup handler on PIC32?.

What happens if the return value equal pdFALSE?. What does mean?.What should I do in this case?.

rtel wrote on Thursday, February 05, 2009:

> How can I force a context swicht after xSemaphoreGiveFromISR
> funtion return value equal pdTRUE in interrup handler on PIC32?.

A context switch should be forced if the last parameter to the xSemaphoreGiveFromISR() function is set to true within the function itself.  On the PIC32 this is done using the portEND_SWITCHING_ISR() macro as follows:

/////////////////
/* Initialise xHigherPriorityTaskWoken to false. */
xHigherPriorityTaskWoken = pdFALSE;

/* Call the API function, passing in the address of
xHigherPriorityTaskWoken. */
xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );

/* Call the macro, passing in the value of xHigherPriorityTaskWoken.
If the semaphore caused a task to unblock, and the task that unblocked
Has a priority greater than the current task, then
xHigherPriorityTaskWoken will now be true and the macro will cause a
context switch. */
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
/////////////////

See the file FreeRTOS\Demo\PIC32MX_MPLAB\serial\serial.c for a full example.

>
> What happens if the return value equal pdFALSE?. What does
> mean?.What should I do in this case?.

If pdFALSE is returned from the function itself then the semaphore could not be given because the semaphore already existed.  In other words, nothing had taken the semaphore so the semaphore was already there.  This is talking about the function return value though, not the value returned in xHigherPriorityTaskWoken.  See http://www.freertos.org/a00124.html for an example, but note in this example the macro used to yield is called something else.

Regards.