实时操作系统uCOS开发与实例

上传人:夏** 文档编号:568749001 上传时间:2024-07-26 格式:PPT 页数:98 大小:2.64MB
返回 下载 相关 举报
实时操作系统uCOS开发与实例_第1页
第1页 / 共98页
实时操作系统uCOS开发与实例_第2页
第2页 / 共98页
实时操作系统uCOS开发与实例_第3页
第3页 / 共98页
实时操作系统uCOS开发与实例_第4页
第4页 / 共98页
实时操作系统uCOS开发与实例_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《实时操作系统uCOS开发与实例》由会员分享,可在线阅读,更多相关《实时操作系统uCOS开发与实例(98页珍藏版)》请在金锄头文库上搜索。

1、1嵌入式系统设计与实例开发嵌入式系统设计与实例开发实时操作系统实时操作系统 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 Labrosse 1992Jean Labrosse 1992年完成年完成l应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等机控制、高速公路电话系统、自动提款机等 l1998

3、1998年年 C/OSC/OS-II-II,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61l20002000年,得到美国航空管理局(年,得到美国航空管理局(FAAFAA)的认证,可以用于飞行器)的认证,可以用于飞行器中中l网站网站www.ucos-II.comwww.ucos-II.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-IIC/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/OS-IIC/

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

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

8、中断嵌套全部退出后立即执行,中断嵌套层数可达则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255255层。层。u稳定性与可靠性稳定性与可靠性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-81077-290-2北京航空航天大学出版社ISBN

9、89-951540-5-58C/OS-II的各种商业应用l全世界有数百种产品在应用全世界有数百种产品在应用: :lAvionicslMedicallCellphoneslRoutersandswitcheslHigh-endaudioequipmentlWashingmachinesanddryerslUPS(UninterruptiblePowerSupplies)lIndustrialcontrollerslGPSNavigationSystemslMicrowaveRadioslInstrumentationlPoint-of-saleterminalsl更多更多9C/OS-II提供的系

10、统服务l信号量信号量l带互斥机制的信号量带互斥机制的信号量n减少优先级倒置的问题减少优先级倒置的问题l事件标志事件标志l消息信箱消息信箱l消息队列消息队列l内存管理内存管理l时钟管理时钟管理l任务管理任务管理10C/GUIandC/FSlC/GUIC/GUIl嵌入式的用户界面嵌入式的用户界面l用用ANSI CANSI C书写书写l支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPUl彩色,灰、度,等级或黑白显示彩色,灰、度,等级或黑白显示l代码尺寸小代码尺寸小lC/FSC/FSl嵌入式的文件系统嵌入式的文件系统Written in ANSI CWritten

11、 in ANSI Cl用用ANSI CANSI C书写书写l支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits 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-II的文件结构13l内核结构内核结构l任务管理任务

12、管理l时间管理时间管理l任务之间通信与同步任务之间通信与同步l C/OSC/OS的移植的移植C/OS-II的内核结构14任务task典型的任务一个无限循环。典型的任务一个无限循环。void mytask(void *pdata)void mytask(void *pdata) 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-1OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0OS_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;#endif str

15、uct 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; IN

16、T8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;19任任务控制控制块OS_TCBOS_TCB中几个成中几个成员的算法的算法OSTCBY= priority 3;OSTCBBitY= OSMapTblpriority 3;OSTCBX= priority & 0x07;OSTCBBitX= OSMapTblpriority & 0x07;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任务级

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

19、,与应用程序中建立的任务数无关。无关。23根据就绪表确定最高优先级两个关键两个关键: :l优先级数分解为高三位和低三位分别确定;优先级数分解为高三位和低三位分别确定;l高优先级有高优先级有着小的优先级号 ;24根据优先级找到任务在就绪任务表中的位置每个就绪的任务都放入就绪表中(每个就绪的任务都放入就绪表中(ready listready list)中,就绪表有两个变)中,就绪表有两个变量:量:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrp1207 6 5 4 300XXXYY Y任务优先级20176543108915 14 13 1212 111816172

