读书人

嵌入式操作系统内核原理跟开发(线程状

发布时间: 2012-10-21 09:00:07 作者: rapoo

嵌入式操作系统内核原理和开发(线程状态)


【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

从第一篇的os博客以来,谈了很多内容,有中断、切换、调度、内存、互斥和延时等等,但是线程的状态却没有涉及到,今天我们要好好说一说。说到线程的状态,按照一般的说法,主要包括就绪、延时、阻塞、阻塞超时四个状态。如果线程没有死亡的话,那么这几个状态也够用了,但是我们后来发现可能需要对某些线程进行挂起处理,这可能是出现了故障或者是为了调试使用。因此,除了上面的四个状态,我们还要补充对应的四个挂起状态,分别是挂起、延时挂起、阻塞挂起、阻塞延时挂起。


说到了线程状态,下面我们就看看常见的线程处理函数有哪些,无外乎线程创建、线程延时、线程挂起、线程恢复和线程删除等等。

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函数就明白了。




读书人网 >操作系统

热点推荐