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

发表于:2012-10-15 10:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  恢复函数其实就是挂起函数的逆向操作。如果任务没有被挂起,那么什么也不用做。否则就需要把任务的状态修改为对应的非挂起状态,当然该就绪的线程还得加入到就绪队列当中去。同时在函数结束之前不忘调度一下,说不定刚刚释放的这个线程就是优先级最高的那个线程。

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

相关链接:

嵌入式操作系统内核原理和开发(实时系统中的定时器)

55/5<12345
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号