嵌入式操作系统内核原理和开发(实时调度).pdf
《嵌入式操作系统内核原理和开发(实时调度).pdf》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发(实时调度).pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 嵌入式操作系统内核原理和开发(实时调度)嵌入式操作系统内核原理和开发(实时调度)和很多通用的操作系统相比,实时操作系统有自己的一个特点,那就是实时调度。通用操作系统的线程优先级一般是可以变化的,而实时系统的线程优先级却是不变的。之所以这么设计,是为了保证高优先级的任务在第一时间获得调度,这样才能保证调度的实时性。因为实时系统是严格按照优先级搞定调度的,所以不管什么时候,我们只要寻找到最高优先级的任务即可。rawos 系统可以支持 256 个优先级,对任务的创建个数也没有限制,所以就会出现多个任务共享一个优先级的情况。因
2、此系统本身对同优先级的任务分配了定额的时间片,一旦该任务时间片用完,就会被放到优先级的末尾,直到获得下一次的调度机会,下面的代码就说明了这一情况,它是在时钟中断的时候被调度的,cpp view plaincopy 1.void caculate_time_slice()2.3.RAW_TASK_OBJ *task_ptr;4.LIST*head;5.6.RAW_SR_ALLOC();7.8.task_ptr=raw_task_active;9.head=&raw_ready_queue.task_ready_listtask_ptr-priority;10.11.RAW_CRITICAL_EN
3、TER();12.13.if(is_list_empty(head)14.15.RAW_CRITICAL_EXIT();16.return;17.18.19./*there is only one task on this ready list,so do not need to caculate time slice*/20.if(head-next-next=head)21.22.RAW_CRITICAL_EXIT();23.return;24.25.26.27.if(task_ptr-time_slice)本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 28.
4、task_ptr-time_slice-;29.30.31./*if current active task has time_slice,just return*/32.if(task_ptr-time_slice)33.RAW_CRITICAL_EXIT();34.return;35.36.37./*Move current active task to the end of ready list for the same priority*/38.move_to_ready_list_end(&raw_ready_queue,task_ptr);39.40./*restore the t
5、ask time slice*/41.task_ptr-time_slice=task_ptr-time_total;42.43.RAW_CRITICAL_EXIT();44.45.上面说的是一个优先级下面有多个任务的情况,如果优先级本身只有一个任务,那么就很抱歉了,下面还得继续运行这个任务。另外,我们在 windows 上面编程的时候喜欢暂时释放线程的运行权利,调用 sleep(0)即可,那么这在 rawos 上是怎么实现的呢,cpp view plaincopy 1.RAW_U16 raw_sleep(RAW_U32 dly)2.3.RAW_U16 error_status;4.5.RAW
6、_SR_ALLOC();6.7.#if(RAW_TASK_FUNCTION_CHECK 0)8.9.if(raw_int_nesting)10.11.return RAW_NOT_CALLED_BY_ISR;12.13.#endif 14.15.RAW_CRITICAL_ENTER();16.17.if (dly)18.19./*system is locked so task can not sleep just return immediately*/本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 20.if(raw_sched_lock)21.RAW_CRIT
7、ICAL_EXIT();22.return RAW_SCHED_DISABLE;23.24.25.raw_task_active-task_state=RAW_DLY;26.27.tick_list_insert(raw_task_active,dly);28.29.remove_ready_list(&raw_ready_queue,raw_task_active);30.31.32.else 33./*make current task to the end of ready list*/34.move_to_ready_list_end(&raw_ready_queue,raw_task
8、_active);35.36.37.RAW_CRITICAL_EXIT();38.39.raw_sched();40.41.if(dly)42./*task is timeout after sleep*/43.error_status=block_state_post_process(raw_task_active,0);44.45.46.else 47.48.error_status=RAW_SUCCESS;49.50.51.52.return error_status;53.54.通过的上面的代码,我们可以看到其实系统啥也没干,只是把任务方法放到优先级的链表末尾了。因为我们的系统需要实时
9、调度,所以即使把使用权出让出来,也不可能让低优先的任务运行,只能让同优先级的其他任务运行了。当然,同优先级没有其他任务的时候,只好它自己继续玩了。说了这么多,我们看看系统是怎么调度的,cpp view plaincopy 1.void raw_sched()2.本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 3.RAW_SR_ALLOC();4.5./*if it is in interrupt or system is locked,just return*/6.if(raw_int_nesting|raw_sched_lock)7.return;8.9.10.R
10、AW_CRITICAL_ENTER();11.12.13.get_ready_task(&raw_ready_queue);14.15./*if highest task is currently task,then no need to do switch and just return*/16.if(high_ready_obj=raw_task_active)17.RAW_CRITICAL_EXIT();18.return;19.20.21.CONTEXT_SWITCH();22.RAW_CRITICAL_EXIT();23.24.25.这个函数看上去很长,其实最重要的部分就是 get_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 操作系统 内核 原理 开发 实时 调度
限制150内