产品开发案例教学-实时操作系统uCOS.ppt
《产品开发案例教学-实时操作系统uCOS.ppt》由会员分享,可在线阅读,更多相关《产品开发案例教学-实时操作系统uCOS.ppt(121页珍藏版)》请在三一办公上搜索。
1、产品开发案例教学,计算机通信专业,主要内容,uC/OS-II概述uC/OS-II基本概念uC/OS-II内核结构uC/OS-II任务管理uC/OS-II时间管理uC/OS-II任务间通信uC/OS-II移植,C/OS-II概述,C/OS-II Micro C O S 2,Micro-Controller Operating System Version 2,微控制器操作系统;C/OS,美国人Jean Labrosse 1992年完成;1998年C/OS-II,目前的版本C/OS-II V2.7X网站(),C/OS-II的各种商业应用,全世界有数百种产品在应用医疗器械移动电话路由器工业控制GPS
2、 导航系统智能仪器更多,C/OS-II的特点,UC/OS是一个非常小巧的实时操作系统;整个代码分为内核层以及移植层,这样使得它的植性很方便。采用抢占式调度策略,保证任务的实时性。能够管理多达64个任务。提供了邮箱、消息队列、信号量、内存管理、时间管理等系统服务。,如何学习C/OS-II,看C/OS-II书籍;阅读源代码,随书CD中包含了源代码;实际编译、运行和调试;在具体的开发板上进行移植。,为了实现资源共享,一个操作系统必须提供临界段擦作的功能。C/OS-为了处理临界段代码需要关中断,处理完毕后再开中断。这使得C/OS-能够避免同时有其它任务或中断服务进入临界段代码。C/OS-定义两个宏(m
3、acros)来开关中断。分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。这两个宏的定义取决于所用的微处理器,每种微处理器都有自己的OS_CPU.H文件。,临界段(Critical Sections),共享资源,可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源。这叫做互斥(mutual exclusion)。,任务,一个任务,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。实时应用程序的设计过程,包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自
4、己的一套CPU寄存器和自己的栈空间。典型地、每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。,任务(task),一个任务通常是一个无限的循环:void mytask(void*pdata)do init while(1)do something;waiting;do something;,任务状态,任务的状态休眠,休眠状态(Dormant):任务存在于内存空间中,但内核不可见;可以通过以下函数通知内核,使之变为就绪状态:OSTaskCreate()或OSTaskCreateExt()可以通过以下函数返
5、回到休眠状态:OSTaskDel(),任务的状态就绪,就绪状态(Ready):万事具备,只欠CPU;在所有的就绪任务当中,具有最高优先级的任务被选中去运行;如果任务在运行的时候被抢占了CPU,则又回到就绪状态。,任务的状态运行,运行状态(Running):任务在CPU上运行;当一个任务在运行时,如果没有关闭中断,则有可能被中断所打断;当一个任务在运行时,可能因为各种原因进入阻塞状态。OSMBoxPend(),OSQPend(),OSSemPend()OSTaskSuspend(),OSTimeDly(),任务的状态ISR,中断服务状态(ISR):该任务原来在CPU上运行,后来被中断所打断,由中
6、断服务程序ISR接管了CPU;当中断服务程序运行完毕后,内核要判断是否有新的、更高优先级的任务就绪,如果有,则原有的任务被抢占;如果没有,则原有的任务重新运行。,任务的状态阻塞,阻塞/等待状态(Waiting):任务由于正在等待某个事件(信号量、邮箱或队列)而被挂起;当任务等待的事件发生时,回到就绪状态。OSMBoxpost(),OSQPost(),OSSemPost(),OSTaskResume(),OSTimeDlyResume()或OSTimeTick(),状态的转换,删除任务,任务切换,Context Switch 在有的书中翻译成上下文切换,实际含义是任务切换,或CPU寄存器内容切换
7、。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Tasks Context Storage area),也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。,任务调度,调度(Scheduler),英文还有一词叫dispatcher,也是调度的意思。这是内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基
8、于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。然而,究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是不可剥夺型的还是可剥夺型内核。,任务间的通讯,有时很需要任务间的或中断服务与任务间的通讯。这种信息传递称为任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。,任务(task)管理,C/OS-可以管理多达64个任务。保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任务以被将来使用。用户可以有
9、多达56个应用任务。必须给每个任务赋以不同的优先级。优先级号越低,任务的优先级越高。,中断与时钟节拍,当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回。uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。时钟节拍是一种特殊的中断,操作系统的心脏。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,时钟节拍,C/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在说10到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用
10、户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。,OSTickISR,void OSTickISR(void)保存处理器寄存器的值;调用OSIntEnter()或是将OSIntNesting加1;调用OSTimeTick();调用OSIntExit();恢复处理器寄存器的值;执行中断返回指令;,任务控制块(TCB),OS_TCB是一个任务的核心数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。一旦任务建立了,任务控制块OS_T
11、CB将被赋值。所有的任务控制块分为两条链表,空闲链表和使用链表。,任务控制块结构的主要成员,typedef struct os_tcb OS_STK*OSTCBStkPtr;/*当前任务栈顶的指针*/struct os_tcb*OSTCBNext;/*任务控制块的双重链接指针*/struct os_tcb*OSTCBPrev;/*任务控制块的双重链接指针*/OS_EVENT*OSTCBEventPtr;/*事件控制块的指针*/void*OSTCBMsg;/*消息的指针*/INT16U OSTCBDly;/*任务延时*/INT8U OSTCBStat;/*任务的状态字*/INT8U OSTCBP
12、rio;/*任务优先级*/INT8U OSTCBX;/*用于加速进入就绪态的过程*/INT8U OSTCBY;/*用于加速进入就绪态的过程*/INT8U OSTCBBitX;/*用于加速进入就绪态的过程*/INT8U OSTCBBitY;/*用于加速进入就绪态的过*/OS_TCB;,空闲任务和统计任务,内核总是创建一个空闲任务OSTaskIdle();总是设置为最低优先级,OS_LOWEST_PRIOR;当所有其他任务都未在执行时,空闲任务开始执行;应用程序不能删除该任务;空闲任务的工作就是把32位计数器OSIdleCtr加1,该计数器被统计任务所使用;统计任务OSTaskStat(),提供运
13、行时间统计。每秒钟运行一次,计算当前的CPU利用率。其优先级是OS_LOWEST_PRIOR-1,可选。,任务就绪表(Ready List),每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。,任务就绪表,优先级最低任务,(空闲任务),优先级最高任务,任务优先级号,对于整数OSRdyTbli(0i7),若它的某一位为1,则OSRdyGrp的第i位为1。,任务就
14、绪表,假设用户创建的任务优先级为6,使任务进入就绪态,如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio,使任务脱离就绪态,将任务就绪表OSRdyTblprio3相应元素的相应位清零,而且当OSRdyTblprio3中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if(OSRdyTblprio3,uC/OS-II流程图,uC/OS-II的启动,多任务的启动是用户通过调用OSStart()实现的。然而,启动C/OS
15、-之前,用户至少要建立一个应用任务。,void main(void)OSInit();/*初始化uC/OS-II*/.通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;.OSStart();/*开始多任务调度!永不返回*/,C/OS-初始化,在调用C/OS-的任何其它服务之前,C/OS-要求用户首先调用系统初始化函数OSInit()。OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。C/OS-还初始化了4个空数据结构缓冲区。,C/OS-初始化后的
16、一些数据结构内容,C/OS-初始化后的缓冲区,OSStart(),if(OSRunning=FALSE)y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;OSPrioHighRdy=(INT8U)(y 3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSTCBCur=OSTCBHighRdy;OSStartHighRdy();,系统启动后的状态,假设用户创建的任务优先级为6,任务调度(Task Scheduling),C/OS-总是运行进入就绪态任务中优先级最高的那一个
17、。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。,根据就绪表确定最高优先级,两个关键:将优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;,根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,假设OSRdyGrp0 x08=0 x00001000,第3位为1,优先级的高3位为011;通过OSRdyTbl3的值来确定低3位,假设OSRdyTbl30 x3a,第1位为1,优先级的低3位为001,3*8+1=25,
18、任务优先级,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的Y=OSUnMapTblOSRdyGrp;X=OSUnMapTblOSRdyTblY;Prio=(Y3)+X;,参见OS_CORE.C,任务调度器,void OSSched(void)INT8U y;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)y=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(y 3)+OSUnMapTblOSRdyTbly);if(OSPrioHighRdy!=O
19、SPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW();OS_EXIT_CRITICAL();,检查是否中断调用和允许任务调用,找到优先级最高的任务,该任务是否正在运行,任务切换,将被挂起任务的寄存器内容入栈;将较高优先级任务的寄存器内容出栈,恢复到硬件寄存器中。,任务级的任务切换OS_TASK_SW(),保护当前任务的现场恢复新任务的现场执行中断返回指令开始执行新的任务,调用OS_TASK_SW()前的数据结构,低优先级任务 OS_TCB,OSTCBCur(1),存贮器低地址,存贮器高地址,堆栈方向,S
20、P,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdy(3),(2),CPU,(4),(5),保存当前CPU寄存器的值,低优先级任务 OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdy(3),(2),CPU,(4),(5),(1),(3),重新装入要运行的任务,低优先级任务 OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW
21、,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdyOSTCBCur(1),(2),CPU,(4),(4),(1),(3),(3),(4),任务切换OS_TASK_SW()的代码,Void OSCtxSw(void)将R1,R2,R3及R4推入当前堆栈;OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdy OSTCBSTKPtr;将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;,创建任务,创建任务的函数OSTaskCreate();OSTaskCreateExt();OSTaskCrea
22、teExt()是OSTaskCreate()的扩展版本,提供了一些附加的功能;任务可以在多任务调度开始(即调用OSStart()之前创建,也可以在其它任务的执行过程中被创建。但在OSStart()被调用之前,用户必须创建至少一个任务;不能在中断服务程序(ISR)中创建新任务。,OSTaskCreate(),INT8U OSTaskCreate(void(*task)(void*pd),/任务代码指针 void*pdata,/任务参数指针OS_STK*ptos,/任务栈的栈顶指针 INT8U prio/任务的优先级);返回值OS_NO_ERR:函数调用成功;OS_PRIO_EXIT:任务优先级已
23、经存在;OS_PRIO_INVALID:任务优先级无效。,OSTaskCreate()的实现过程,任务优先级检查该优先级是否在0到OS_LOWSEST_PRIO之间?该优先级是否空闲?调用OSTaskStkInit(),创建任务的栈帧;调用OSTCBInit(),从空闲的OS_TCB池(即OSTCBFreeList链表)中获得一个TCB并初始化其内容,然后把它加入到OSTCBList链表的开头,并把它设定为就绪状态;任务个数OSTaskCtr加1;调用用户自定义的函数OSTaskCreateHook();判断是否需要调度(调用者是正在执行的任务),任务的栈空间,每个任务都有自己的栈空间(Sta
24、ck),栈必须声明为OS_STK类型,并且由连续的内存空间组成;栈空间的分配方法静态分配:在编译的时候分配,例如:static OS_STK MyTaskStackstack_size;OS_STK MyTaskStackstack_size;动态分配:在任务运行的时候使用malloc()函数来动态申请内存空间;,OS_STK*pstk;pstk=(OS_STK*)malloc(stack_size);/*确认malloc()能得到足够的内存空间*/if(pstk!=(OS_STK*)0)Create the task;,动态分配,栈的增长方向,栈的增长方向的设置从低地址到高地址:在OS_CP
25、U.H中,将常量 OS_STK_GROWTH设定为 0;从高地址到低地址:在OS_CPU.H中,将常量 OS_STK_GROWTH设定为 1;OS_STK TaskStackTASK_STACK_SIZE;OSTaskCreate(task,pdata,中断处理,中断:由于某种事件的发生而导致程序流程的改变。产生中断的事件称为中断源。CPU响应中断的条件:至少有一个中断源向CPU发出中断信号;系统允许中断,且对此中断信号未予屏蔽。,中断服务程序ISR,中断一旦被识别,CPU会保存部分(或全部)运行上下文(context,即寄存器的值),然后跳转到专门的子程序去处理此次事件,称为中断服务子程序(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 产品 开发 案例 教学 实时 操作系统 uCOS
链接地址:https://www.31ppt.com/p-6542689.html