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

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

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

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

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

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

RAW_U16 raw_task_create(RAW_TASK_OBJ  *task_obj, RAW_U8  *task_name,  RAW_VOID   *task_arg,
                               RAW_U8  task_prio,  RAW_U16  time_slice,  PORT_STACK  *task_stack_base,
                               RAW_U32 stack_size, RAW_TASK_ENTRY task_entry, RAW_U8 auto_start)
                                       
  {
   #if (RAW_TASK_STACK_CHECK > 0)
   PORT_STACK  *p_stack;
   RAW_U32 i;
   #endif
   
   RAW_SR_ALLOC();
   
   #if (RAW_TASK_FUNCTION_CHECK > 0)
 
   if (task_obj == 0) {
    return RAW_NULL_OBJECT;
   }
   
   if (task_prio >= CONFIG_RAW_PRIO_MAX) {
    return RAW_BYOND_MAX_PRIORITY;
   }
   
   if (task_stack_base == 0) {
    return RAW_NULL_POINTER;
   }
 
   if (task_entry == 0) {
    return RAW_NULL_POINTER;
   }
   
   #endif
 
   RAW_CRITICAL_ENTER();
   
    if (task_prio == IDLE_PRIORITY) {
     
     if (idle_task_exit) {
     
     RAW_CRITICAL_EXIT();
          return RAW_IDLE_EXIT;
      
     }
    
     idle_task_exit = 1;
   }
 
 
   RAW_CRITICAL_EXIT();
   
    raw_memset(task_obj, 0, sizeof(RAW_TASK_OBJ));
 
   #if (CONFIG_ROUND_ROBIN > 0)
   
   if (time_slice) {
    task_obj->time_total        = time_slice;
    
   }
   
   else  {
    
    task_obj->time_total        = TIME_SLICE_DEFAULT;
   }
 
   task_obj->time_slice = task_obj->time_total;
 
   #endif
   
   if (auto_start)
    task_obj->task_state = RAW_RDY;
   else
    task_obj->task_state = RAW_SUSPENDED;
 
 
   #if (RAW_TASK_STACK_CHECK > 0)
   
   task_obj->task_stack_base = task_stack_base;
   p_stack = task_stack_base;
   
      for (i = 0; i < stack_size; i++) {                          
       *p_stack++ =0;                                           
               
   }
    
   #endif
 
   task_obj->task_stack  = port_stack_init(task_stack_base, stack_size, task_arg, task_entry);
   task_obj->task_name   = task_name;
   task_obj->priority    = task_prio;
 
   task_create_hook(task_obj);
 
 
   RAW_CRITICAL_ENTER();
   
   #if (RAW_TASK_STACK_CHECK > 0)
   task_obj->stack_size = stack_size;
   list_insert(&task_head, &task_obj->stack_check_list);
   #endif
 
   if (auto_start) {
    add_ready_list_end(&raw_ready_queue, task_obj);
   }
   
   if (raw_os_active !=  RAW_OS_RUNNING) {                 /* Return if multitasking has not started                 */
    RAW_CRITICAL_EXIT();
    return RAW_OS_STOPPED;
   }
 
   RAW_CRITICAL_EXIT();
   
   if (auto_start) {
    raw_sched();
   }
   
   return RAW_SUCCESS;
           
  }
 

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号