開發紀錄(A)
2015q3 Homework8 Due: 2015/11/23
  • 修改 mini-arm-os 的 07-Threads (不要增加新的目錄!),在 Homework #7 的基礎上,實做 priority scheduling
 
  • 設定 qemu 的路徑,假設 qemu_stm32 目錄位於 $HOME/workspace 裡面
export PATH=~/workspace/qemu_stm32/arm-softmmu:$PATH
 

Priority scheduling

優先權較高(1 > 2 > 3)的會有較大機率被執行
 
一開始作業剛出來的時候,寫出來的priority scheduling版本不是很理想,會停在最高優先權的Task,然後就其他優先權較低的就再也不被執行QQ
 
在1/8課堂code review時,+莊彥宣同學分享了實作的方法,於是我參考他的方法改進我先前的作法,概念是利用一個輪轉表,然後分配輪轉表裡面的值來當作priority,輪轉表裡面的值優先權較高的出現比較多次
static int task_order[MAX_ORDER] = {3, 1, 2, 1, 1, 1, 1, 2, 2};
然後不斷去比對task的priority是否跟輪轉表目前的值相同,如果相同就切換Task
       for (lastTask = 0; lastTask < MAX_TASKS; lastTask++) {
           if (task_order[robin] == now) {
               robin++;
               if (robin == MAX_ORDER)
                   robin = 0;
           }
           if (tasks[lastTask].priority == task_order[robin] && tasks[lastTask].in_use) {
               /* Move the task's stack pointer address into r0 */
               /* Restore the new task's context and jump to the task */
               asm volatile("mov r0, %0\n"
                            "ldmia r0!, {r4-r11, lr}\n"
                            "msr psp, r0\n"
                            "bx lr\n"
                             : : "r" (tasks[lastTask].stack));
               now = task_order[robin];
               robin++;
               lastTask++;
               if (robin == MAX_ORDER)
                   robin = 0;
           }        
       }
修改之後的結果合理多了,優先權低的Task不會在被忽略的,以下為執行結果
可以很明顯看見:執行時間 Task1 > Task2 > Task3,
符合優先權的設定:Task1 = 1,Task2 = 2,Task3 = 3