Context switch from co-routine

kurnits wrote on Saturday, 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.

richard_damon wrote on Saturday, July 30, 2011:

Note that co-routines do not support preemption, so the interrupt can’t change which co-routine is running.

kurnits wrote on Sunday, 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.

richard_damon wrote on Sunday, 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.