sched_init()应该在kernel_start()中先初始化好。接下来的就是任务调度
当前的调度不考虑优先级,只是平均的对每个任务做好时间片的切分,支持任务的sleep
主要流程:逐个扫描任务表中的每个任务,如果该任务没有启动,则跳过,如果该任务有安排sleep,则刷新sleep时间;扫描完成后试着找出所有任务中counter计数器最大的那个任务,如果有这个任务,返回该任务的id,如果没有这种任务,说明所有的任务的counter都用完了,则刷新任务的counter计数器到满值:10,然后重新做扫描找出所有任务中counter计数器最大的那个任务并返回该任务的id。
unsigned int schedule(void)
{
unsigned int i, next;
int c;
task_tbl_t *p;
while(1){
c = -1;
for( i = 0; i <= MAX_TASK_NUMBER;i++) {
p = &g_task_tbl[i];
if( ( p->task_id == i ) && p->task_func_p ) {
if( p->sleep_time > 0 ) {
p->sleep_time--;
continue;
}
if( p->counter > c ) {
c = p->counter;
next = i;
}
}
}
if(c) {
break;
}