嵌入式实时操作系统(uCOS)分析.ppt

上传人:qwe****56 文档编号:70269888 上传时间:2023-01-18 格式:PPT 页数:97 大小:2.42MB
返回 下载 相关 举报
嵌入式实时操作系统(uCOS)分析.ppt_第1页
第1页 / 共97页
嵌入式实时操作系统(uCOS)分析.ppt_第2页
第2页 / 共97页
点击查看更多>>
资源描述

《嵌入式实时操作系统(uCOS)分析.ppt》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统(uCOS)分析.ppt(97页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1嵌入式系统设计与实例开发嵌入式系统设计与实例开发 C/OS-C/OS-实时操作系统实时操作系统 C/OS-C/OS-分析分析2本节提要本节提要1 13 32 25 54 46 6 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植3RTOSRTOS是是3232位的嵌入式位的嵌入式CPUCPU的软件基础的软件基础lRTOSRTOS内核内核 提供提供CPUCPU的的管理管理l硬件初时化,硬件初时化,MMUMMU,定时器,中断定时器,中断lRTOS RTOS 内核提供

2、任务,内存管理内核提供任务,内存管理lRTOSRTOS提供设备管理,文件和网络的支持提供设备管理,文件和网络的支持lRTOSRTOS提供提供C/C+C/C+,JAVAJAVA,图形模块等编程接口图形模块等编程接口4C/OS简介1、C/OSMicro Controller O S,微控制器操作系统2 2、C/OSC/OS简介l美国人美国人Jean Jean LabrosseLabrosse 1992 1992年完成年完成l应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等机控制、高速公路电话系统、

3、自动提款机等 l19981998年年 C/OSC/OS-II-II,目前的版本目前的版本 C/OSC/OS-II V2.61-II V2.61l20002000年,得到美国航空管理局(年,得到美国航空管理局(FAAFAA)的认证,可以用于飞行器的认证,可以用于飞行器中中l网站网站www.www.ucosucos-II.com-II.com().com)5u公开源代码公开源代码u可移植性(可移植性(PortablePortable)绝大部分绝大部分 C/OS-IIC/OS-II的源码是用移植性很强的的源码是用移植性很强的ANSI CANSI C写的。和微处理器写的。和微处理器硬件相关的那部分是用

4、汇编语言写的。汇编语言写的部分已经压到最低硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得限度,使得 C/OS-IIC/OS-II便于移植到其他微处理器上。便于移植到其他微处理器上。C/OS-IIC/OS-II可以在绝可以在绝大多数大多数8 8位、位、1616位、位、3232位以至位以至6464位微处理器、微控制器位微处理器、微控制器 、数字信号处理、数字信号处理器(器(DSPDSP)上运行。上运行。u可固化(可固化(ROMableROMable)C/OS-II C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手是为嵌入式应用而设计的,这就意味着,只要读

5、者有固化手段(段(C C编译、连接、下载和固化),编译、连接、下载和固化),C/OS-IIC/OS-II可以嵌入到读者的产品可以嵌入到读者的产品中成为产品的一部分。中成为产品的一部分。u可裁剪(可裁剪(ScalableScalable)可以只使用可以只使用 C/OS-IIC/OS-II中应用程序需要的那些系统服务。也就是说某产中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个品可以只使用很少几个 C/OS-IIC/OS-II调用,而另一个产品则使用了几乎所调用,而另一个产品则使用了几乎所有有 C/OS-IIC/OS-II的功能,这样可以减少产品中的的功能,这样可以减少产品中的 C/

6、OS-IIC/OS-II所需的存储器空所需的存储器空间(间(RAMRAM和和ROMROM)。)。这种可剪裁性是靠条件编译实现的。这种可剪裁性是靠条件编译实现的。C/OS的性能特点(一)61.1.占先式(占先式(PreemptivePreemptive)2.2.多任务多任务 C/OS-IIC/OS-II可以管理可以管理6464个任务,然而,目前这一版本保留个任务,然而,目前这一版本保留8 8个给系统。应用程序最多个给系统。应用程序最多可以有可以有5656个任务个任务1.1.可确定性可确定性 全部全部 C/OS-IIC/OS-II的函数调用与服务的执行时间具有可确定性。的函数调用与服务的执行时间具

7、有可确定性。1.1.任务栈任务栈 每个任务有自己单独的栈,每个任务有自己单独的栈,C/OS-IIC/OS-II允许每个任务有不同的栈空间,以便压低应允许每个任务有不同的栈空间,以便压低应用程序对用程序对RAMRAM的需求。的需求。1.1.系统服务系统服务 C/OS-IIC/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。的申请与释放、时间相关函数等。1.1.中断管理中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则中断可以使正在执行的任务暂时挂起,如

8、果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255255层。层。1.1.稳定性与可靠性稳定性与可靠性C/OS的性能特点(二)7C/OS-IIC/OS-II图书图书l描述了描述了 C/OS-IIC/OS-II内部的工作原理内部的工作原理l随书的随书的CDCD中包含了源代码中包含了源代码n工业界最清晰的源代码工业界最清晰的源代码l除英文版外,有中文和韩文版除英文版外,有中文和韩文版ChineseKoreanEnglishISBN 1-57820-103-9美国CMP BOOK ISBN 7

9、-81077-290-2北京航空航天大学出版社ISBN 89-951540-5-58C/OS-II的各种商业应用l全世界有数百种产品在应用全世界有数百种产品在应用:lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS(Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentation

10、lPoint-of-sale terminalsl更多更多9C/OS-II提供的系统服务l信号量信号量l带互斥机制的信号量带互斥机制的信号量n减少优先级倒置的问题减少优先级倒置的问题l事件标志事件标志l消息信箱消息信箱l消息队列消息队列l内存管理内存管理l时钟管理时钟管理l任务管理任务管理10C/GUI and C/FSl C/GUIC/GUIl嵌入式的用户界面嵌入式的用户界面l用用ANSI CANSI C书写书写l支持任何支持任何8,16,32-8,16,32-bits CPUbits CPUl彩色,灰、度,等级或黑白显示彩色,灰、度,等级或黑白显示l代码尺寸小代码尺寸小l C/FSC/FS

11、l嵌入式的文件系统嵌入式的文件系统Written in ANSI CWritten in ANSI Cl用用ANSI CANSI C书写书写l支持任何支持任何8,16,32-8,16,32-bits CPUbits CPUl支持支持SMC,MMC,SD,CF,IDE,Flash,RAMSMC,MMC,SD,CF,IDE,Flash,RAM其他介质其他介质11本节提要本节提要1 13 32 25 54 46 6 C/OS-简介简介 C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植12C/OS-

12、II的文件结构13l内核结构内核结构l任务管理任务管理l时间管理时间管理l任务之间通信与同步任务之间通信与同步l C/OSC/OS的移植的移植C/OS-II的内核结构14任务task典型的任务一个无限循环。典型的任务一个无限循环。void void mytaskmytask(void*(void*pdatapdata)for(;)for(;)do something;do something;waiting;waiting;do something;do something;l C/OSC/OS II II 2.52.5版版本本支支持持6464个个任任务务,每每个个任任务务一一个个特特定定的的

13、优优先先级级。优优先先级级越越高高,数字越小。数字越小。l系统占用了系统占用了8 8个任务,保留优先级为个任务,保留优先级为0 0、1 1、2 2、3 3、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1 OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0 OS_LOWEST_PRIO-0。15任务状态任务状态16任务控制块(TCB)l任务控制块任务控制块 OS_TCBOS_TCB是一个数据结构,保存该任务的相关参是一个数据结构,保存该任务的相关参数,包括任务堆栈

14、指针,状态,优先级,任务表位置,任数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。务链表指针等。l所有的任务控制块分为两条链表,空闲链表和使用链表。所有的任务控制块分为两条链表,空闲链表和使用链表。17 C/OS-IIC/OS-II任务控制块任务控制块.typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr;OS_STK *OSTCBStkBottom;INT32U OSTCBStkSize;INT16U OSTCBOpt;INT16U OSTCBId;#end

15、if struct os_tcb*OSTCBNext;struct os_tcb*OSTCBPrev;#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN|OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif18#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY;#if O

16、S_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;19任务控制块任务控制块OS_TCBOS_TCB中几个成员的算法中几个成员的算法OSTCBY=priority 3;OSTCBBitY=OSMapTblpriority 3;OSTCBX=priority&0 x07;OSTCBBitX=OSMapTblpriority&0 x07;20空任务列表空任务列表所有的任务控制块都被放置在任务控制块列表数组所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl中,中,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表,系统初始化时,所有任务控

17、制块被链接成空任务控制块的单向链表,任务建立后,空任务控制块指针任务建立后,空任务控制块指针OSTCBFreeList指向的任务控制块指向的任务控制块就赋给了该任务,然后就赋给了该任务,然后OSTCBFreeList的值调整为指向链表中的下的值调整为指向链表中的下一个空任务控制块。一个空任务控制块。21任务控制块初始化函数INT8U OS_TCBInit(INT8U prio,OS_STK*ptos,OS_STK*pbos,INT16U id,INT32U stk_size,void*pext,INT16U opt)22任务级的任务调度-OSSchedl C/OSC/OS是是占先式实时多任务内

18、核,优先级最高的任务一旦准备就占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有绪,则拥有CPUCPU的所有权开始投入运行。的所有权开始投入运行。l C/OSC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。级的任务并进行上下文切换。l C/OSC/OS任务调度所花的时间为常数,与应用程序中建立的任务数任务调度所花的时间为常数,与应用程序中建立的任务数无关。无关。23根据就绪表确定最高优先级两

19、个关键两个关键:l优先级数分解为高三位和低三位分别确定;优先级数分解为高三位和低三位分别确定;l高优先级有高优先级有着小的优先级号 ;24根据优先级找到任务在就绪任务表中的位置每个就绪的任务都放入就绪表中(每个就绪的任务都放入就绪表中(ready listready list)中,就绪表有两个变中,就绪表有两个变量:量:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrp1207 6 5 4 300XXXYY Y任务优先级20176543108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734

20、323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY优先级最低任务(空闲任务)优先级最高任务任务优先级号25根据优先级确定就绪表(1)n假假设设优优先先级级为为1212的的任任务务进进入入就就绪绪状状态态,12=110012=1100b,b,则则OSRdyTbl1OSRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,相应的数学表达式为,相应的数学表达式为:OSRdyGrp OSRdyGrp|=

21、0 x02|=0 x02;OSRdyTbl1|=0 x10;OSRdyTbl1|=0 x10;n而而优优先先级级为为2121的的任任务务就就绪绪21=10 21=10 101101b b,则则OSRdyTbl2OSRdyTbl2的的第第5 5位位置置1 1,且,且OSRdyGrpOSRdyGrp的第的第2 2位置位置1,1,相应的数学表达式为:相应的数学表达式为:OSRdyGrp OSRdyGrp|=0 x04|=0 x04;OSRdyTbl2|=0 x20;OSRdyTbl2|=0 x20;26根据优先级确定就绪表(2)l从从上上面面的的计计算算我我们们可可以以得得到到:若若OSRdyGrp

22、OSRdyGrp及及OSRdyBblOSRdyBbl的的第第n n位位置置1 1,则则应应该该把把OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的的值值与与2 2n n 相相或或。uCuC/OS/OS中中,把把2 2n n的的n=0-7n=0-7的的8 8个值先计算好存在数组个值先计算好存在数组OSMapTbl7OSMapTbl7中中,也就是:也就是:OSMapTbl0=2OSMapTbl0=20 0=0 x01=0 x01(0000 00010000 0001)OSMapTbl1=2 OSMapTbl1=21 1=0 x02=0 x02(0000 00100000 00

23、10)OSMapTbl7=2 OSMapTbl7=27 7=0 x80=0 x80(1000 00001000 0000)27使任务进入就绪态n如如果果prioprio是是任任务务是是优优先先级级,也也是是任任务务的的识识别别号号,则则将将任任务务放放入入就就绪绪表表,即使任务进入就绪态的方法是:即使任务进入就绪态的方法是:OSRdyGrp OSRdyGrp|=|=OSMapTblOSMapTbl prioprio3;3;OSRdyTblOSRdyTbl prioprio3|=3|=OSMapTblOSMapTbl prioprio&0 x07;&0 x07;n假设优先级为假设优先级为1211

24、00121100b bOSRdyGrp OSRdyGrp|=0 x02|=0 x02;OSRdyTbl1|=0 x10;OSRdyTbl1|=0 x10;28使任务脱离就绪态n将将任任务务就就绪绪表表OSRdyTblOSRdyTbl prioprio33相相应应元元素素的的相相应应位位清清零零,而而且且当当OSRdyTblOSRdyTbl prioprio33中中的的所所有有位位都都为为零零时时,即即全全组组任任务务中中没没有有一一个个进进入就绪态时,入就绪态时,OSRdyGrpOSRdyGrp的相应位才为零。的相应位才为零。If(If(OSRdyTblOSRdyTbl prioprio3&=

25、3&=OSMapTblOSMapTbl prioprio&0 x07)=0)&0 x07)=0)OSRdyGrpOSRdyGrp&=&=OSMapTblOSMapTbl prioprio3;3;29根据就绪表确定最高优先级l通过通过OSRdyGrpOSRdyGrp值确定高值确定高3 3位,假设为位,假设为0 0 x24=100 100b,-x24=100 100b,-对应对应OSRdyTbl2 OSRdyTbl2 和和OSRdyTbl5OSRdyTbl5,高优先级为高优先级为2 2l通过通过OSRdyTbl2OSRdyTbl2的值来确定低的值来确定低3 3位,位,假设为假设为0 0 x12=0

26、10 010b x12=010 010b,-第第2 2个和第个和第5 5个任务,取高优先级个任务,取高优先级为为2 2,则最高优先级的任务号为,则最高优先级的任务号为1717OSRdyGrp0 01 10 00 0 0 0 1 1 0 0 0 00001000 1任务优先级20176543108915 14 13 12 110 001 1000 01 10 026242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY

27、30源代码中使用了查表法 查查表表法法具具有有确确定定的的时时间间,增增加加了了系系统统的的可可预预测测性性,uCuC/OS/OS中中所所有有的的系统调用时间都是确定的系统调用时间都是确定的High3=High3=OSUnMapTblOSUnMapTbl OSRdyGrpOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Low3 =OSUnMapTblOSRdyTblHigh3;Prio Prio =(Hign33)+Low3;=(Hign33)+Low3;OSRdyGrp1207 6 5 4 300XXXYY Y任务优先级20176543108915 14 13

28、12 1118161723 22 21 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY31INT8U const OSUnMapTbl=0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0

29、,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0

30、,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0;优先级判定表OSUnMapTbl256举例:举例:如如OSRdyGrpOSRdyGrp的值为的值为0110100001101000B B,即即0 0X68X68,则查得则查得OSUnMapTblOSUnMapTbl OSRdyGrpOSRdyGrp 的值是的值是3 3,它相应于,它相应于OSRdyGrpOSRdyGrp中的第中的第3 3位位置置1 1;如如OSRdyTbl3OSRdyTbl3的值是的值是1110010011100100

31、B B,即即0 0XE4XE4,则查则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值的值是是2 2,则进入就绪态的最高任务,则进入就绪态的最高任务优先级优先级 PrioPrio=3*8+2=26=3*8+2=26 32Task schedulervoid OSSched(void)INT8U y;OS_ENTER_CRITICAL();if(OSLockNesting=0)&(OSIntNesting=0)y =OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(y 3)+OSUnMapTblOSRdyTbly)if(OSPri

32、oHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW();OS_EXIT_CRITICAL();33void OSSchedLock(void)if(OSRunning=TRUE)OS_ENTER_CRITICAL();if(OSLockNesting 0)OSLockNesting-;if(OSLockNesting=0)&(OSIntNesting=0)OS_EXIT_CRITICAL();OSSched();else OS_EXIT_CRITICAL();else OS_EXIT

33、_CRITICAL();35任务切换l将被挂起的任务寄存器入栈将被挂起的任务寄存器入栈l将较高优先级任务的寄存器出栈将较高优先级任务的寄存器出栈36任务级的任务切换OS_TASK_SW()lOS_TASK_SW()OS_TASK_SW()是宏调用,含有微处理器的软中断指令是宏调用,含有微处理器的软中断指令lOS_TASK_SW()OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作将处理器相关的软件中断机制封装起来,便于操作系统移植系统移植37调用OS_TASK_SW()前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1

34、R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R438保存当前CPU寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)39重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1

35、R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)40任务切换OS_TASK_SW()的代码Void Void OSCtxSwOSCtxSw(void)(void)将将R1,R2,R3R1,R2,R3及及R4R4推入当前堆栈;推入当前堆栈;OSTCBCurOSTCBCurOSTCBStkPtrOSTCBStkPtr=SP;=SP;OSTCBCur OSTCBCur =OSTCBHighRdyOSTCBHighRdy;SP =SP =OSTCBHighRd

36、yOSTCBHighRdy OSTCBSTKPtrOSTCBSTKPtr;将将R4,R3,R2R4,R3,R2及及R1R1从新堆栈中弹出;从新堆栈中弹出;执行中断返回指令;执行中断返回指令;41C/OS-II中的中断l中断:中断:由于某种事件的发生,而导致程序流程的改变。产生中断的由于某种事件的发生,而导致程序流程的改变。产生中断的事件称为中断源。事件称为中断源。lCPU响应中断的条件:响应中断的条件:n至少有一个中断源向至少有一个中断源向CPU发出中断信号;发出中断信号;n系统允许中断,且对此中断信号未予屏蔽系统允许中断,且对此中断信号未予屏蔽l中断类型:中断类型:n硬件中断硬件中断 n外部

37、中断外部中断n陷阱中断陷阱中断n现场控制量的中断现场控制量的中断42 C/OSC/OS-II-II中的中断服务子程序中的中断服务子程序用户中断服务子程序:用户中断服务子程序:保存全部保存全部CPUCPU寄存器;寄存器;调用调用OSIntEnterOSIntEnter()()或或OSIntNestingOSIntNesting直接加直接加1 1;if(if(OSIntNestingOSIntNesting=1)=1)OSTCBCurOSTCBCur-OSTCBStkPtrOSTCBStkPtr=SP;=SP;清中断源;清中断源;重新开中断;重新开中断;执行用户代码做中断服务;执行用户代码做中断服

38、务;调用调用OSIntExitOSIntExit();();恢复所有恢复所有CPUCPU寄存器;寄存器;执行中断返回指令;执行中断返回指令;4344uC/OS-II about beginning an ISRvoid OSIntEnter(void)OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT_CRITICAL();45Search for highest priority similar to schedulerHalf context switch is done by interrupt response i.e.registers saved46

39、中断与时钟节拍中断与时钟节拍l时钟节拍(时钟滴答)时钟节拍(时钟滴答)TickTick,是一种定时器中断,可通过编程方是一种定时器中断,可通过编程方式实现式实现l时钟节拍是一种特殊的中断,操作系统的心脏。首先时钟节拍是一种特殊的中断,操作系统的心脏。首先3232位的整数位的整数OSTimeOSTime加一。对任务列表进行扫描,判断是否有延时任务应该处加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。于准备就绪状态,最后进行上下文切换。47时钟节拍中断服务子程序时钟节拍中断服务子程序Void OSTickISR(void)保存处理器寄存器的值;调用OSIntE

40、nter(),或是将OSIntNesting加1 if(OSIntNesting=1)OSTCBCur-OSTCBStkPtr=SP;调用OSTimeTick();清发出中断设备的中断;重新允许中断(可选用)调用OSIntExit();恢复处理器寄存器的值;执行中断返回指令;48void OSTimeTick(void)OS_TCB*ptcb;OSTimeTickHook();(1)ptcb=OSTCBList;(2)while(ptcb-OSTCBPrio!=OS_IDLE_PRIO)(3)OS_ENTER_CRITICAL();if(ptcb-OSTCBDly!=0)if(-ptcb-OS

41、TCBDly=0)if(!(ptcb-OSTCBStat&OS_STAT_SUSPEND)(4)OSRdyGrp|=ptcb-OSTCBBitY;(5)OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;else ptcb-OSTCBDly=1;ptcb=ptcb-OSTCBNext;OS_EXIT_CRITICAL();OS_ENTER_CRITICAL();(6)OSTime+;(7)OS_EXIT_CRITICAL();时钟节拍函数时钟节拍函数OSTimTickOSTimTick()()49void OSTaskIdle(void*pdata)pdata=pdata;

42、for(;)OS_ENTER_CRITICAL();OSIdleCtr+;OS_EXIT_CRITICAL();空闲任务空闲任务OSTaskIdle()50初始化统计任务初始化统计任务void main(void)OSInit();/*初始化初始化uC/OS-II(1)*/*安装安装uC/OS-II的任的任务务切切换换向量向量*/*创创建用建用户户起始任起始任务务(以以TaskStart()作作为为起始任起始任务务)(2)*/OSStart();/*开始多任开始多任务调务调度度(3)*/void TaskStart(void*pdata)/*安装并启安装并启动动uC/OS-II的的时钟节时钟节

43、拍拍(4)*/OSStatInit();/*初始化初始化统计统计任任务务(5)*/*创创建用建用户应户应用程序任用程序任务务*/for(;)/*这这里是里是TaskStart()的代的代码码!*/51 C/OSC/OS-II-II初始化初始化l首先调用系统初始化函数首先调用系统初始化函数OSIint()。OSIint()初始化初始化C/OS-所有的所有的变量和数据结构(见变量和数据结构(见OS_CORE.C)。)。lOSInit()建立空闲任务建立空闲任务idle task,这个任务总是处于就绪态的。空闲这个任务总是处于就绪态的。空闲任务任务OSTaskIdle()()的优先级总是设成最低,即

44、的优先级总是设成最低,即OS_LOWEST_PRIO。l如果统计任务允许如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为和任务建立扩展允许都设为1,则,则OSInit()还得建立统计任务还得建立统计任务OSTaskStat()并且让其进入就绪态。并且让其进入就绪态。OSTaskStat的优先级总是设为的优先级总是设为OS_LOWEST_PRIO-1 l空闲和统计任务的任务控制块(空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一起是用双向链表链接在一起的。的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个指向这个链表的起始处。当建立一个任务时

45、,这个任务总是被放在这个链表的起始处。任务总是被放在这个链表的起始处。52调用OSInit()之后的数据结构 53空闲缓冲区空闲缓冲区54C/OS-C/OS-的启动的启动void main(void)OSInit();/*初始化初始化uC/OS-II */.通通过调过调用用OSTaskCreate()或或OSTaskCreateExt()创创建至少一个任建至少一个任务务;.OSStart();/*开始多任开始多任务调务调度度!OSStart()永永远远不会不会返回返回*/55启动多任务启动多任务void OSStart(void)INT8U y;INT8U x;if(OSRunning=FAL

46、SE)y =OSUnMapTblOSRdyGrp;x =OSUnMapTblOSRdyTbly;OSPrioHighRdy=(INT8U)(y OS_LOWEST_PRIO)(1)return(OS_PRIO_INVALID);OS_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)(2)OSTCBPrioTblprio=(OS_TCB*)1;(3)OS_EXIT_CRITICAL();(4)psp=(void*)OSTaskStkInit(task,pdata,ptos,0);err=OSTCBInit(prio,psp,(void*)0,0,0

47、,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();61 OSTaskCtr+;OSTaskCreateHook(OSTCBPrioTblprio);OS_EXIT_CRITICAL();if(OSRunning)OSSched();else OS_ENTER_CRITICAL();OSTCBPrioTblprio=(OS_TCB*)0;OS_EXIT_CRITICAL();return(err);else OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);62堆栈检验,堆栈检验,OSTaskStkChkOSTas

48、kStkChk()()删除任务,删除任务,OSTaskDelOSTaskDel()()请求删除任务,请求删除任务,OSTaskDelReqOSTaskDelReq()()改变任务的优先级,改变任务的优先级,OSTaskChangePrioOSTaskChangePrio()()挂起任务,挂起任务,OSTaskSuspendOSTaskSuspend()()恢复任务,恢复任务,OSTaskResumeOSTaskResume()()其它相关函数其它相关函数63本节提要本节提要1 13 32 25 54 46 6 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任

49、务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植64时间管理Five services:lOSTimeDLY()lOSTimeDLYHMSM()lOSTimeDlyResmue()lOStimeGet()lOSTimeSet()65OSTimeDly()void OSTimeDly(INT16U ticks)if(ticks 0)OS_ENTER_CRITICAL();if(OSRdyTblOSTCBCur-OSTCBY&=OSTCBCur-OSTCBBitX)=0)OSRdyGrp&=OSTCBCur-OSTCBBitY;OSTCBCur-O

50、STCBDly=ticks;OS_EXIT_CRITICAL();OSSched();66延时详解67OSTimeDlyHMSM()68本节提要本节提要1 13 32 25 54 46 6 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植69任务间通信手段 C/OSC/OS中,采用多种方法保护任务之间的共享数据和提供任务之中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。间的通信。u提供提供OS_ENTER_CRITICALOS_ENTER_CRITICAL和和

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

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