Context switch from co-routine

Posted by Andrei on July 30, 2011
Hi all.

static void __interrupt __far vExampleInterruptHandler( void )
{
...
crQUEUE_RECEIVE_FROM_ISR( xIntegerQueue,
&ulReceivedNumber,
&pxCoRoutineWoken );

if( pxCoRoutineWoken == pdTRUE )
{
// HOW CAN I "MANUALLY" SWITCH TO OTHER CO-ROUTINE WITH HIGHER PRIORITY ?????
}
}


Can I use vCoRoutineSchedule() API function???

Thanks.

RE: Context switch from co-routine

Posted by Richard Damon on July 30, 2011
Note that co-routines do not support preemption, so the interrupt can't change which co-routine is running.

RE: Context switch from co-routine

Posted by Andrei on July 31, 2011
To richard_damon:

But I can change current coroutine to other by call crDELAY(xHandle, 0);
It will be correct, if I could do the same from ISR...

How to use parameter pxCoRoutineWoken in crQUEUE_RECEIVE_FROM_ISR() API function?
What for is this parameter?

Thanks.

RE: Context switch from co-routine

Posted by Richard Damon on July 31, 2011
Since Co-Routines do not support pre-emption, the switch between co-routines occurs when the co-routine calls an API function. They don't save enough state to allow a co-routine to be interrupted at another point and the flow of execution changed (to another co-routine). In effect, all the co-routines in a program fall within a single task, and that task can be pre-empted, so another task can run. This is what the Woken flag controls, should the "co-routine" task be woken by the interrupt.