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.