UCOSII多任务切换例程(二)

UCOSII多任务切换例程(⼆)
五. 任务状态:
uCOS II主要有五种任务状态,睡眠态就是挂起态,阻塞态和延时态这⾥统⼀为等待状态。增加了⼀个被中断状态。UC/OS-Ⅱ总是建⽴⼀个空闲任务,这个任务在没有其它任务进⼊就绪态时投⼊运⾏。这个空闲任务[OSTaskIdle()]永远设为最低优先级空闲任务OSTaskIdle()什么也不做,只是在不停地给⼀个32位的名叫OSIdleCtr的计数器加1,统计任务使⽤这个计数器以确定现⾏应⽤软件实际消耗的CPU时间。空闲任务不可能被应⽤软件删除。
加法器电路>pinset睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理,把任务交给μC/OS-Ⅱ是通过调⽤下述两个函数之⼀:OSTaskCreate()或OSTaskCreateExt()。当任务⼀旦建⽴,这个任务就进⼊就绪态准备运⾏。任务的建⽴可以是在多任务运⾏开始之前,也可以是动态地被⼀个运⾏着的任务建⽴。如果⼀个任务是被另⼀个任务建⽴的,⽽这个任务的优先级⾼于建⽴它的那个任务,则这个刚刚建⽴的任务将⽴即得到CPU的控制权。⼀个任务可以通过调⽤OSTaskDel()返回到睡眠态,或通过调⽤该函数让另⼀个任务进⼊睡眠态。调⽤OSStart()可以启动多任务。OSStart()函数运⾏进⼊就绪态的优先级最⾼的任务。就绪的任务只有当所有优先级⾼于这个任务的任务转为等待状态,或者是被删除了,才能进⼊运⾏态。
正在运⾏的任务可以通过调⽤两个函数之⼀将⾃⾝延迟⼀段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进⼊等待状态,等待这段时间过去,下⼀个优先级最⾼的、并进⼊了就绪态的任务⽴刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数 OSTimeTick()使延迟了的任务进⼊就绪态(见3.10节,时钟节拍)。
正在运⾏的任务期待某⼀事件的发⽣时也要等待,⼿段是调⽤以下 3个函数之⼀:OSSemPend(),OSMboxPend(),或OSQPend()。调⽤后任务进⼊了等待状态(WAITING)。当任务因等待事件被挂起(Pend),下⼀个优先级最⾼的任务⽴即得到了CPU的控制权。当事件发⽣了,被挂起的任务进⼊就绪态。事件发⽣的报告可能来⾃另⼀个任务,也可能来⾃中断服务⼦程序。
正在运⾏的任务是可以被中断的,除⾮该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进⼊了中断服务态(ISR)。响应中断时,正在执⾏的任务被挂起,中断服务⼦程序控制了CPU的使⽤权。中断服务⼦程序可能会报告⼀个或多个事件的发⽣,⽽使⼀个或多个任务进⼊就绪态。在这种情况下,从中断服务⼦程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最⾼的。如果中断服务⼦程序使⼀个优先级更⾼的任务进⼊了就绪态,则新进⼊就绪态的这个优先级更⾼的任务将得以运⾏,否则原来被中断了的任务才能继续运⾏。
当所有的任务都在等待事件发⽣或等待延迟时间结束,μC/OS-Ⅱ执⾏空闲任务(idle task),执⾏OSTaskIdle()函数。
调味篮六. 任务切换:
Context Switch  在有的书中翻译成上下⽂切换,实际含义是任务切换,或CPU寄存器内容切换。当多任务内核决定运⾏另外的任务时,它保存正在运⾏任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Task’s Context Storage area),也就是任务⾃⼰的栈区之中。(见图2.2)。⼊栈⼯作完成以后,就是把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU的寄存器,并开始下⼀个任务的运⾏。这个过程叫做任务切换。任务切换过程增加了应⽤程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于 CPU有多少寄存器要⼊栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。
七. 任务调度分析:
uCOS II提供最简单的实时内核任务调度,算法简单,因此也只⽀持优先级抢占任务调度,不⽀持时间⽚轮训调度算法,不⽀持优先级逆转。
uCOS II总是运⾏进⼊就绪态任务中优先级最⾼的那⼀个。确定哪个任务优先级最⾼,下⾯该哪个任务运⾏了的⼯作是由调度器(Scheduler)完成的。任务级的调度是由函数
OSSched()完成的。中断级的调度是由另⼀个函数OSIntExt()完成的,这个函数将在以后描述。
uCOS II任务调度所花的时间是常数,与应⽤程序中建⽴的任务数⽆关。
在uCOS中曾经是先得到OSTCBHighRdy然后和OSTCBCur做⽐较。因为这个⽐较是两个指针型变量的⽐较,在8位和⼀些16位微处理器中这种⽐较相对较慢。⽽在μC/OS-Ⅱ中是两个整数的⽐较。并且,除⾮⽤户实际需要做任务切换,在查任务控制块优先级表OSTCBPrioTbl[]时,不需要⽤指针变量来查OSTCBHighRdy。综合这两项改进,即⽤整数⽐较代替指针的⽐较和当需要任务切换时再查表,使得uCOS II⽐uCOS在8位和⼀些 16位微处理器上要更快⼀些。
为实现任务切换,OSTCBHighRdy必须指向优先级最⾼的那个任务控制块OS_TCB,这是通过将以 OSPrioHighRdy为下标的OSTCBPrioTbl[]数组中的那个元素赋给OSTCBHighRdy来实现的[L3.8(4)]。最后宏调⽤ OS_TASK_SW()来完成实际上的任务切换[L3.8(6)]。
任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推⼊堆栈,然后将较⾼优先级的任务的寄存器值从栈中恢复到寄存器中。在uCOS II中,就绪任务的栈结构总是看起来跟刚刚发⽣过中断⼀样,所有微处理器的寄存器都保存在栈中。换句话说,μC/OS-Ⅱ运⾏就绪态的任务所要做的⼀切,只是恢复所有的CPU寄存器并运⾏中断返回指令。为了做任务切换,运⾏ OS_TASK_SW(),⼈为模仿了⼀次中断。多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。中断服务⼦程序或陷阱处理(Trap hardler),也称作事故处理(exception handler),必须提供中断向量给汇编语⾔
函数OSCtxSw()。 OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务。
OSSched ()的所有代码都属临界段代码。在寻进⼊就绪态的优先级最⾼的任务过程中,为防⽌中断服务⼦程序把⼀个或⼏个任务的就绪位置位,中断是被关掉的。为缩短切换时
地下水净化设备间,OSSched()全部代码都可以⽤汇编语⾔写。为增加可读性,可移植性和将汇编语⾔代码最少化,OSSched()是⽤C写的。
任务切换的相关函数:与CPU体系相关,汇编完成。
1. OSStartHighRdy() 执⾏优先级最⾼的任务
2. OSCtxSw()    完成任务的上下⽂切换
3. OSIntCtxSw()  中断后的上下⽂切换
4. OSTickISR()  中断服务程序启动
⼋. uCOS II的初始化:
OSInit()建⽴空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低。
这两个任务的任务控制块(OS_TCBs)是⽤双向链表链接在⼀起的。OSTCBList指向这个链表的起始处。当建⽴⼀个任务时,这个任务总是被放在这个链表的起始处。换句话
说,OSTCBList总是指向最后建⽴的那个任务。链的终点指向空字符NULL(也就是零)。
因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl[]中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl[]的同⼀⾏上,即属同⼀组,故OSRdyGrp中只有1位是设为1的。
uCOS II还初始化了4个空数据结构缓冲区,如图F3.8所⽰。每个缓冲区都是单向链表,允许uCOS II从缓冲区中迅速得到或释放⼀个缓冲区中的元素。控制块OS_TCB的数⽬也就⾃动确定了。当然,包括⾜够的任务控制块分配给统计任务和空闲任务。
uCOS II内核调度分析 vxWorks内核调度分析
1.只⽀持基于优先级的抢占式调度算法,不⽀持时间⽚轮训;采⽤⼯作队列 workQword的⽅式调度;
根据⽤户指定,动态分配堆栈,可以创建任意多个
2.64个优先级,只能创建64个任务,⽤户只能创建56个任务;
中草药压片机任务;
3.每个任务优先级都不相同。
4.不⽀持优先级逆转;⽀持优先级逆转,TCB保存两个优先级;
5.READY队列通过内存映射表实现快速查询。效率⾮常⾼;⽀持抢占与时间⽚轮训的任务调度⽅式;
6.⽀持时钟节拍;通过编译开关实现对多cpu体系结构的⽀持。
7.⽀持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通
队列采⽤FIFO或者优先级的双向链表实现;
讯机制;
8.⽀持中断嵌套,中断嵌套层数可达255层,中断使⽤当前任务的堆栈
⽀持中断嵌套,中断使⽤专⽤的堆栈保存上下⽂;
保存上下⽂;
9.每个任务有⾃⼰的堆栈,堆栈⼤⼩⽤户⾃⼰设定;任务是基于类,对象的管理⽅式;
10.⽀持动态修改任务优先级;⽀持动态修改任务优先级;
约束椅11.任务TCB为静态数组,建⽴任务只是从中获得⼀个TCB,不⽤动态
任务的TCB保存在任务的堆栈⾥;
分配,释放内存;
12.任务堆栈为⽤户静态或者动态创建,在任务创建外完成,任务创建本
每个任务有⾃⼰的堆栈,堆栈⼤⼩⽤户⾃⼰设定;
⾝不进⾏动态内存分配;
13.任务的总个数(OS_MAX_TASKS)由⽤户决定;
任务的优先级从0—255,0优先级最⾼,允许多个14.0优先级最⾼, 63优先级最低;
任务相同优先级;
15.有⼀个优先级最低的空闲任务,在没有⽤户任务运⾏的时候运⾏.
系统没有空闲任务执⾏;

本文发布于:2024-09-21 22:16:01,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/154965.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   中断   切换   就绪   程序
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议