20、3 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY优先级最低任务(空闲任务)优先级最高任务任务优先级号25根据优先级确定就绪表(1)n假假设设优优先先级级为为1212的的任任务务进进入入就就绪绪状状态态,12=1100b,12=1100b,则则OSRdyTbl1OSRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,相应

21、的数学表达式为,相应的数学表达式为: : OSRdyGrp |=0x02OSRdyGrp |=0x02; OSRdyTbl1 |=0x10;OSRdyTbl1 |=0x10;n而而优优先先级级为为2121的的任任务务就就绪绪21=10 21=10 101b101b,则则OSRdyTbl2OSRdyTbl2的的第第5 5位位置置1 1,且,且OSRdyGrpOSRdyGrp的第的第2 2位置位置1,1,相应的数学表达式为:相应的数学表达式为: OSRdyGrp |=0x04OSRdyGrp |=0x04; OSRdyTbl2 |=0x20;OSRdyTbl2 |=0x20;26根据优先级确定就绪

22、表(2)l从从上上面面的的计计算算我我们们可可以以得得到到: :若若OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的的第第n n位位置置1 1,则则应应该该把把OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的的值值与与2 2n n 相相或或。uC/OSuC/OS中中,把把2 2n n的的n=0-7n=0-7的的8 8个值先计算好存在数组个值先计算好存在数组OSMapTbl7OSMapTbl7中中, ,也就是:也就是: OSMapTbl0 =2OSMapTbl0 =20 0=0x01=0x01(0000 00010000 0001) OSMapTbl1

23、 =2OSMapTbl1 =21 1=0x02=0x02(0000 00100000 0010) OSMapTbl7 =2 OSMapTbl7 =27 7=0x80=0x80(1000 00001000 0000)27使任务进入就绪态n如如果果prioprio是是任任务务是是优优先先级级,也也是是任任务务的的识识别别号号,则则将将任任务务放放入入就就绪绪表表,即使任务进入就绪态的方法是:即使任务进入就绪态的方法是:OSRdyGrp |=OSMapTblprio3;OSRdyGrp |=OSMapTblprio3;OSRdyTblprio3 |=OSMapTblprio & 0x07;OSRdy

24、Tblprio3 |=OSMapTblprio & 0x07;n假设优先级为假设优先级为12121100b1100bOSRdyGrp |=0x02OSRdyGrp |=0x02;OSRdyTbl1 |=0x10;OSRdyTbl1 |=0x10;28使任务脱离就绪态n将将任任务务就就绪绪表表OSRdyTblprio3OSRdyTblprio3相相应应元元素素的的相相应应位位清清零零,而而且且当当OSRdyTblprio3OSRdyTblprio3中中的的所所有有位位都都为为零零时时,即即全全组组任任务务中中没没有有一一个个进进入就绪态时,入就绪态时,OSRdyGrpOSRdyGrp的相应位才为

25、零。的相应位才为零。If(OSRdyTblprio3&= If(OSRdyTblprio3&= OSMapTblprio & 0x07)=0)OSMapTblprio & 0x07)=0)OSRdyGrp&= OSRdyGrp&= OSMapTblprio3;OSMapTblprio3;29根据就绪表确定最高优先级l通过通过OSRdyGrpOSRdyGrp值确定高值确定高3 3位,假设为位,假设为0x24=100 100b, -0x24=100 100b, - 对应对应OSRdyTbl2 OSRdyTbl2 和和OSRdyTbl5OSRdyTbl5,高优先级为,高优先级为2 2l通过通过OSR

26、dyTbl2OSRdyTbl2的值来确定低的值来确定低3 3位,位, 假设为假设为0x12=010 010b 0x12=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 5

27、4 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY30源代码中使用了查表法 查查表表法法具具有有确确定定的的时时间间,增增加加了了系系统统的的可可预预测测性性,uC/OSuC/OS中中所所有有的的系统调用时间都是确定的系统调用时间都是确定的High3 =OSUnMapTblOSRdyGrp;High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(Hign33)+Low3;Prio =(Hign33)+Low3;OSRd

