Scheduler behavior in non-preemptive mode

tzuchien_chiu wrote on Tuesday, August 29, 2006:

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/

nobody wrote on Tuesday, August 29, 2006:

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.