恢复函数其实就是挂起函数的逆向操作。如果任务没有被挂起,那么什么也不用做。否则就需要把任务的状态修改为对应的非挂起状态,当然该就绪的线程还得加入到就绪队列当中去。同时在函数结束之前不忘调度一下,说不定刚刚释放的这个线程就是优先级最高的那个线程。
RAW_U16 raw_task_delete(RAW_TASK_OBJ *task_ptr) { RAW_SR_ALLOC(); #if (RAW_TASK_FUNCTION_CHECK > 0) if (task_ptr == 0) { return RAW_NULL_OBJECT; } if (raw_int_nesting) { return RAW_NOT_CALLED_BY_ISR; } #endif if (task_ptr->priority == IDLE_PRIORITY) { return RAW_DELETE_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: remove_ready_list(&raw_ready_queue, task_ptr); break; case RAW_SUSPENDED: break; case RAW_DLY: /* Task is only delayed, not on any wait list */ case RAW_DLY_SUSPENDED: tick_list_remove(task_ptr); break; case RAW_PEND: case RAW_PEND_SUSPENDED: case RAW_PEND_TIMEOUT: case RAW_PEND_TIMEOUT_SUSPENDED: tick_list_remove(task_ptr); list_delete(&task_ptr->task_list); break; default: #if (CONFIG_RAW_ASSERT > 0) RAW_ASSERT(0); #endif RAW_CRITICAL_EXIT(); return RAW_STATE_UNKNOWN; } task_ptr->task_state = RAW_DELETED; #if (RAW_TASK_STACK_CHECK > 0) /*make after_delete_list to right position*/ after_delete_list = task_ptr->stack_check_list.next; if (after_delete_list == &task_head) { after_delete_list = task_head.next; } list_delete(&task_ptr->stack_check_list); #endif RAW_CRITICAL_EXIT(); raw_sched(); return RAW_SUCCESS; } |
删除函数的动作其实是比较残忍的,因为此时你不清楚线程已经执行到哪一步了,拥有了那些资源,正在处理哪些资源,所以没事不要用这个函数。这里做的只是把任务从就绪队列、等待队列和阻塞队列清除出来,但是真正善后的工作要比这多得多,如果有兴趣,你看看linux的exit函数就明白了。
相关链接: