![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
七。任务调度分析:
μC/OS-Ⅱ提供最简单的实时内核任务调度,算法简单,因此也只支持优先级抢占任务调度,不支持时间片轮训调度算法,不支持优先级逆转。
μC/OS-Ⅱ总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。
μC/OS-Ⅱ任务调度所花的时间是常数,与应用程序中建立的任务数无关。
在μC/OS中曾经是先得到OSTCBHighRdy然后和OSTCBCur做比较。因为这个比较是两个指针型变量的比较,在8位和一些16位微处理器中这种比较相对较慢。而在μC/OS-Ⅱ中是两个整数的比较。并且,除非用户实际需要做任务切换,在查任务控制块优先级表OSTCBPrioTbl[]时,不需要用指针变量来查OSTCBHighRdy.综合这两项改进,即用整数比较代替指针的比较和当需要任务切换时再查表,使得μC/OS-Ⅱ比μC/OS在8位和一些16位微处理器上要更快一些。
为实现任务切换,OSTCBHighRdy必须指向优先级最高的那个任务控制块OS_TCB,这是通过将以OSPrioHighRdy为下标的OSTCBPrioTbl[]数组中的那个元素赋给OSTCBHighRdy来实现的[L3.8(4)].最后宏调用OS_TASK_SW()来完成实际上的任务切换[L3.8(6)].
任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在μC/OS-Ⅱ中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,μC/OS-Ⅱ运行就绪态的任务所要做的一切,只是恢复所有的CPU寄存器并运行中断返回指令。为了做任务切换,运行OS_TASK_SW(),人为模仿了一次中断。多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。中断服务子程序或陷阱处理(Traphardler),也称作事故处理(exceptionhandler),必须提供中断向量给汇编语言函数OSCtxSw()。OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务。
OSSched()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防止中断服务子程序把一个或几个任务的就绪位置位,中断是被关掉的。为缩短切换时间,OSSched()全部代码都可以用汇编语言写。为增加可读性,可移植性和将汇编语言代码最少化,OSSched()是用C写的。
任务切换的相关函数:与CPU体系相关,汇编完成。
1.OSStartHighRdy()执行优先级最高的任务
2.OSCtxSw()完成任务的上下文切换
3.OSIntCtxSw()中断后的上下文切换
4.OSTickISR()中断服务程序启动
八。UC/OS-II的初始化:
OSInit()建立空闲任务idletask,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低。
这两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。换句话说,OSTCBList总是指向最后建立的那个任务。链的终点指向空字符NULL(也就是零)。
因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl[]中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp中只有1位是设为1的。
μC/OS-Ⅱ还初始化了4个空数据结构缓冲区,如图F3.8所示。每个缓冲区都是单向链表,允许μC/OS-Ⅱ从缓冲区中迅速得到或释放一个缓冲区中的元素。控制块OS_TCB的数目也就自动确定了。当然,包括足够的任务控制块分配给统计任务和空闲任务。
UC/OS-II内核调度分析vxWorks内核调度分析
1.只支持基于优先级的抢占式调度算法,不支持时间片轮训;
2.64个优先级,只能创建64个任务,用户只能创建56个任务;
3.每个任务优先级都不相同。
4.不支持优先级逆转;
5.READY队列通过内存映射表实现快速查询。效率非常高;
6.支持时钟节拍;
7.支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;
8.支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;9.每个任务有自己的堆栈,堆栈大小用户自己设定;
10.支持动态修改任务优先级;
11.任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;
12.任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;
13.任务的总个数(OS_MAX_TASKS)由用户决定;
14.0优先级最高,63优先级最低;
15.有一个优先级最低的空闲任务,在没有用户任务运行的时候运行
1.根据用户指定,动态分配堆栈,可以创建任意多个任务;
2.任务的优先级从0--255,0优先级最高,允许多个任务相同优先级;
3.支持优先级逆转,TCB保存两个优先级;
4.支持抢占与时间片轮训的任务调度方式;
5.支持中断嵌套,中断使用专用的堆栈保存上下文;
6.队列采用FIFO或者优先级的双向链表实现;
7.系统没有空闲任务执行;
8.采用工作队列workQword的方式调度;
9.任务是基于类,对象的管理方式;
10.任务的TCB保存在任务的堆栈里;
11.每个任务有自己的堆栈,堆栈大小用户自己设定;
12.支持动态修改任务优先级;
13.通过编译开关实现对多cpu体系结构的支持。 |
|