開發紀錄 Homework #7 #8
 
  •  修改 mini-arm-os 的 07-Threads (不要增加新的目錄!),在 Homework #7 的基礎上,實做 priority scheduling
 
Priority Scheduling
我的理解是 thread 在切換時會檢查 priority,比較高的priority 就會去做他的 thread
 
程式碼
從下面程式碼來看,決定哪一個task要做的是透過
asm volatile("mov r0, %0\n" : : "r" (tasks[lastTask % total_task].stack));
所以只要在上面判斷 priority 去決定要執行哪一個 task,在使用上述組語即可達成 priority scheduling 
 
void __attribute__((naked)) pendsv_handler()
{
        /* Save the old task's context */
        asm volatile("mrs   r0, psp\n"
                     "stmdb r0!, {r4-r11, lr}\n");
        /* To get the task pointer address from result r0 */
        asm volatile("mov   %0, r0\n" : "=r" (tasks[lastTask].stack));
 
        /* Find a new task to run */
        while (1) {
                lastTask++;
                if (lastTask == MAX_TASKS)
                        lastTask = 0;
 
                if ((lastTask != 0) && \
                        (tasks[(lastTask - 1) % total_task].priority > tasks[lastTask % total_task].priority) && \
                        tasks[(lastTask - 1) % total_task].in_use ) {
                        /* Move the task's stack pointer address into r0 */
                        lastTask--;
                        asm volatile("mov r0, %0\n" : : "r" (tasks[lastTask % total_task].stack));
                        /* Restore the new task's context and jump to the task */
                        asm volatile("ldmia r0!, {r4-r11, lr}\n"
                                     "msr psp, r0\n"
                                     "bx lr\n");
 
                } else if (tasks[lastTask].in_use) {
                        /* Move the task's stack pointer address into r0 */
                        asm volatile("mov r0, %0\n" : : "r" (tasks[lastTask % total_task].stack));
                         /* Restore the new task's context and jump to the task */
                        asm volatile("ldmia r0!, {r4-r11, lr}\n"
                                     "msr psp, r0\n"
                                     "bx lr\n");
                }
        }
}