Preemption in cooperative mode?

beamer145 wrote on Thursday, December 20, 2012:


I am using Freertos 7.1.1 in cooperative mode, but for some reason I am seeing that my tasks are pre-empted !

This was eg detected by adding a counter in the memory free function (increase at the start, decrease at the end).
Every once and a while, the function is entered while the counter is still 1  (and if I also log the taskhandle of the ‘other task already in the function’, I see that it points to another one of my  tasks in the ready state).
When letting it run a little bit longer, the counter becomes 0 again, so the other task apparently continued from within the function.

Exactly the behavior one would expect in case of a preemptive scheduler, but not with a cooperative one.

Any suggestions about what might be going on ?
The memory free function does not contain yields etc which could explain the taskswitch.

Are there other not immediately obvious ways in which a task may be preempted even in cooperative mode (except for interrupts of course).
Eg  For the xTimerCreate callback function, it is not directly clear under which task that  is called ?

davedoors wrote on Thursday, December 20, 2012:

Do any of your interrupts call a yield function directly or through a macro like portEND_SWITCHING_ISR or portYIELD_FROM_ISR?

Does your task call any API functions that would make it block?

beamer145 wrote on Monday, December 24, 2012:

You are absolutely right,  the networking interrupt handler does a yield from ISR.

Thanks a *lot* for the solution !