实时操作系统uCOS开发与实例_第1页
实时操作系统uCOS开发与实例_第2页
实时操作系统uCOS开发与实例_第3页
实时操作系统uCOS开发与实例_第4页
实时操作系统uCOS开发与实例_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1嵌入式系统设计与实例开发嵌入式系统设计与实例开发实时操作系统实时操作系统 C/OS-C/OS-2本节提要本节提要 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 内核提供任务,内存管理内核提供任务,内存管理lRTOSRTOS提供设备管

2、理,文件和网络的支持提供设备管理,文件和网络的支持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应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等机控制、高速公路电话系统、自动提款机等 l19981998年年 C/OSC/OS-II

3、-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是为嵌入式应用而设计的,这就意味着,只要读者有固化手是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(段(C C编译、连接、下载和固化),编译、

5、连接、下载和固化), 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/OS-II所需的存储器空所需的存储器空

6、间(间(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的性能特点(二)7 C/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 89-951540-5-58C/O

9、S-II的各种商业应用l全世界有数百种产品在应用全世界有数百种产品在应用: :lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS (Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentationlPoint-of-sale terminalsl更多更多9C/OS-II提供的系统

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

11、tten 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本节提要本节提要 C/OS-简介简介 C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植12C/OS-II的文件结构13l内核结构内核结构l任务管理任务管理l时间管理时间管理l任务

12、之间通信与同步任务之间通信与同步l C/OSC/OS的移植的移植C/OS-II的内核结构14任务task典型的任务一个无限循环。典型的任务一个无限循环。void mytask(void void mytask(void * *pdata)pdata) for (;) for (;) do something; do something; waiting; waiting; do something; do something; l C/OSC/OS II 2.5II 2.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 struct os_t

15、cb *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 OSTC

16、BBitY;#if OS_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任务级的任务

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 1118161723 2

20、2 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 |=0 x02OSRdyGrp |=0 x02; OSRdyTbl1 |=0 x10;OSRdyTbl1 |=0 x10;n而优先级为而优先级为2121的任务就绪的任务就绪21=10 101b21=10 101b,则,则OSRdyTbl2OSRdyTbl2的第的第5 5位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第2 2位置位置1,1,相应的数学表达式为:相应的数学表达式为: OSRdyGrp |=0 x04OSRdyGrp |=0 x04; OSRdyTbl2 |=0 x20;OSRdyTbl2 |=0 x20;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=0 x01=0 x01(0000 00010000 000

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

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

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

26、SRdyTbl5,高优先级为,高优先级为2 2l通过通过OSRdyTbl2OSRdyTbl2的值来确定低的值来确定低3 3位,位, 假设为假设为0 x12=010 010b 0 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

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

28、gn33)+Low3;Prio =(Hign33)+Low3;OSRdyGrp1207 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 5901234567OSRdyTbl7XY31INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1

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

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

31、, 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位置位置1 1;

32、 如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,则查,则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的的值是值是2 2,则进入就绪态的最高,则进入就绪态的最高任务优先级任务优先级 Prio=3Prio=3* *8+2=268+2=26 32Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting =0)&(OSIntNesting= 0) y = OSUnMapTblOSRdyGrp; O

33、SPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != 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)&(OS

34、IntNesting=0) OS_EXIT_CRITICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 35任务切换l将被挂起的任务寄存器入栈将被挂起的任务寄存器入栈l将较高优先级任务的寄存器出栈将较高优先级任务的寄存器出栈36任务级的任务切换OS_TASK_SW()lOS_TASK_SW()OS_TASK_SW()是宏调用,含有微处理器的软中断指令是宏调用,含有微处理器的软中断指令lOS_TASK_SW()OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作将处理器相关的软件中断机制封装起来

35、,便于操作系统移植系统移植37调用OS_TASK_SW()前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R438保存当前CPU寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CP

36、U(4)(5)(1)(3)39重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向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推入当前堆栈;推入当前堆栈; OSTCBCurOSTCBCurOSTCBStk

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

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

39、OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; OSTCBCur-OSTCBStkPtr=SP; 清中断源;清中断源; 重新开中断;重新开中断; 执行用户代码做中断服务;执行用户代码做中断服务; 调用调用OSIntExit();OSIntExit(); 恢复所有恢复所有CPUCPU寄存器;寄存器; 执行中断返回指令;执行中断返回指令;4344uC/OS-II about beginning an ISRvoid OSIntEnter(void)OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT_CRITICAL();45Sear

40、ch for highest priority similar to schedulerHalf context switch is done by interrupt response i.e. registers saved46中断与时钟节拍中断与时钟节拍l时钟节拍(时钟滴答)时钟节拍(时钟滴答)TickTick,是一种定时器中断,可通过编程方,是一种定时器中断,可通过编程方式实现式实现l时钟节拍是一种特殊的中断,操作系统的心脏。首先时钟节拍是一种特殊的中断,操作系统的心脏。首先3232位的整数位的整数OSTimeOSTime加一。对任务列表进行扫描,判断是否有延时任务应该处加一。对任务列

41、表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。于准备就绪状态,最后进行上下文切换。47时钟节拍中断服务子程序时钟节拍中断服务子程序Void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter(),或是将OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; 调用OSTimeTick(); 清发出中断设备的中断; 重新允许中断(可选用) 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令;48void OSTimeTick (void) OS_TCB *ptc

42、b; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (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; pt

43、cb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7)时钟节拍函数时钟节拍函数OSTimTick()OSTimTick()49void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空闲任务空闲任务OSTaskIdle()50初始化统计任务初始化统计任务void main (void) OSInit(); /* 初始化初始化uC/OS-II

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

45、OS-II-II初始化初始化l首先调用系统初始化函数首先调用系统初始化函数OSIint()。OSIint()初始化初始化C/OS-所有的所有的变量和数据结构(见变量和数据结构(见OS_CORE.C)。)。lOSInit()建立空闲任务建立空闲任务idle task,这个任务总是处于就绪态的。空闲,这个任务总是处于就绪态的。空闲任务任务OSTaskIdle()的优先级总是设成最低,即()的优先级总是设成最低,即OS_LOWEST_PRIO。l如果统计任务允许如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为和任务建立扩展允许都设为1,则,则OSInit()还得建立统计任务还得

46、建立统计任务OSTaskStat()并且让其进入就绪态并且让其进入就绪态。OSTaskStat的优先级总是设为的优先级总是设为OS_LOWEST_PRIO-1 l空闲和统计任务的任务控制块(空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一)是用双向链表链接在一起的。起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。个任务总是被放在这个链表的起始处。52调用OSInit()之后的数据结构 53空闲缓冲区空闲缓冲区54C/OS-C/OS-的启动的启动void main (void) OSIn

47、it(); /* 初始化初始化uC/OS-II */ . . 通过调用通过调用OSTaskCreate()或或OSTaskCreateExt()创建至少一个任创建至少一个任务务; . . OSStart(); /* 开始多任务调度开始多任务调度!OSStart()永远不永远不会返回会返回 */55启动多任务启动多任务void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y OS_LO

48、WEST_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, (void *)0, 0); if (err = OS_NO_ERR) OS_ENTE

