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

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

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

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

分享:

  创建线程的函数是比较复杂的,内容长一些,参数也多一些。首先看看有哪些参数,虽然很多,但是慢慢梳理一下也不难理解,有名称、参数、优先级、时间片、堆栈起始指针、堆栈大小、入口函数和标志。整个函数基本上都是赋值的过程,最重要的其实就两个部分,一个是port_stack_init,另一个就是add_ready_list_end。前者可以对堆栈进行默认处理,比如压入一些寄存器、压入函数参数、函数指针等等,后者就是把线程加入到就绪队列。

RAW_U16  raw_sleep(RAW_U32  dly)
  {
   RAW_U16 error_status;
   
   RAW_SR_ALLOC();
 
   #if (RAW_TASK_FUNCTION_CHECK > 0)
   
   if (raw_int_nesting) {
    
    return RAW_NOT_CALLED_BY_ISR;
   }
   #endif  
    
   RAW_CRITICAL_ENTER();
 
   if  (dly) {
 
    /*system is locked so task can not sleep just return immediately*/
    if (raw_sched_lock) {  
     RAW_CRITICAL_EXIT(); 
     return RAW_SCHED_DISABLE;
    }
 
    raw_task_active->task_state = RAW_DLY;
 
    tick_list_insert(raw_task_active, dly);
              
    remove_ready_list(&raw_ready_queue, raw_task_active);
   }
   
   else { 
    /*make current task to the end of ready list*/
     move_to_ready_list_end(&raw_ready_queue, raw_task_active);
   }
 
   RAW_CRITICAL_EXIT();
 
   raw_sched();  
 
   if (dly) {
    /*task is timeout after sleep*/
    error_status = block_state_post_process(raw_task_active, 0);
   }
 
   else {
    
    error_status = RAW_SUCCESS;
 
   }
   
   return error_status;
  }
 

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号