版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 LabrosseJean Labrosse 1992 1992年完成年完成l应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等机控制、高速公路电话系统、自动提款机等 l19981998年年 C/OSC/OS-II-II
3、,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61l20002000年,得到美国航空管理局(年,得到美国航空管理局(FAAFAA)的认证,可以用于飞行器)的认证,可以用于飞行器中中l网站网站www.ucos-II.comwww.ucos-II.com() )5u公开源代码公开源代码u可移植性(可移植性(PortablePortable) 绝大部分绝大部分 C/OS-II C/OS-II的源码是用移植性很强的的源码是用移植性很强的ANSI CANSI C写的。和微处理器写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最硬件相关的那部分是用
4、汇编语言写的。汇编语言写的部分已经压到最低限度,使得低限度,使得 C/OS-II C/OS-II便于移植到其他微处理器上。便于移植到其他微处理器上。 C/OS-II C/OS-II可以在可以在绝大多数绝大多数8 8位、位、1616位、位、3232位以至位以至6464位微处理器、微控制器位微处理器、微控制器 、数字信号处、数字信号处理器(理器(DSPDSP)上运行。)上运行。u可固化(可固化(ROMableROMable) C/OS-II C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(段(C C编译、连接、下载和固化),
5、编译、连接、下载和固化), C/OS-II C/OS-II可以嵌入到读者的产品可以嵌入到读者的产品中成为产品的一部分。中成为产品的一部分。u可裁剪(可裁剪(ScalableScalable) 可以只使用可以只使用 C/OS-II C/OS-II中应用程序需要的那些系统服务。也就是说某产中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个品可以只使用很少几个 C/OS-II C/OS-II调用,而另一个产品则使用了几乎所调用,而另一个产品则使用了几乎所有有 C/OS-II C/OS-II的功能,这样可以减少产品中的的功能,这样可以减少产品中的 C/OS-II C/OS-II所需的存储器
6、空所需的存储器空间(间(RAMRAM和和ROMROM)。这种可剪裁性是靠条件编译实现的。)。这种可剪裁性是靠条件编译实现的。C/OS的性能特点(一)6u占先式(占先式(PreemptivePreemptive)u多任务多任务 C/OS-IIC/OS-II可以管理可以管理6464个任务,然而,目前这一版本保留个任务,然而,目前这一版本保留8 8个给系统。应用程序最个给系统。应用程序最多可以有多可以有5656个任务个任务u可确定性可确定性 全部全部 C/OS-II C/OS-II的函数调用与服务的执行时间具有可确定性。的函数调用与服务的执行时间具有可确定性。u任务栈任务栈 每个任务有自己单独的栈,
7、每个任务有自己单独的栈, C/OS-II C/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-9515
9、40-5-58C/OS-II的各种商业应用l全世界有数百种产品在应用全世界有数百种产品在应用: :lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS (Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentationlPoint-of-sale terminalsl更多更多9C/
10、OS-II提供的系统服务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
11、 ANSI CWritten 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时
12、间管理时间管理l任务之间通信与同步任务之间通信与同步l C/OSC/OS的移植的移植C/OS-II的内核结构14任务task典型的任务一个无限循环。典型的任务一个无限循环。void mytask(void void mytask(void * *pdatapdata) ) 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。15Task StructureTask Structure void YourTask (void *pdata) (1) for (;) (2) /* 用户代码用户代码 */ 调用调用uC/
14、OS-II的某种系统服务的某种系统服务: OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用户代码用户代码 */ 16任务状态任务状态17任务控制块(TCB)l任务控制块任务控制块 OS_TCBOS_TCB是一个数据结构,保存该任务的相关参是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。务链表指针
15、等。l所有的任务控制块分为两条链表,空闲链表和使用链表。所有的任务控制块分为两条链表,空闲链表和使用链表。18任务级的任务调度-OSSchedl C/OSC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有绪,则拥有CPUCPU的所有权开始投入运行。的所有权开始投入运行。l C/OSC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。级的
16、任务并进行上下文切换。l C/OSC/OS任务调度所花的时间为常数,与应用程序中建立的任务数任务调度所花的时间为常数,与应用程序中建立的任务数无关。无关。19根据就绪表确定最高优先级两个关键两个关键: :l优先级数分解为高三位和低三位分别确定;优先级数分解为高三位和低三位分别确定;l高优先级有高优先级有着小的优先级号 ;20根据优先级找到任务在就绪任务表中的位置每个就绪的任务都放入就绪表中(每个就绪的任务都放入就绪表中(ready listready list)中,就绪表有两个变)中,就绪表有两个变量:量:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrp120
17、7 6 5 4 300XXXYY Y任务优先级20176543108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY优先级最低任务(空闲任务)优先级最高任务任务优先级号21根据优先级确定就绪表(1)n假设优先级为假设优先级为1212的任务进入就绪状态,的任务进入就绪状态,12=1100b,12=1100b,则则OSRdyTbl1O
18、SRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,相应的数学表达式为,相应的数学表达式为: : OSRdyGrpOSRdyGrp |=0 x02 |=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,相应的数学表达式为:相应的数学表达式为: OSRdyGrpOSRdy
19、Grp |=0 x04 |=0 x04; OSRdyTbl2 |=0 x20;OSRdyTbl2 |=0 x20;22根据优先级确定就绪表(2)l从上面的计算我们可以得到从上面的计算我们可以得到: :若若OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的第的第n n位置位置1 1,则应该把,则应该把OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的值与的值与2 2n n 相或。相或。uCuC/OS/OS中,把中,把2 2n n的的n=0-7n=0-7的的8 8个值先计算好存在数组个值先计算好存在数组OSMapTbl7OSMapTbl7中中, ,也就是:也
20、就是: OSMapTbl0 =2OSMapTbl0 =20 0=0 x01=0 x01(0000 00010000 0001) OSMapTbl1 =2OSMapTbl1 =21 1=0 x02=0 x02(0000 00100000 0010) OSMapTbl7 =2 OSMapTbl7 =27 7=0 x80=0 x80(1000 00001000 0000)23使任务进入就绪态n如果如果prioprio是任务是优先级,也是任务的识别号,则将任务放入就绪表是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:,即使任务进入就绪态的方法是:OSRdyGrp |=
21、OSMapTblprioOSRdyGrp |=OSMapTblprio3;3;OSRdyTblprio3 |=OSMapTblprioOSRdyTblprio3 |=OSMapTblprio & 0 x07; & 0 x07;n假设优先级为假设优先级为12121100b1100bOSRdyGrpOSRdyGrp |=0 x02 |=0 x02;OSRdyTbl1 |=0 x10;OSRdyTbl1 |=0 x10;24使任务脱离就绪态n将任务就绪表将任务就绪表OSRdyTblprioOSRdyTblprio33相应元素的相应位清零,而且当相应元素的相应位清零,而且当OSRdyTblprioOS
22、RdyTblprio33中的所有位都为零时,即全组任务中没有一个进中的所有位都为零时,即全组任务中没有一个进入就绪态时,入就绪态时,OSRdyGrpOSRdyGrp的相应位才为零。的相应位才为零。If(OSRdyTblprioIf(OSRdyTblprio3&= 3&= OSMapTblprioOSMapTblprio & 0 x07)=0); & 0 x07)=0);OSRdyGrpOSRdyGrp&= &= OSMapTblprioOSMapTblprio3;3;25根据就绪表确定最高优先级l通过通过OSRdyGrpOSRdyGrp值确定高值确定高3 3位,假设为位,假设为0 x24=10
23、0 100b, -0 x24=100 100b, - 对应对应OSRdyTbl2 OSRdyTbl2 和和OSRdyTbl5OSRdyTbl5,高优先级为,高优先级为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
24、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 5901234567OSRdyTbl7XY26源代码中使用了查表法 查表法具有确定的时间,增加了系统的可预测性,查表法具有确定的时间,增加了系统的可预测性,uCuC/OS/OS中所有的中所有的系统调用时间都是确定的系统调用时间都是确定的High3 =OSUnMapTblOSRdyGrpHigh3 =OSUnMapTblOSRdyGrp;Low3 =O
25、SUnMapTblOSRdyTblHigh3;Low3 =OSUnMapTblOSRdyTblHigh3;PrioPrio =(Hign33)+Low3; =(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 5901234567OSRdyTbl7XY27INT8U
26、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, 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,
27、 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,
28、 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,则查得,则查得OSUnMapTblOSRdyGrpOSUnMapT
29、blOSRdyGrp 的值是的值是3 3,它相应于,它相应于OSRdyGrpOSRdyGrp中的第中的第3 3位置位置1 1; 如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,则查,则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的的值是值是2 2,则进入就绪态的最高,则进入就绪态的最高任务优先级任务优先级 PrioPrio=3=3* *8+2=268+2=26 28Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if
30、 (OSLockNesting =0)&(OSIntNesting= 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();29void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(
31、); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OSIntNesting=0) OS_EXIT_CRITICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 31任务切换l将被挂起的任务寄存器入栈将被挂起的任务寄存器入栈l将较高优先级任务的寄存器出栈将较高优先级任务的寄存器出栈32任务级的任务切换OS_TASK_SW()lOS_TASK_SW()OS_TASK_SW()是宏调用,含有微处理器的软中断指令是宏调用,含有微处理器的软中断指令l
32、OS_TASK_SW()OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作将处理器相关的软件中断机制封装起来,便于操作系统移植系统移植33调用OS_TASK_SW()前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R434保存当前CPU寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4
33、PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)35重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)36C/OS-II中的中断l中断:中断:由于某种事件的发生,而导致程序流程的改变。产生中断的由于某种事件的发生,而导
34、致程序流程的改变。产生中断的事件称为中断源。事件称为中断源。lCPU响应中断的条件:响应中断的条件:n至少有一个中断源向至少有一个中断源向CPU发出中断信号;发出中断信号;n系统允许中断,且对此中断信号未予屏蔽系统允许中断,且对此中断信号未予屏蔽l中断类型:中断类型:n硬件中断硬件中断 n外部中断外部中断n陷井中断陷井中断n现场控制量的中断现场控制量的中断37 C/OSC/OS-II-II中的中断服务子程序中的中断服务子程序用户中断服务子程序:用户中断服务子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 调用调用OSIntEnterOSIntEnter()()或或OSIntNesting
35、OSIntNesting直接加直接加1 1; if(OSIntNestingif(OSIntNesting=1)=1) OSTCBCur-OSTCBStkPtr OSTCBCur-OSTCBStkPtr=SP;=SP; 清中断源;清中断源; 重新开中断;重新开中断; 执行用户代码做中断服务;执行用户代码做中断服务; 调用调用OSIntExitOSIntExit();(); 恢复所有恢复所有CPUCPU寄存器;寄存器; 执行中断返回指令;执行中断返回指令;38中断服务中断服务39中断与时钟节拍中断与时钟节拍l时钟节拍(时钟滴答)时钟节拍(时钟滴答)TickTick,是一种定时器中断,可通过编程方
36、,是一种定时器中断,可通过编程方式实现式实现l时钟节拍是一种特殊的中断,操作系统的心脏。首先时钟节拍是一种特殊的中断,操作系统的心脏。首先3232位的整数位的整数OSTimeOSTime加一。对任务列表进行扫描,判断是否有延时任务应该处加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。于准备就绪状态,最后进行上下文切换。40时钟节拍中断服务子程序时钟节拍中断服务子程序Void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter(),或是将OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OST
37、CBStkPtr=SP; 调用OSTimeTick(); 清发出中断设备的中断; 重新允许中断(可选用) 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令;41 C/OSC/OS-II-II初始化初始化l首先调用系统初始化函数首先调用系统初始化函数OSIint()。OSIint()初始化初始化C/OS-所有的所有的变量和数据结构(见变量和数据结构(见OS_CORE.C)。)。lOSInit()建立空闲任务建立空闲任务idle task,这个任务总是处于就绪态的。空闲,这个任务总是处于就绪态的。空闲任务任务OSTaskIdle()的优先级总是设成最低,即()的优先级总是设成
38、最低,即OS_LOWEST_PRIO。l如果统计任务允许如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为和任务建立扩展允许都设为1,则,则OSInit()还得建立统计任务还得建立统计任务OSTaskStat()并且让其进入就绪态并且让其进入就绪态。OSTaskStat的优先级总是设为的优先级总是设为OS_LOWEST_PRIO-1 l空闲和统计任务的任务控制块(空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一)是用双向链表链接在一起的。起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这指向这个链表的起始处。当建立一个任务时,这个任务总是被放
39、在这个链表的起始处。个任务总是被放在这个链表的起始处。42本节提要本节提要 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植43建立任务建立任务Use one of two serviceslOS TaskCreate()lOSTaskCreateExt ()44堆栈检验,堆栈检验,OSTaskStkChkOSTaskStkChk()()删除任务,删除任务,OSTaskDelOSTaskDel()()请求删除任务,请求删除任务,OSTaskDelReqOSTaskDelR
40、eq()()改变任务的优先级,改变任务的优先级,OSTaskChangePrioOSTaskChangePrio()()挂起任务,挂起任务,OSTaskSuspendOSTaskSuspend()()恢复任务,恢复任务,OSTaskResumeOSTaskResume() () 其它相关函数其它相关函数45本节提要本节提要 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植46时间管理Five services:lOSTimeDLY()lOSTimeDLYHMSM
41、()lOSTimeDlyResmue()lOStimeGet()lOSTimeSet()47OSTimeDly( )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(); 48延时详解49本节提要本节提要 C/OS-简介简介 C/OS-
42、C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植50任务间通信手段 C/OSC/OS中,采用多种方法保护任务之间的共享数据和提供任务之中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。间的通信。u提供提供OS_ENTER_CRITICALOS_ENTER_CRITICAL和和OS_EXIT_CRITICALOS_EXIT_CRITICAL来对临界资源进来对临界资源进行保护行保护uOSSchedLockOSSchedLock( )( )禁止调度保护任务级的共享资源。禁止调度保护任务级的共享资源
43、。u提供了经典操作系统任务间通信方法:信号量、邮箱、消息提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。队列,事件标志。 51信号量semaphorel信号量在多任务系统中用于:控制共享资源的使用权、标志事件信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。的发生、使两个任务的行为同步。luCuC/OS/OS中信号量由两部分组成:信号量的计数值和等待该信号任中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制务的等待任务表。信号量的计数值可以为二进制, , 也可以是其他也可以是其他整数。整数。l系统
44、通过系统通过OSSemPend( )OSSemPend( )和和OSSemPostOSSemPost( )( )来支持信号量的两种原子来支持信号量的两种原子操作操作P()P()和和V()V()。P()P()操作减少信号量的值,如果新的信号量的值操作减少信号量的值,如果新的信号量的值不大于不大于0,0,则操作阻塞;则操作阻塞;V()V()操作增加信号量的值。操作增加信号量的值。 52任务、中断服务子程序和信号量之间的关系 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
45、 ce ep pt 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 N53邮 箱l邮箱是邮箱是C/OS-IIC/OS-II中另一种通讯机制,它可以使一个任务中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变或者中断服务子
46、程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定量。该指针指向一个包含了特定“消息消息”的数据结构。的数据结构。为了在为了在C/OS-IIC/OS-II中使用邮箱,必须将中使用邮箱,必须将OS_CFG.HOS_CFG.H中的中的OS_MBOX_ENOS_MBOX_EN常数置为常数置为1 1。l使用邮箱之前,必须先建立该邮箱。该操作可以通过调使用邮箱之前,必须先建立该邮箱。该操作可以通过调用用OSMboxCreateOSMboxCreate()()函数来完成,并且要指定指针的初始函数来完成,并且要指定指针的初始值。值。lC/OS-IIC/OS-II提供了提供了5 5种对邮箱的操作:
47、种对邮箱的操作:OSMboxCreateOSMboxCreate()(),OSMboxPendOSMboxPend()(),OSMboxPostOSMboxPost()(),OSMboxAcceptOSMboxAccept()()和和OSMboxQueryOSMboxQuery()()函数函数 54任务、中断服务子程序和邮箱之间的关系 T Ta as sk kI IS SR RT Ta as sk kO OS SM Mb bo ox xP Pe en nd d( () )O OS SM Mb bo ox xA Ac cc ce ep pt t( () )O OS SM Mb bo ox xQ
48、Qu ue er ry y( () )O OS SM Mb bo ox xP Po os st t( () )O OS SM Mb bo ox xP Po os st t( () )O OS SM Mb bo ox xA Ac cc ce ep pt t( () )O OS SM Mb bo ox xC Cr re ea at te e( () )M Ma ai il lb bo ox xM Me es ss sa ag ge e55消息队列l消息队列是消息队列是C/OS-IIC/OS-II中另一种通讯机制,它可以使一个中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针
49、方式任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用数据结构变量也有所不同。为了使用C/OS-IIC/OS-II的消息队的消息队列功能,需要在列功能,需要在OS_CFG.H OS_CFG.H 文件中,将文件中,将OS_Q_ENOS_Q_EN常数设置常数设置为为1 1,并且通过常数,并且通过常数OS_MAX_QSOS_MAX_QS来决定来决定C/OS-IIC/OS-II支持的最支持的最多消息队列数。多消息队列数。l在使用一个消息队列之前,必须先建立该消息队列。这在使用一
50、个消息队列之前,必须先建立该消息队列。这可以通过调用可以通过调用OSQCreateOSQCreate()()函数,并定义消息队列中的单函数,并定义消息队列中的单元数(消息数)来完成。元数(消息数)来完成。lC/OS-IIC/OS-II提供了提供了7 7个对消息队列进行操作的函数:个对消息队列进行操作的函数:OSQCreateOSQCreate()(),OSQPendOSQPend()(),OSQPostOSQPost()(),OSQPostFrontOSQPostFront()(),OSQAcceptOSQAccept()(),OSQFlushOSQFlush()()和和OSQQueryOSQ
51、Query()()函数函数 56任务、中断服务子程序和消息队列之间的关系 T Ta as sk kI IS SR RT Ta as sk kO OS SQ QP Pe en nd d( () )O OS SQ QA Ac cc ce ep pt t( () )O OS SQ QQ Qu ue er ry y( () )O OS SQ QP Po os st t( () )O OS SQ QP Po os st tF Fr ro on nt t( () )O OS SQ QF Fl lu us sh h( () )O OS SQ QP Po os st t( () )O OS SQ QP Po
52、os st tF Fr ro on nt t( () )O OS SQ QF Fl lu us sh h( () )O OS SQ QA Ac cc ce ep pt t( () )O OS SQ QC Cr re ea at te e( () )Q Qu ue eu ue eM Me es ss sa ag ge eN N57操作系统的启动和运行过程嵌入式控制器硬件初始化操作系统初始化LCD初始化装载字库调用系统配置文件创建任务初始化用户界面、时钟启动多任务调度主 任务用 户程序消 息处理任务1任务n58总结总结l不存在一个内核任务不存在一个内核任务/ /实体,内核的管理是通过调用系统函数来
53、实体,内核的管理是通过调用系统函数来实现的。实现的。l每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。每个任务的总的运行结果。59本节提要本节提要 C/OS-简介简介 C/OS-C/OS-内核结构内核结构 C/OS-任务通信与同步任务通信与同步 C/OS-任务管理任务管理 C/OS-时间管理时间管理 C/OS-移植移植60 COS-II在在ARM7上的移植上的移植所谓移植,是指使一个实时操作系统能够在某个微处理器所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。平台上运行。 COS-IICOS-
54、II的主要代码都是由标准的的主要代码都是由标准的C C语言写成的,语言写成的,移植方便。移植方便。61移植移植 COS-II满足的条件满足的条件 l处理器的处理器的C C编译器能产生可重入代码编译器能产生可重入代码 l在程序中可以打开或者关闭中断在程序中可以打开或者关闭中断 l处理器支持中断,并且能产生定时中断(通常在处理器支持中断,并且能产生定时中断(通常在10101000Hz1000Hz之间)之间) l处理器支持能够容纳一定量数据的硬件堆栈处理器支持能够容纳一定量数据的硬件堆栈 l处理器有将堆栈指针和其他处理器有将堆栈指针和其他CPUCPU寄存器存储和读出到堆栈(寄存器存储和读出到堆栈(或
55、者内存)的指令或者内存)的指令 6263打开打开/关闭中断关闭中断 在在 COS-IICOS-II中,可以通过:中,可以通过:OS_ENTER_CRITICAL () OS_ENTER_CRITICAL () OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。宏来控制系统关闭或者打开中断。这需要处理器的支持。在在ARM7TDMIARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。系统的所有中断。 64处理器支持中断并且能产生定时中断 l COS-IIC
56、OS-II是通过处理器产生的定时器的中断来实现多任务之间是通过处理器产生的定时器的中断来实现多任务之间的调度的。的调度的。ARM7TDMIARM7TDMI的处理器上可以产生定时器中断。的处理器上可以产生定时器中断。65处理器支持硬件堆栈 l COS-IICOS-II进行任务调度的时候,会把当前任务的进行任务调度的时候,会把当前任务的CPUCPU寄存器存寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是入栈和出栈是 COS-IICOS-II多任务调度的基础。多任务调度的基础。 lARM7ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。66例:C/OS-II在S3C44B0X上的移植 l设置设置OS_CPU.HOS_CPU.H中与处理器和编译器相关的代码中与处理器和编译器相关的代码 l用用C C语言编写六个操作系统相关的函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 延安职业技术学院《物理化学B(限选)》2024-2025学年第二学期期末试卷
- 机关内部绩效管理制度
- 机关团委内部考核制度
- 杭州投资内部控制制度
- 果蔬公司内部制度
- 核算机构内部管理制度
- 检验科内部考核制度
- 民办非企业单位内部制度
- 太原城市职业技术学院《仲裁法理论与实务》2024-2025学年第二学期期末试卷
- 海底捞内部职工薪酬制度
- 农田水利工程施工组织设计范例
- 脑中风科普知识讲座
- 历史试题-汕头市2025-2026学年度普通高中毕业班教学质量监测(含解析)
- 平法图集培训
- 2026年年时事政治必考考试卷含答案
- 部队食堂制度规范标准
- 二十届中纪委五次全会知识测试题及答案解析
- 游泳馆通风制度规范要求
- 房内装修拆除合同范本
- 公司品牌宣传年度推广计划
- 2025年贵州省高考化学试卷真题(含答案及解析)
评论
0/150
提交评论