28、yGrp1207 6 5 4 300XXXYY Y任务优先级20176543108915 14 13 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 5901234567OSRdyTbl7XY31INT8UconstOSUnMapTbl=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,

29、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,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,

30、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,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的值为的值为01101000B01101000B,即,即0X680X68,则查得,则查得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的值是的值是3 3,它相应于,它相应于OSRdyGrpOSRdyGrp中的第中的第3 3位位

31、置置1 1; 如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,则查,则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值的值是是2 2,则进入就绪态的最高任务,则进入就绪态的最高任务优先级优先级 Prio=3*8+2=26Prio=3*8+2=26 32TaskschedulervoidOSSched(void)INT8Uy;OS_ENTER_CRITICAL();if(OSLockNesting=0)&(OSIntNesting=0)y=OSUnMapTblOSRdyGrp;OSPrioHigh

32、Rdy=(INT8U)(y3)+OSUnMapTblOSRdyTbly)if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW();OS_EXIT_CRITICAL();33voidOSSchedLock(void)if(OSRunning=TRUE)OS_ENTER_CRITICAL();if(OSLockNesting0)OSLockNesting-;if(OSLockNesting=0)&(OSIntNesting=0)OS_EXIT_CRITICAL();OSSc

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

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

35、CurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)40任务切换OS_TASK_SW()的代码Void OSCtxSw(void)Void OSCtxSw(void) 将将R1,R2,R3R1,R2,R3及及R4R4推入当前堆栈;推入当前堆栈; OSTCBCurOSTCBCurOSTCBStkPtr = SP;OSTCBStkPtr = SP; OSTCBCur = OSTCB

36、HighRdy; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtr;OSTCBSTKPtr; 将将R4,R3,R2R4,R3,R2及及R1R1从新堆栈中弹出;从新堆栈中弹出; 执行中断返回指令;执行中断返回指令; 41C/OS-II中的中断l中断:中断:由于某种事件的发生,而导致程序流程的改变。产生中断的由于某种事件的发生,而导致程序流程的改变。产生中断的事件称为中断源。事件称为中断源。lCPU响应中断的条件:响应中断的条件:n至少有一个中断源向至少有一个中断源向CPU发出中断信号;发出中断信号;n

37、系统允许中断,且对此中断信号未予屏蔽系统允许中断,且对此中断信号未予屏蔽l中断类型:中断类型:n硬件中断硬件中断 n外部中断外部中断n陷阱中断陷阱中断n现场控制量的中断现场控制量的中断42 C/OSC/OS-II-II中的中断服务子程序中的中断服务子程序用户中断服务子程序:用户中断服务子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 调用调用OSIntEnter()OSIntEnter()或或OSIntNestingOSIntNesting直接加直接加1 1; if(OSIntNesting=1)if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; OS

38、TCBCur-OSTCBStkPtr=SP; 清中断源;清中断源; 重新开中断;重新开中断; 执行用户代码做中断服务;执行用户代码做中断服务; 调用调用OSIntExit();OSIntExit(); 恢复所有恢复所有CPUCPU寄存器;寄存器; 执行中断返回指令;执行中断返回指令;4344uC/OS-IIaboutbeginninganISRvoidOSIntEnter(void)OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT_CRITICAL();45Search for highest priority similar to schedulerHalf

39、 context switch is done by interrupt response i.e. registers saved46中断与时钟节拍中断与时钟节拍l时钟节拍(时钟滴答)时钟节拍(时钟滴答)TickTick,是一种定时器中断,可通过编程方,是一种定时器中断,可通过编程方式实现式实现l时钟节拍是一种特殊的中断,操作系统的心脏。首先时钟节拍是一种特殊的中断,操作系统的心脏。首先3232位的整数位的整数OSTimeOSTime加一。对任务列表进行扫描,判断是否有延时任务应该处加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。于准备就绪状态,最后进行

40、上下文切换。47时钟节拍中断服务子程序时钟节拍中断服务子程序Void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter(),或是将OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; 调用OSTimeTick(); 清发出中断设备的中断; 重新允许中断(可选用) 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令;48void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) w

