Preemption in cooperative mode?

Posted by beamer145 on December 20, 2012
Hi,

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 ?


RE: Preemption in cooperative mode?

Posted by Dave on 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?

RE: Preemption in cooperative mode?

Posted by beamer145 on December 24, 2012
You are absolutely right, the networking interrupt handler does a yield from ISR.

Thanks a *lot* for the solution !