uCOS II操作系统简介及实验解读课件.ppt
《uCOS II操作系统简介及实验解读课件.ppt》由会员分享,可在线阅读,更多相关《uCOS II操作系统简介及实验解读课件.ppt(85页珍藏版)》请在三一办公上搜索。
1、uC/OS-II操作系统,uC/OS-II操作系统简介及开发过程,内 容,一、 uCOS-II操作系统简介二、 uCOS-II操作系统内核结构三、 uCOS-II操作系统任务管理四、 uCOS-II操作系统内存管理五、 uCOS-II操作系统时间管理六、 uCOS-II操作系统任务间的通讯七、 uCOS-II操作系统移植八、 uCOS-II操作系统实验,一、 uCOS-II操作系统简介,1.1 uC/OS-II简介1.2 uC/OS-II特点1.3 C/OS-II应用,1.1 uC/OS-II简介,1、uC/OS-II是一个简单、高效的嵌入式实时操作系统内核2、支持 x86、ARM、Power
2、PC、MIPS 等众多体系结构3、可从www.ucos-网站上获得全部源码及其在各种体系结构平台上的移植范例。,1.2 uC/OS-II特点,1、uC/OS-II内核具有很强的可移植性。2、具有可抢占的实时多任务调度功能。3、提供了许多系统服务,如信号量、消息队列、邮箱、内存管理、时间函数等4、这些功能可以根据不同的需求进行裁减。,1.3 C/OS-II的各种商业应用,全世界有数百种产品在应用:医疗器械移动电话路由器工业控制GPS 导航系统智能仪器更多,二、 uCOS-II操作系统内核结构,2.1 临界段2.2 任务2.3 任务状态2.4 任务控制块2.5 任务就绪表,2.6 任务调度2.7
3、中断处理2.8 时钟节拍 2.9 C/OS-初始化2.10 C/OS-启动,目的:为了实现资源共享。实现方法:进入临界段时关中断,退出临界段时开中断。这使得C/OS-能够在临界段代码时避免被其它任务或中断服务所中断。 C/OS-定义两个宏(macros)来开关中断。分别是:进入临界段:OS_ENTER_CRITICAL()退出临界段:OS_EXIT_CRITICAL()。这两个宏的定义取决于所用的微处理器,每种微处理器都有自己的OS_CPU.H文件。,2.1 临界段(Critical Sections),2.2 任务(task),一个任务通常是一个无限的循环:void mytask(void
4、*pdata) do init while (1) do something; waiting; do something; ,任务(task),C/OS-可以管理多达64个任务。优先级为0-63 优先级号越低,任务的优先级越高。每个任务的优先级不能相同。保留优先级:高优先级:0、1、2、3低优先级:OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0用户可以有多达56个应用任务。,2.3 任务状态,任务状态,休眠态 - OSTaskCreate()或OSTaskCreateExt() - 就绪态等待态,就绪态,运
5、行态 - OSTaskDel() - 休眠态就绪态 - OSStart() - 运行态运行态 - OSTimeDly()或OSTimeDlyHMSM() , OSSemPend(),OSMboxPend(),或OSQPend() - 等待态等待态 - OSTimeTick() -就绪态空闲任务 - OSTaskIdle(),2.4 任务控制块(TCB),任务控制块 OS_TCB 是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,和任务链表指针等。一旦任务建立了,任务控制块OS_TCBs将被赋值。所有的任务控制块分为两条链表,空闲链表和使用链表。,任务控制块结构的
6、主要成员,OS_STK *OSTCBStkPtr; /*当前任务栈顶的指针*/struct os_tcb *OSTCBNext; /*任务控制块的双重链接指针*/struct os_tcb *OSTCBPrev; /*任务控制块的双重链接指针*/void *OSTCBExtPtr; /*用户定义的任务控制块扩展*/OS_EVENT *OSTCBEventPtr; /*事件控制块的指针*/void *OSTCBMsg; /*消息的指针*/INT16U OSTCBDly; /*任务延时*/INT8U OSTCBStat; /*任务的状态字*/INT8U OSTCBPrio; /*任务优先级*/IN
7、T8U OSTCBX; /*用于加速进入就绪态的过程*/ INT8U OSTCBY; /*用于加速进入就绪态的过程*/ INT8U OSTCBBitX; /*用于加速进入就绪态的过程*/ INT8U OSTCBBitY; /*用于加速进入就绪态的过程*/BOOLEAN OSTCBDelReq; /*用于表示该任务是否要删除*/,2.5 任务就绪表(Ready List),每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务
8、进入就绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。,任务就绪表(Ready List),根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,假设OSRdyGrp0 x08,对应OSRdyTbl3,查表(OSUnMapTbl)得到3(八进制,二进制011);通过OSRdyTbl3的值来确定低3位,假设OSRdyTbl30 x3a,查表得优先级为1;则最高优先级的任务为3*8+1=25,2.6 任务调度,C/OS是抢占式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调
9、度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。,任务调度,C/OS-总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。 任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。,2.7 中断处理,用户中断服务子程序流程: 1、保存全部CPU寄存器; 2、调用OSIntEnter或OSIntNesting直接加1;3、执行用户代码做中断服务; 4、调用OSIntExit
10、();5、恢复所有CPU寄存器;6、执行中断返回指令;,OSIntEnter(),void OSIntEnter (void) OS_ENTER_CRITICAL(); OSIntNesting+; OS_EXIT_CRITICAL();,OSIntExit(),OS_ENTER_CRITICAL();if (-OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTblOSRdyGrp;OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (O
11、SPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); OS_EXIT_CRITICAL();,中断与时钟节拍,当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回。uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。时钟节拍是一种特殊的中断,是操作系统的心脏。可以对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,2.8 时钟节拍,
12、C/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次之间,或者说10到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。 用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。,时钟节拍中断服务子程 (OSTickISR),void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter()或是将OSIntNesting加1; 调用OSTimeTick(); 调用OSIntExit(
13、); 恢复处理器寄存器的值; 执行中断返回指令;,2.9 C/OS-初始化,在调用C/OS-的任何其它服务之前,C/OS-要求用户首先调用系统初始化函数OSInit()。OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。 C/OS-还初始化了4个空数据结构缓冲区。,C/OS-初始化后的一些数据结构,C/OS-初始化后的空缓冲区,2.10 C/OS-的启动,多任务的启动是用户通过调用OSStart()实现的。然而,启动C/OS-之前,用户至少要建立一个应用任务。 OSInit(); /*
14、 初始化uC/OS-II*/ 调用OSTaskCreate()或OSTaskCreateExt(),创建至少一个任务 ; OSStart(); /*开始多任务调度!永不返回 */,OSStart,if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSTCBCur = OSTCBHighRdy; O
15、SStartHighRdy();/*高优先级就绪任务启动函数*/ ,三、 uCOS-II操作系统任务管理,3.1 任务创建3.2 任务删除3.3 任务调度器3.4 任务切换,3.1 任务创建,想让C/OS-管理用户的任务,用户必须要先建立任务。 用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() OSTaskCreateExt()。 任务不能由中断服务程序(ISR)来建立。,使任务进入就绪态,如果prio是任务优先级,也是任务的识别号,则将任务放入就绪表,就是使任务进入就绪态的方法是:OSRdyGrp |=OSMapTblprio3;OSRdyTblp
16、rio3 |=OSMapTblprio (0001 0000 b),使任务脱离就绪态,将任务就绪表OSRdyTblprio3相应元素的相应位清零,而且当OSRdyTblprio3中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if(OSRdyTblprio3,3.2 任务删除OSTaskDel(),删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了 .OSTaskDel()一开始应确保用户所要删除的任务并非是空闲任务.用户可以删除statistic任务 .确保用户不是在ISR例程中去试图删除一个任务,3.3 任务调度器,void OSSch
17、ed (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();,3.4 任务切换 (OS_TASK_SW),任
18、务切换由以下两步完成 :将被挂起任务的微处理器寄存器推入堆栈 。将较高优先级的任务的寄存器值从栈中恢复到寄存器中 。OSSched()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防止中断服务子程序把一个或几个任务的就绪位置位,中断是被关掉的。,任务级的任务切换OS_TASK_SW(),通过系统调用指令完成保护当前任务的现场恢复新任务的现场执行中断返回指令开始执行新的任务,调用OS_TASK_SW()前的数据结构,低优先级任务 OS_TCB,OSTCBCur(1),存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地
19、址,高优先级任务 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,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTC
20、BHighRdyOSTCBCur(1),(2),CPU,(4),(4),(1),(3),(3),(4),任务切换OSCtxSw()的代码,Void OSCtxSw(void) 将R1,R2,R3及R4推入当前堆栈; OSTCBCurOSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; SP = OSTCBHighRdy OSTCBSTKPtr; 将R4,R3,R2及R1从新堆栈中弹出; 执行中断返回指令;,四、 uCOS-II操作系统内存管理,4.1 内存管理概述4.2 内存控制块4.3 内存管理初始化4.4
21、 建立内存分区4.5 分配内存块4.6 释放内存块,4.1 内存管理概述,在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存。在嵌入式实时操作系统中,容易产生内存碎片。 C/OS-II中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。,内存分区示意图,4.2 内存控制块,为了便于内存的管理,在C/OS-II中使用内存控制块(memory control blocks)的数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uCOS II操作系统简介及实验解读课件 II 操作系统 简介 实验 解读 课件
链接地址:https://www.31ppt.com/p-1481537.html