嵌入式操作系统内核原理和开发

上传人:hs****ma 文档编号:564684031 上传时间:2024-02-14 格式:DOCX 页数:11 大小:34.55KB
返回 下载 相关 举报
嵌入式操作系统内核原理和开发_第1页
第1页 / 共11页
嵌入式操作系统内核原理和开发_第2页
第2页 / 共11页
嵌入式操作系统内核原理和开发_第3页
第3页 / 共11页
嵌入式操作系统内核原理和开发_第4页
第4页 / 共11页
嵌入式操作系统内核原理和开发_第5页
第5页 / 共11页
点击查看更多>>
资源描述

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

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

2、删除等等。1 RAW_U16 raw_task_create(RAW_TASK_OBJ *task_obj, RAW_U8 *task_name, RAW_V0ID *task_arg,2 RAW_U8ask_prio, RAW_U16 time_slice, PORT_STACK *task_stack_base,3 RAW_U32 stack_size, RAW_TASK_ENTRY task_entry, RAW_U8 auto_start)44 5 #if (RAW_TASK_STACK_CHECK 0)6 PORT_STACK *p_stack;7 RAW_U32 i;8 #endi

3、f109 RAW_SR_ALLOC();1210 #if (RAW_TASK_FUNCTION_CHECK 0)1411 if (task_obj = 0) 12 return RAW_NULL_OBJECT;13 1814 if (task_prio = CONFIG_RAW_PRIO_MAX) 15 return RAW_BYOND_MAX_PRIORITY;16 2223 if (task_stack_base = 0) 24 return RAW_NULL_POINTER;252627282930313233343536373839404142434445464748495051525

4、35455565758596061626364656667if (task_entry = 0) return RAW_NULL_POINTER;#endifRAW_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

5、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;#endif68 if (auto_start)69 task_obj-task_state = RAW_RDY;70 else71 task_obj-task_state = RAW_SUSPENDED;727372 #if (RAW_TASK_STACK_CHECK 0)7576 task_obj-task_stack_

6、base = task_stack_base;p_stack = task_stack_base;7879 for (i = 0; i task_stack=port_stack_init(task_stack_base, stack_size,task_arg, task_entry);86 task_obj-task_name=task_name;87 task_obj-priority = task_prio;8988 task_create_hook(task_obj);919289 RAW_CRITICAL_ENTER();9490 #if (RAW_TASK_STACK_CHECK

7、 0)91 task_obj-stack_size = stack_size;92 list_insert(&task_head, &task_obj-stack_check_list);93 #endif9994 if (auto_start) 95 add_ready_list_end(&raw_ready_queue, task_obj);96 10397 if (raw_os_active != RAW_OS_RUNNING) /* Return ifmultitasking has not started*/98 RAW_CRITICAL_EXIT();99 return RAW_O

8、S_STOPPED;100 轨件英才网soit. job1 001 .com109RAW_CRITICAL_EXIT();110111112if (auto_start) raw_sched();113 114114 return RAW_SUCCESS;116115 118创建线程的函数是比较复杂的,内容长一些,参数也多一些。首先看看有哪些参数,虽 然很多,但是慢慢梳理一下也不难理解,有名称、参数、优先级、时间片、堆栈起始指针、 堆栈大小、入口函数和标志。整个函数基本上都是赋值的过程,最重要的其实就两个部分, 一个是port_stack_init,另一个就是add_ready_list_en

9、d。前者可以对堆栈进行默认处理, 比如压入一些寄存器、压入函数参数、函数指针等等,后者就是把线程加入到就绪队列。116 RAW_U16 raw_sleep(RAW_U32 dly)117 118 RAW_U16 error_status;122119 RAW_SR_ALLOC();124120 #if (RAW_TASK_FUNCTION_CHECK 0)126121 if (raw_int_nesting) 128122 return RAW_NOT_CALLED_BY_ISR;123 124 #endif132125 RAW_CRITICAL_ENTER();134126 if (dly)

10、 136127 /*system is locked so task can not sleep just return immediately*/128 if (raw_sched_lock) 129 RAW_CRITICAL_EXIT();130 return RAW_SCHED_DISABLE;131 142143raw_task_active-task_state = RAW_DLY;144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177

11、178179180181182183tick_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_sta

12、tus = block_state_post_process(raw_task_active, 0); else error_status = RAW_SUCCESS;return error_status;RAW_U16 raw_task_suspend(RAW_TASK_OBJ *task_ptr)RAW_SR_ALLOC();#if (RAW_TASK_FUNCTION_CHECK 0)if (task_ptr = 0) return RAW_NULL_OBJECT;#endif1841851861871881891901911921931941951961971981992002012

13、02203204205206207208209210211212213214215216217218219220221222223224225226if (task_ptr-priority = IDLE_PRIORITY) return RAW_SUSPEND_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

14、RAW_RDY:task_ptr-task_state = RAW_SUSPENDED; remove_ready_list(&raw_ready_queue, task_ptr);break;case RAW_DLY:task_ptr-task_state = RAW_DLY_SUSPENDED; break;case RAW_PEND:task_ptr-task_state = RAW_PEND_SUSPENDED; break;case RAW_PEND_TIMEOUT:task_ptr-task_state = RAW_PEND_TIMEOUT_SUSPENDED; break;case RAW_DLY_SUSPEN

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

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