41、hile (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 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_ENTE

42、R_CRITICAL(); (6) OSTime+; (7) OS_EXIT_CRITICAL();时钟节拍函数时钟节拍函数OSTimTick()OSTimTick()49voidOSTaskIdle(void*pdata)pdata=pdata;for(;)OS_ENTER_CRITICAL();OSIdleCtr+;OS_EXIT_CRITICAL();空闲任务空闲任务OSTaskIdle()50初始化统计任务初始化统计任务void main (void) OSInit(); /* 初始化初始化uC/OS-II(1)*/ /* 安装安装uC/OS-II的任的任务务切切换换向量向量*/ /*

43、 创创建用建用户户起始任起始任务务(以以TaskStart()作作为为起始任起始任务务)(2)*/ OSStart(); /* 开始多任开始多任务调务调度度(3)*/void TaskStart (void *pdata) /* 安装并启安装并启动动uC/OS-II的的时钟节时钟节拍拍 (4)*/ OSStatInit(); /* 初始化初始化统计统计任任务务(5)*/ /* 创创建用建用户应户应用程序任用程序任务务*/ for (;) /* 这这里是里是TaskStart()的代的代码码!*/ 51 C/OSC/OS-II-II初始化初始化l首先调用系统初始化函数首先调用系统初始化函数OSI

44、int()。OSIint()初始化初始化C/OS-所有的所有的变量和数据结构(见变量和数据结构(见OS_CORE.C)。)。lOSInit()建立空闲任务建立空闲任务idletask,这个任务总是处于就绪态的。空闲,这个任务总是处于就绪态的。空闲任务任务OSTaskIdle()的优先级总是设成最低,即()的优先级总是设成最低,即OS_LOWEST_PRIO。l如果统计任务允许如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为和任务建立扩展允许都设为1,则,则OSInit()还得建立统计任务还得建立统计任务OSTaskStat()并且让其进入就绪态。并且让其进入就绪态。OST

45、askStat的优先级总是设为的优先级总是设为OS_LOWEST_PRIO-1l空闲和统计任务的任务控制块(空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一)是用双向链表链接在一起的。起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。个任务总是被放在这个链表的起始处。52调用OSInit()之后的数据结构 53空闲缓冲区空闲缓冲区54C/OS-C/OS-的启动的启动void main (void) OSInit(); /* 初始化初始化uC/OS-II */ . . 通过调用通过调用OS

46、TaskCreate()或或OSTaskCreateExt()创建至少一个任创建至少一个任务务; . . OSStart(); /* 开始多任务调度开始多任务调度!OSStart()永远不会永远不会返回返回 */55启动多任务启动多任务voidOSStart(void)INT8Uy;INT8Ux;if(OSRunning=FALSE)y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;OSPrioHighRdy=(INT8U)(y OS_LOWEST_PRIO) (1) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL()

47、; 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, (void *)0, 0); if (err = OS_NO_ERR) OS_ENTER_CRITICAL();61 OSTaskCtr+; OSTaskCreateHook(OSTCBPrioTblpri

48、o); 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堆栈检验,堆栈检验,OSTaskStkChk()OSTaskStkChk()删除任务,删除任务,OSTaskDel()OSTaskDel()请求删除任务,请求删除任务,OSTaskDelReq()OSTaskDel

49、Req()改变任务的优先级,改变任务的优先级,OSTaskChangePrio()OSTaskChangePrio()挂起任务,挂起任务,OSTaskSuspend()OSTaskSuspend()恢复任务,恢复任务,OSTaskResume() OSTaskResume() 其它相关函数其它相关函数63本节提要本节提要1 13 32 25 54 46 6 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植64时间管理Fiveservices:lOSTimeDLY

50、()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-OSTCBDly = ticks; OS_EXIT_CRITICAL(); OSSched(); 66延时详解67OSTimeDl

51、yHMSM( )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和和OS_EXIT_CRITICALOS_EXIT_CRITICAL来对临界资源进来对临界资源进行保护行保护uOSSch

