首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

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

2012-10-21 
嵌入式操作系统内核原理和开发(线程状态)【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxin

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


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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函数就明白了。
 




热点排行