废话不多说,直接上源码:
while (1) { c = -1; next = 0; i = NR_TASKS; p = &task[NR_TASKS]; // 这段代码也是从任务数组的最后一个任务开始循环处理,并跳过不含任务的任务槽。比较每个就绪 // 状态任务的 counter(任务运行时间的递减滴答计数)值,哪一个值大,运行时间还不长,next 就 // 指向哪个的任务号。 while (--i) { if (!*--p) continue; if ((*p)->state== TASK_RUNNING&& (*p)->counter > c) c = (*p)->counter, next = i; } // 如果比较得出有counter 值大于 0 的结果,则退出 124行开始的循环,执行任务切换(141 行)。 if (c) break; // 否则就根据每个任务的优先权值,更新每一个任务的 counter值,然后回到 125 行重新比较。 // counter值的计算方式为 counter = counter /2 + priority。[右边 counter=0??] for(p = &LAST_TASK; p > &FIRST_TASK; --p) if (*p) (*p)->counter = ((*p)->counter >> 1) + (*p)->priority; } switch_to(next); // 切换到任务号为 next 的任务,并运行之。 }