52、edLock( )OSSchedLock( )禁止调度保护任务级的共享资源。禁止调度保护任务级的共享资源。u提供了经典操作系统任务间通信方法:信号量、邮箱、消息队提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。列,事件标志。 70事件控制块ECB 程序程序4.5 ECB的结构如下的结构如下 - typedef struct void *OSEventPtr; /*指向消息或消息队列的指针指向消息或消息队列的指针*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任务列表等待任务列表*/ INT16U OSEventCnt; /*计数器(当事件

53、是信号量时)计数器(当事件是信号量时)*/ INT8U OSEventType; /*事件类型:信号量、邮箱等事件类型:信号量、邮箱等*/ INT8U OSEventGrp; /*等待任务组等待任务组*/ OS_EVENT; 与与TCB类似的结构,使用两个链表,空闲链表与使用链表类似的结构,使用两个链表,空闲链表与使用链表所有的通信信号都被看成是事件所有的通信信号都被看成是事件(event), (event), 一个称为事件控制块一个称为事件控制块(ECB, (ECB, Event Control Block)Event Control Block)的数据结构来表征每一个具体事件,的数据结构来

54、表征每一个具体事件,ECBECB的结构如下的结构如下71事件的等待任务列表72空闲事件控制块链表73事件控制块TCB的操作对事件控制块进行的操作包括对事件控制块进行的操作包括l初始化一个事件控制块初始化一个事件控制块OS_EventWaitListInit()OS_EventWaitListInit();l使一个任务进入就绪态使一个任务进入就绪态OS_EventTaskRdy()OS_EventTaskRdy();l使一个任务进入等待某事件的状态使一个任务进入等待某事件的状态OS_EventTaskWait()OS_EventTaskWait();l因为等待超时而使一个任务进入就绪态因为等待超

55、时而使一个任务进入就绪态OS_EventTO()OS_EventTO()。74信号量semaphorel信号量在多任务系统中用于:控制共享资源的使用权、标志事件信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。的发生、使两个任务的行为同步。luC/OSuC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制的等待任务表。信号量的计数值可以为二进制, , 也可以是其他整也可以是其他整数。数。l系统通过系统通过OSSemPend( )OSSemPend( )和和OS

56、SemPost( )OSSemPost( )来支持信号量的两种原子来支持信号量的两种原子操作操作P()P()和和V()V()。P()P()操作减少信号量的值,如果新的信号量的值不操作减少信号量的值,如果新的信号量的值不大于大于0,0,则操作阻塞;则操作阻塞;V()V()操作增加信号量的值。操作增加信号量的值。 75任务、中断服务子程序和信号量之间的关系 76信号量操作lC/OS-IIC/OS-II提供了提供了5 5个对信号量进行操作的函数。它们是:个对信号量进行操作的函数。它们是:lOSSemCreate()OSSemCreate()lOSSemPend()OSSemPend()lOSSemP

57、ost()OSSemPost()lOSSemAccept()OSSemAccept()lOSSemQuery()OSSemQuery()函数。函数。 77邮 箱l邮箱是邮箱是C/OS-IIC/OS-II中另一种通讯机制,它可以使一个任务中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定量。该指针指向一个包含了特定“消息消息”的数据结构。的数据结构。为了在为了在C/OS-IIC/OS-II中使用邮箱,必须将中使用邮箱,必须将OS_CFG.HOS_CFG.H中的中的OS_MBOX_ENOS_

58、MBOX_EN常数置为常数置为1 1。l使用邮箱之前,必须先建立该邮箱。该操作可以通过调使用邮箱之前,必须先建立该邮箱。该操作可以通过调用用OSMboxCreate()OSMboxCreate()函数来完成,并且要指定指针的初始函数来完成,并且要指定指针的初始值。值。lC/OS-IIC/OS-II提供了提供了5 5种对邮箱的操作:种对邮箱的操作:OSMboxCreate()OSMboxCreate(),OSMboxPendOSMboxPend()(),OSMboxPost()OSMboxPost(),OSMboxAccept()OSMboxAccept()和和OSMboxQuery()OSMb

