电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

嵌入式操作系统内核原理和开发线程状态VIP专享VIP免费

嵌入式操作系统内核原理和开发线程状态_第1页
嵌入式操作系统内核原理和开发线程状态_第2页
嵌入式操作系统内核原理和开发线程状态_第3页
嵌入式操作系统内核原理和开发(线程状态)从第一篇的os博客以来,谈了很多内容,有中断、切换、调度、内存、互斥和延时等等,但是线程的状态却没有涉及到,今天我们要好好说一说。说到线程的状态,按照一般的说法,主要包括就绪、延时、阻塞、阻塞超时四个状态。如果线程没有死亡的话,那么这几个状态也够用了,但是我们后来发现可能需要对某些线程进行挂起处理,这可能是出现了故障或者是为了调试使用。因此,除了上面的四个状态,我们还要补充对应的四个挂起状态,分别是挂起、延时挂起、阻塞挂起、阻塞延时挂起。说到了线程状态,下面我们就看看常见的线程处理函数有哪些,无外乎线程创建、线程延时、线程挂起、线程恢复和线程删除等等。RAW_U16raw_task_create(RAW_TASK_OBJ*task_obj,RAW_U8*task_name,RAW_VOID*task_arg,RAW_U8task_prio,RAW_U16time_slice,PORT_STACK*task_stack_base,RAW_U32stack_size,RAW_TASK_ENTRYtask_entry,RAW_U8auto_start){#if(RAW_TASK_STACK_CHECK>0)PORT_STACK*p_stack;RAW_U32i;#endifRAW_SR_ALLOC();#if(RAW_TASK_FUNCTION_CHECK>0)if(task_obj==0){returnRAW_NULL_OBJECT;}if(task_prio>=CONFIG_RAW_PRIO_MAX){returnRAW_BYOND_MAX_PRIORITY;}if(task_stack_base==0){returnRAW_NULL_POINTER;}if(task_entry==0){returnRAW_NULL_POINTER;}#endifRAW_CRITICAL_ENTER();if(task_prio==IDLE_PRIORITY){if(idle_task_exit){RAW_CRITICAL_EXIT();returnRAW_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;#endifif(auto_start)task_obj->task_state=RAW_RDY;elsetask_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;itask_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);#endifif(auto_start){add_ready_list_end(&raw_ready_queue,task_obj);}if(raw_os_active!=RAW_OS_RUNNING){/*Returnifmultitaskinghasnotstarted*/RAW_CRITICAL_EXIT();returnRAW_OS_STOPPED;}RAW_CRITICAL_EXIT();if(auto_start){raw_sched();}returnRAW_SUCCESS;}创建线程的函数是比较复杂的,内容长一些,参数也多一些。首先看看有哪些参数,虽然很多,但是慢慢梳理一下也不难理解,有名称、参数、优先级、时间片、堆栈起始指针、堆栈大小、入口函数和标志。整个函数基本上都是赋值的过程,最重要的其实就两个部分,一个是port_stack_init,另一个就是add_ready_list_end。前者可以对堆栈进行默认处理,比如压入一些寄存器、压入函数参数、函数指针等等,后者就是把线程加入到就绪队列。RAW_U16raw_sleep(RAW_U32dly){RAW_U16error_status;RAW_SR_ALLOC();#if(RAW_TASK_FUNCTION_CHECK>0)if(raw_int_nesting){returnRAW_NOT_CALLED_BY_ISR;}#endifRAW_CRITICAL_ENTER();if(dly){/*systemislockedsotaskcannotsleepjustreturnimmediately*/if(raw_sched_lock){RAW_CRITICAL_EXIT();returnRAW_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{/*makecurrenttasktotheendofreadylist*/move_to_ready_list_end(&raw_ready_queue,raw_task_active);}RAW_CRITICAL_EXIT();raw_sched();if(dly){/*taskistimeoutaftersleep*/error_status=block_state_post_process(raw_task_active,0);}else{error_status=RAW_SUCCESS;}returnerror_status;...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部