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

上传人:kms****20 文档编号:39821365 上传时间:2018-05-20 格式:DOC 页数:11 大小:160.50KB
返回 下载 相关 举报
嵌入式操作系统内核原理和开发(线程状态)_第1页
第1页 / 共11页
嵌入式操作系统内核原理和开发(线程状态)_第2页
第2页 / 共11页
嵌入式操作系统内核原理和开发(线程状态)_第3页
第3页 / 共11页
嵌入式操作系统内核原理和开发(线程状态)_第4页
第4页 / 共11页
嵌入式操作系统内核原理和开发(线程状态)_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《嵌入式操作系统内核原理和开发(线程状态)》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发(线程状态)(11页珍藏版)》请在金锄头文库上搜索。

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

2、们就看看常见的线程处理函数有哪些,无外乎线程创建、线程延时、线程挂起、线程恢复和线程删除等等。 cpp view plaincopyRAW_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_

3、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_entr

4、y = 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_t

5、otal = 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_bas

6、e; p_stack = task_stack_base; for (i = 0; i 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;

7、 list_insert( #endif if (auto_start) add_ready_list_end( 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; 创建线程的函数是比较复杂的,内容长一些,参数

8、也多一些。首先看看有哪些参数, 虽然很多,但是慢慢梳理一下也不难理解,有名称、参数、优先级、时间片、堆栈起始指 针、堆栈大小、入口函数和标志。整个函数基本上都是赋值的过程,最重要的其实就两个 部分,一个是 port_stack_init,另一个就是 add_ready_list_end。前者可以对堆栈进行默 认处理,比如压入一些寄存器、压入函数参数、函数指针等等,后者就是把线程加入到就 绪队列。cpp view plaincopy RAW_U16 raw_sleep(RAW_U32 dly) RAW_U16 error_status; RAW_SR_ALLOC(); #if (RAW_TASK

9、_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; 软件英才网 软件行业驰名招聘网站有需要请

10、联系我们 tick_list_insert(raw_task_active, dly); remove_ready_list( else /*make current task to the end of ready list*/ move_to_ready_list_end( 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; 我们之前也介绍过系统的延时功能。延时,就是把线程暂时从就绪队列清除出来,添加到延时队列中。当然如果参数为0,那表示作者只是希望暂时释放 cpu 的使用权,如果此时没有同等优先级的任务,那么下一个运行的线程还是它自己。 cpp view plaincopy RAW_U16 raw_task_suspend(RAW_TASK

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号