59、oxQuery()函函数数 78任务、中断服务子程序和邮箱之间的关系 79消息队列l消息队列是消息队列是C/OS-IIC/OS-II中另一种通讯机制,它可以使一个中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用数据结构变量也有所不同。为了使用C/OS-IIC/OS-II的消息队的消息队列功能,需要在列功能,需要在OS_CFG.H OS_CFG.H 文件中,将文件中,将OS_Q_ENOS_Q_

60、EN常数设置常数设置为为1 1,并且通过常数,并且通过常数OS_MAX_QSOS_MAX_QS来决定来决定C/OS-IIC/OS-II支持的最支持的最多消息队列数。多消息队列数。l在使用一个消息队列之前,必须先建立该消息队列。这可在使用一个消息队列之前,必须先建立该消息队列。这可以通过调用以通过调用OSQCreate()OSQCreate()函数,并定义消息队列中的单元函数,并定义消息队列中的单元数(消息数)来完成。数(消息数)来完成。lC/OS-IIC/OS-II提供了提供了7 7个对消息队列进行操作的函数:个对消息队列进行操作的函数:OSQCreateOSQCreate()(),OSQPe

61、nd()OSQPend(),OSQPost()OSQPost(),OSQPostFront()OSQPostFront(),OSQAcceptOSQAccept()(),OSQFlush()OSQFlush()和和OSQQuery()OSQQuery()函数函数 80任务、中断服务子程序和消息队列之间的关系 81操作系统的启动和运行过程嵌入式控制器硬件初始化操作系统初始化LCD初始化装载字库调用系统配置文件创建任务初始化用户界面、时钟启动多任务调度主任务用户程序消息处理任务1任务n82总结总结l不存在一个内核任务不存在一个内核任务/ /实体,内核的管理是通过调用系统函数来实实体,内核的管理是通

62、过调用系统函数来实现的。现的。l每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。每个任务的总的运行结果。83本节提要本节提要1 13 32 25 54 46 6 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植84 COS-II在在ARM7上的移植上的移植所谓移植,是指使一个实时操作系统能够在某个微处理器所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。平台上运行。 COS

63、-IICOS-II的主要代码都是由标准的的主要代码都是由标准的C C语言写成的,语言写成的,移植方便。移植方便。85移植移植 COS-II满足的条件满足的条件l处理器的处理器的C C编译器能产生可重入代码编译器能产生可重入代码 l在程序中可以打开或者关闭中断在程序中可以打开或者关闭中断 l处理器支持中断,并且能产生定时中断(通常在处理器支持中断,并且能产生定时中断(通常在10101000Hz1000Hz之间)之间) l处理器支持能够容纳一定量数据的硬件堆栈处理器支持能够容纳一定量数据的硬件堆栈 l处理器有将堆栈指针和其他处理器有将堆栈指针和其他CPUCPU寄存器存储和读出到堆栈寄存器存储和读出

64、到堆栈(或者内存)的指令(或者内存)的指令 8687打开打开/关闭中断关闭中断在在 COS-IICOS-II中,可以通过:中,可以通过:OS_ENTER_CRITICAL () OS_ENTER_CRITICAL () OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。宏来控制系统关闭或者打开中断。这需要处理器的支持。在在ARM7TDMIARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。系统的所有中断。 88处理器支持中断并且能产生定时中断 l CO

65、S-IICOS-II是通过处理器产生的定时器的中断来实现多任务之间是通过处理器产生的定时器的中断来实现多任务之间的调度的。的调度的。ARM7TDMIARM7TDMI的处理器上可以产生定时器中断。的处理器上可以产生定时器中断。89处理器支持硬件堆栈 l COS-IICOS-II进行任务调度的时候,会把当前任务的进行任务调度的时候,会把当前任务的CPUCPU寄存器存寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是和出