49、R_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堆栈检验,堆栈检验,OSTaskStkChk()OSTaskStkChk()删除任务,删除任务

50、,OSTaskDel()OSTaskDel()请求删除任务,请求删除任务,OSTaskDelReq()OSTaskDelReq()改变任务的优先级,改变任务的优先级,OSTaskChangePrio()OSTaskChangePrio()挂起任务,挂起任务,OSTaskSuspend()OSTaskSuspend()恢复任务,恢复任务,OSTaskResume() OSTaskResume() 其它相关函数其它相关函数63本节提要本节提要 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时

51、间管理 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-OSTCBDly = ticks; OS_E

52、XIT_CRITICAL(); OSSched(); 66延时详解67OSTimeDlyHMSM( )68本节提要本节提要 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来

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

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

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

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

57、emPend( )OSSemPend( )和和OSSemPost( )OSSemPost( )来支持信号量的两种原子来支持信号量的两种原子操作操作P()P()和和V()V()。P()P()操作减少信号量的值,如果新的信号量的值操作减少信号量的值,如果新的信号量的值不大于不大于0,0,则操作阻塞;则操作阻塞;V()V()操作增加信号量的值。操作增加信号量的值。 75任务、中断服务子程序和信号量之间的关系 T Ta as sk kI IS SR RT Ta as sk kO OS SS Se em mP Pe en nd d( () )O OS SS Se em mA Ac cc ce ep pt

58、 t( () )O OS SS Se em mQ Qu ue er ry y( () )O OS SS Se em mP Po os st t( () )O OS SS Se em mP Po os st t( () )O OS SS Se em mA Ac cc ce ep pt t( () )O OR RO OS SS Se em mC Cr re ea at te e( () )N NN N76信号量操作lC/OS-IIC/OS-II提供了提供了5 5个对信号量进行操作的函数。它们是:个对信号量进行操作的函数。它们是:lOSSemCreate()OSSemCreate()lOSSemPe

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

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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论