我们之前也介绍过系统的延时功能。延时,就是把线程暂时从就绪队列清除出来,添加到延时队列中。当然如果参数为0,那表示作者只是希望暂时释放cpu的使用权,如果此时没有同等优先级的任务,那么下一个运行的线程还是它自己。
RAW_U16 raw_task_suspend(RAW_TASK_OBJ *task_ptr) { RAW_SR_ALLOC(); #if (RAW_TASK_FUNCTION_CHECK > 0) if (task_ptr == 0) { return RAW_NULL_OBJECT; } #endif if (task_ptr->priority == IDLE_PRIORITY) { return RAW_SUSPEND_TASK_NOT_ALLOWED; } RAW_CRITICAL_ENTER(); if (task_ptr == raw_task_active) { if (raw_sched_lock) { RAW_CRITICAL_EXIT(); return RAW_SCHED_LOCKED; } } switch (task_ptr->task_state) { case RAW_RDY: task_ptr->task_state = RAW_SUSPENDED; remove_ready_list(&raw_ready_queue, task_ptr); break; case RAW_DLY: task_ptr->task_state = RAW_DLY_SUSPENDED; break; case RAW_PEND: task_ptr->task_state = RAW_PEND_SUSPENDED; break; case RAW_PEND_TIMEOUT: task_ptr->task_state = RAW_PEND_TIMEOUT_SUSPENDED; break; case RAW_DLY_SUSPENDED: case RAW_PEND_SUSPENDED: case RAW_PEND_TIMEOUT_SUSPENDED: RAW_CRITICAL_EXIT(); return RAW_SUSPENDED_AGAIN; default: #if (CONFIG_RAW_ASSERT > 0) RAW_ASSERT(0); #endif RAW_CRITICAL_EXIT(); return RAW_STATE_UNKNOWN; } RAW_CRITICAL_EXIT(); raw_sched(); return RAW_SUCCESS; } |