66、栈是 COS-IICOS-II多任务调度的基础。多任务调度的基础。 lARM7ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。90例:C/OS-II在S3C44B0X上的移植 l设置设置OS_CPU.HOS_CPU.H中与处理器和编译器相关的代码中与处理器和编译器相关的代码 l用用C C语言编写六个操作系统相关的函数(语言编写六个操作系统相关的函数(OS_CPU_C.COS_CPU_C.C) l用汇编语言编写四个与处理器相关的函数(用汇编语言编写四个与处理器相关的函数(OS_CPU.ASMOS_CPU.ASM) 91设置与处理器和编译

67、器相关的代码lOS_CPU.HOS_CPU.H中定义了与编译器相关的数据类型。比如:中定义了与编译器相关的数据类型。比如:INT8UINT8U、INT8SINT8S等。等。l与与 ARMARM处理器相关的代码,使用处理器相关的代码,使用OS_ENTER_CRITICAL() OS_ENTER_CRITICAL() 和和OS_EXIT_CRITICAL() OS_EXIT_CRITICAL() 宏开启关闭中断宏开启关闭中断l设置堆栈的增长方向设置堆栈的增长方向 :堆栈由高地址向低地址增长:堆栈由高地址向低地址增长 92用C语言编写六个操作系统相关的函数 lvoid *OSTaskStkInit

68、(void (*task)(void *pd),void *pdata, void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt) void *ptos, INT16U opt) lvoid OSTaskCreateHook (OS_TCB *ptcb) void OSTaskCreateHook (OS_TCB *ptcb) lvoid OSTaskDelHook (OS_TCB *ptcb)void OSTaskDelHook (OS_TCB *ptcb)lvoid OSTaskSwHo

69、ok (void)void OSTaskSwHook (void)lvoid OSTaskStatHook (void)void OSTaskStatHook (void)lvoid OSTimeTickHook (void)void OSTimeTickHook (void)后后5 5个函数为接口函数,可以不加代码个函数为接口函数,可以不加代码93堆栈初始化低地址内存存储的处理器寄存器值中断返回地址处理器状态字任务起始地址pdata高地址内存堆栈指针堆栈增长方向94用汇编语言编写四个用汇编语言编写四个与处理器相关的函数与处理器相关的函数 lOSStartHighRdy()lOSCtxSw()

70、lOSIntCtxSw()lOSTickISR()95关于移植关于移植相对于其他的嵌入式操作系统,相对于其他的嵌入式操作系统,uCOS-IIuCOS-II的移植虽然是一个的移植虽然是一个很简单的过程,但是,对于不熟悉很简单的过程,但是,对于不熟悉uCOS-IIuCOS-II的开发者,移植还是有的开发者,移植还是有一定难度的。一定难度的。96移植要点移植要点l定义函数定义函数OS_ENTER_CRITICALOS_ENTER_CRITICAL和和OS_ENTER_CRITICALOS_ENTER_CRITICAL。l定义函数定义函数OS_TASK_SWOS_TASK_SW执行任务切换。执行任务切

71、换。 l定义函数定义函数OSCtxSwOSCtxSw实现用户级上下文切换,用纯汇编实现。实现用户级上下文切换,用纯汇编实现。 l定义函数定义函数OSIntCtxSwOSIntCtxSw实现中断级任务切换,用纯汇编实现。实现中断级任务切换,用纯汇编实现。 l定义函数定义函数OSTickISROSTickISR。 l定义定义OSTaskStkInitOSTaskStkInit来初始化任务的堆栈。来初始化任务的堆栈。 97uC/OS的完善l固定的基于优先级的调度,不支持时间片,使用起来不方便。一固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核个任务的基础上增加一个基于时间片的微型调度核l系统时钟中断,没有提供用户使用定时器,可以借鉴系统时钟中断,没有提供用户使用定时器,可以借鉴linuxlinux的定时的定时器加以修改器加以修改l在对临界资源的访问上使用关闭中断实现,没有使用在对临界资源的访问上使用关闭中断实现,没有使用CPUCPU提供的硬提供的硬件指令,例如测试并置位。件指令,例如测试并置位。l只是一个实时多任务内核,没有图形用户接口(只是一个实时多任务内核,没有图形用户接口(GUIGUI)、文件系统)、文件系统(FSFS)和)和TCP/IPTCP/IP协议栈协议栈98谢谢谢谢

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 文学/艺术/历史 > 人文/社科

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