八、嵌入式操作系统UCOS的开发

上传人:xmg****18 文档编号:113702210 上传时间:2019-11-09 格式:PPT 页数:66 大小:1.27MB
返回 下载 相关 举报
八、嵌入式操作系统UCOS的开发_第1页
第1页 / 共66页
八、嵌入式操作系统UCOS的开发_第2页
第2页 / 共66页
八、嵌入式操作系统UCOS的开发_第3页
第3页 / 共66页
八、嵌入式操作系统UCOS的开发_第4页
第4页 / 共66页
八、嵌入式操作系统UCOS的开发_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《八、嵌入式操作系统UCOS的开发》由会员分享,可在线阅读,更多相关《八、嵌入式操作系统UCOS的开发(66页珍藏版)》请在金锄头文库上搜索。

1、1,提纲,1,3,2,4,5,uCOSII操作系统的特点,uCOS II操作系统时间管理,uCOS II操作系统任务管理,uCOS II操作系统内核结构,6,7,第八章 嵌入式操作系统UCOS II的使用,uCOS II操作系统移植,uCOS II操作系统内存管理,uCOS II操作系统任务间的通讯,2,C/OS-II的特点,uC/OS-II是一个非常小巧的实时操作系统;整个代码分为内核层以及移植层,这样使得它的植性很方便。 采用抢占式调度策略,保证任务的实时性。 能够管理多达64个任务。 提供了邮箱、消息队列、信号量、内存管理、时间管理等系统服务。,C/OS-II的特点,3,C/OS-II的

2、各种商业应用,全世界有数百种产品在应用: 医疗器械 移动电话 路由器 工业控制 GPS 导航系统 智能仪器 更多,C/OS-II的特点,4,为了实现资源共享,一个操作系统必须提供临界段操作的功能。 C/OS-为了处理临界段代码需要关中断,处理完毕后再开中断。这使得C/OS-能够避免同时有其它任务或中断服务进入临界段代码。 C/OS-定义两个宏(macros)来开关中断。分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。 这两个宏的定义取决于所用的微处理器,每种微处理器都有自己的OS_CPU.H文件。,临界段(Critical Sections),C/OS-I

3、I的内核结构,5,任务(task),一个任务通常是一个无限的循环,它看起来像其它C函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的。故返回参数必须定义成void。 void mytask(void *pdata) do init while (1) do something; waiting; do something; ,C/OS-II的内核结构,6,任务(task),C/OS-可以管理多达64个任务。 保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任务以

4、被将来使用。 用户可以有多达56个应用任务。必须给每个任务赋以不同的优先级。优先级号越低,任务的优先级越高。,C/OS-II的内核结构,7,任务就绪表(Ready List),每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。,C/OS-II的任务管理,8,任务就绪表,C/OS-II的任务管理,9,根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,

5、假设OSRdyGrp0x08,对应OSRdyTbl3; 通过OSRdyTbl3的值来确定低3位,假设OSRdyTbl30x3a,最高优先级的任务为25,C/OS-II的任务管理,10,使任务进入就绪态,如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是: OSRdyGrp |=OSMapTblprio3; OSRdyTblprio3 |=OSMapTblprio ,C/OS-II的任务管理,11,使任务脱离就绪态,将任务就绪表OSRdyTblprio3相应元素的相应位清零,而且当OSRdyTblprio3中的所有位都为零时,即全组任务中没有一个进入就绪

6、态时,OSRdyGrp的相应位才为零。 if(OSRdyTblprio3,C/OS-II的任务管理,12,C/OS中的中断处理,C/OS中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。 用户中断服务子程序框架: 保存全部CPU寄存器; 调用OSIntEnter或OSIntNesting直接加1; 执行用户代码做中断服务; 调用OSIntExit(); 恢复所有CPU寄存器; 执行中断返回指令;,C/OS-II的内核结构,13,OSIntEnter(),void OSIntEnter (void)

7、OS_ENTER_CRITICAL(); OSIntNesting+; OS_EXIT_CRITICAL(); ,C/OS-II的内核结构,14,OSIntExit,OS_ENTER_CRITICAL(); if (-OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPr

8、ioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); OS_EXIT_CRITICAL();,C/OS-II的内核结构,15,中断与时钟节拍,当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回。 uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。 时钟节拍是一种特殊的中断,操作系统的心脏。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,C/OS-II的内核结构,16,时钟节拍,C/OS需要用户提供周期性信号源,用于实

9、现时间延时和确认超时。节拍率通常为10到100Hz。时钟节拍率越高,系统的额外负荷就越重。 时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。 用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。,C/OS-II的内核结构,17,OSTickISR,void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter()或是将OSIntNesting加1; 调用OSTimeTick(); 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令; ,C/OS-

10、II的内核结构,18,C/OS-初始化,在调用C/OS-的任何其它服务之前,C/OS-要求用户首先调用系统初始化函数OSInit()。 OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。 C/OS-还初始化空数据结构缓冲区。,C/OS-II的内核结构,19,C/OS-的启动,多任务的启动是用户通过调用OSStart()实现的。然而,启动C/OS-之前,用户至少要建立一个应用任务。 OSInit(); /* 初始化uC/OS-II*/ 调用OSTaskCreate()或OSTaskCre

11、ateExt(); OSStart(); /*开始多任务调度!永不返回 */,C/OS-II的内核结构,20,OSStart,if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); ,C/OS-II的内核结构,21,任

12、务状态,C/OS-II的任务管理,22,任务控制块(TCB),任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。 一旦任务建立了,任务控制块OS_TCBs将被赋值。 所有的任务控制块分为两条链表,空闲链表和使用链表。,C/OS-II的任务管理,23,任务控制块结构的主要成员,OS_STK *OSTCBStkPtr; /*当前任务栈顶的指针*/ struct os_tcb *OSTCBNext; /*任务控制块的双重链接指针*/ struct os_tcb *OSTCBPrev; /*任务控制块的双重链接指针*/ OS_EV

13、ENT *OSTCBEventPtr; /*事件控制块的指针*/ void *OSTCBMsg; /*消息的指针*/ INT16U OSTCBDly; /*任务延时*/ INT8U OSTCBStat; /*任务的状态字*/ INT8U OSTCBPrio; /*任务优先级*/ INT8U OSTCBX; /*用于加速进入就绪态的过程*/ INT8U OSTCBY; /*用于加速进入就绪态的过程*/ INT8U OSTCBBitX; /*用于加速进入就绪态的过程*/ INT8U OSTCBBitY; /*用于加速进入就绪态的过程*/,C/OS-II的任务管理,24,任务创建,想让C/OS-管理

14、用户的任务,用户必须要先建立任务。 用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务: OSTaskCreate() OSTaskCreateExt()。 任务不能由中断服务程序(ISR)来建立。,C/OS-II的任务管理,25,任务调度(Task Scheduling),C/OS是抢占式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。 C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。 C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。,C/O

15、S-II的任务管理,26,任务调度(Task Scheduling),C/OS-总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。 任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。,C/OS-II的任务管理,27,任务调度器,void OSSched (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()

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号