Scheduler behavior in non-preemptive mode
I have a non-preemptive port of FreeRTOS and there there are totally three tasks:
tskIDLE_PRIORITY = 0
Idle, tskIDLE_PRIORITY
Task 1, tskIDLE_PRIORITY + 1
Task 2, tskIDLE_PRIORITY + 2
Task 1 and 2 is created using the same function:
portTASK_FUNCTION(task_proc, params)
{
unsigned id = *(unsigned*) params;
while (1) {
printf("*%d* ", id);
taskYIELD();
}
}
But Task 1 *never* gets a chance to run. After reading vTaskSwitchContext(), I found that Task 1 is starved because Task 2 is *always* in the ready list, and uxTopReadyPriority is always 2.
Is this behavior expected?
--
Tzu-Chien Chiu – SMedia Technology Corp.
URL: http://www.csie.nctu.edu.tw/~jwchiu/
Scheduler behavior in non-preemptive mode
Yes, this would be expected because task 2 never blocks. It is always the highest priority task that is able to run.
If you replaced taskYIELD() with vTaskDelay( 2 ), then task 2 would block for 2 ticks, allowing task 1 to execute.