《最新嵌入式实时操作系统分析PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式实时操作系统分析PPT课件.ppt(163页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式实时操作系统分析嵌入式实时操作系统分析2实时操作系统实时操作系统C/OS-II1 13 32 24 4 C/OS-II概述概述任务管理任务管理中断和时间中断和时间管理管理任务之间的通信与任务之间的通信与同步同步5 5存储管理存储管理3456789u公开源代码公开源代码u可移植性(可移植性(PortablePortable)绝大部分绝大部分 C/OS-IIC/OS-II的源码是用移植性很强的的源码是用移植性很强的ANSI CANSI C写的。和微处理器写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限
2、度,使得低限度,使得 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编译、连接、下载和固化),编译、连接、下载和固化),C/OS-IIC/OS-II可
3、以嵌入到读者的产品可以嵌入到读者的产品中成为产品的一部分。中成为产品的一部分。u可裁剪(可裁剪(ScalableScalable)可以只使用可以只使用 C/OS-IIC/OS-II中应用程序需要的那些系统服务。也就是说某产中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个品可以只使用很少几个 C/OS-IIC/OS-II调用,而另一个产品则使用了几乎所调用,而另一个产品则使用了几乎所有有 C/OS-IIC/OS-II的功能,这样可以减少产品中的的功能,这样可以减少产品中的 C/OS-IIC/OS-II所需的存储器空所需的存储器空间(间(RAMRAM和和ROMROM)。)。这种可剪裁
4、性是靠条件编译实现的。这种可剪裁性是靠条件编译实现的。C/OS的性能特点(一)10u占先式(占先式(PreemptivePreemptive)总是运行就绪条件下优先级最高的任务。总是运行就绪条件下优先级最高的任务。u多任务多任务 C/OS-IIC/OS-II可以管理可以管理6464个任务,然而,目前这一版本保留个任务,然而,目前这一版本保留8 8个给系统。应用程序最多个给系统。应用程序最多可以有可以有5656个任务。个任务。u可确定性可确定性 全部全部 C/OS-IIC/OS-II的函数调用与服务的执行时间具有可确定性。的函数调用与服务的执行时间具有可确定性。u任务栈任务栈 每个任务有自己单独
5、的栈,每个任务有自己单独的栈,C/OS-IIC/OS-II允许每个任务有不同的栈空间,以便压低应允许每个任务有不同的栈空间,以便压低应用程序对用程序对RAMRAM的需求。的需求。u系统服务系统服务 C/OS-IIC/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。的申请与释放、时间相关函数等。u中断管理中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退
6、出后立即执行,中断嵌套层数可达高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255255层。层。u稳定性与可靠性稳定性与可靠性C/OS的性能特点(二)11C/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
7、40-5-512C/OS-II的各种商业应用l全世界有数百种产品在应用全世界有数百种产品在应用:lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS(Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentationlPoint-of-sale terminalsl更多更多13C/O
8、S-II提供的系统服务l信号量信号量l带互斥机制的信号量带互斥机制的信号量n减少优先级倒置的问题减少优先级倒置的问题l事件标志事件标志l消息信箱消息信箱l消息队列消息队列l内存管理内存管理l时钟管理时钟管理l任务管理任务管理14C/GUI and C/FSlC/GUIC/GUIl嵌入式的用户界面嵌入式的用户界面l用用ANSI CANSI C书写书写l支持任何支持任何8,16,32-bits CPU8,16,32-bits CPUl彩色,灰、度,等级或黑白显示彩色,灰、度,等级或黑白显示l代码尺寸小代码尺寸小lC/FSC/FSl嵌入式的文件系统嵌入式的文件系统Written in ANSI CW
9、ritten 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其他介质其他介质15可移植的可移植的数据类型数据类型typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsignedintINT16S;typedefunsignedl
10、ongINT32U;typedefsignedlongINT32S;typedeffloatFP32;typedefdoubleFP64;16C/OS-II的文件结构171 13 32 24 4 C/OS-II概述概述任务管理任务管理中断和时间中断和时间管理管理任务之间的通信与任务之间的通信与同步同步5 5存储管理存储管理18任务的实现任务的实现创建任务的系统服务创建任务的系统服务lOSTaskCreate()INT8UOSTaskCreate(void(*task)(void*pd),/任务代码指针任务代码指针void*pdata,/任务参数指针任务参数指针OS_STK*ptos,/任务栈的
11、栈顶指针任务栈的栈顶指针INT8Uprio/任务的优先级任务的优先级);lOSTaskCreateExt()19任务主函数任务主函数一个任务通常是一个无限循环(返回值类型一个任务通常是一个无限循环(返回值类型voidvoid)voidMyTask(void*pdata)while(1)dosomething;waiting;dosomething;20任务也可以自我删除(并非真的删除,只是内核不任务也可以自我删除(并非真的删除,只是内核不再知道该任务)再知道该任务)voidMyTask(void*pdata)./*用户代码用户代码*/OSTaskDel(OS_PRIO_SELF);21lC/O
12、S-C/OS-可以管理多达可以管理多达6464个任务;个任务;l每个任务被赋以不同的优先级,取值从每个任务被赋以不同的优先级,取值从0 0到到OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2,数值越小,优先级越高;,数值越小,优先级越高;l系统保留了优先级为系统保留了优先级为0 0、1 1、2 2、3 3、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1OS_LOWEST_PRI0-1以及以及OS_LOWEST_PRI0OS_LOWEST_PRI0这这8 8个任务
13、个任务以被将来使用,用户可以有以被将来使用,用户可以有5656个应用任务;个应用任务;l任务的优先级同样也是它的标识号任务的优先级同样也是它的标识号IDID。OS_CFG.H中定义中定义6122空闲任务和统计任务空闲任务和统计任务l内核总是创建一个内核总是创建一个空闲任务空闲任务OSTaskIdle()OSTaskIdle();w总是设置为最低优先级,总是设置为最低优先级,OS_LOWEST_PRIOOS_LOWEST_PRIO;w当所有其他任务都未在执行时,空闲任务开始当所有其他任务都未在执行时,空闲任务开始执行;执行;w应用程序不能删除该任务;应用程序不能删除该任务;w空闲任务的工作就是把
14、空闲任务的工作就是把3232位计数器位计数器OSIdleCtrOSIdleCtr加加1 1,该计数器被统计任务所使用;,该计数器被统计任务所使用;l统计任务统计任务OSTaskStat()OSTaskStat(),提供运行时间统计。每,提供运行时间统计。每秒钟运行一次,计算当前的秒钟运行一次,计算当前的CPUCPU利用率。其优先级利用率。其优先级是是OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1,可选。,可选。23任务控制块任务控制块TCBTCBl任务控制块任务控制块 OS_TCB OS_TCB是描述一个任务的核是描述一个任务的核心数据结构,存放了它的各种管理信息,心数据结构
15、,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优先包括任务堆栈指针,任务的状态、优先级,任务链表指针等;级,任务链表指针等;l一旦任务建立了,任务控制块一旦任务建立了,任务控制块OS_TCBOS_TCB将将被赋值。被赋值。24任务控制块任务控制块TCBTCBtypedefstructos_tcb栈栈指指针针;INT16UOSTCBId;/*任任务务的的ID*/链链表指表指针针;OS_EVENT*OSTCBEventPtr;/*事件指事件指针针*/void*OSTCBMsg;/*消息指消息指针针*/INT8UOSTCBStat;/*任任务务的状的状态态*/INT8UOSTCBPrio;
16、/*任任务务的的优优先先级级*/其他其他OS_TCB;25栈指针栈指针lOSTCBStkPtrOSTCBStkPtr:指向当前任务栈顶的指针,指向当前任务栈顶的指针,每个任务可以有自己的栈,栈的容量可以每个任务可以有自己的栈,栈的容量可以是任意的;是任意的;lOSTCBStkBottomOSTCBStkBottom:指向任务栈底的指针;:指向任务栈底的指针;lOSTCBStkSizeOSTCBStkSize:栈的容量,用可容纳的指:栈的容量,用可容纳的指针数目而不是字节数(针数目而不是字节数(ByteByte)来表示。)来表示。2627链表指针链表指针l所有的任务控制块分属于两条不同的链表,所
17、有的任务控制块分属于两条不同的链表,单向的单向的空闲链表空闲链表(头指针为(头指针为OSTCBFreeListOSTCBFreeList)和双向的)和双向的使用链表使用链表(头(头指针为指针为OSTCBListOSTCBList););lOSTCBNextOSTCBNext、OSTCBPrevOSTCBPrev:用于将任务控制用于将任务控制块插入到空闲链表或使用链表中。每个任块插入到空闲链表或使用链表中。每个任务的任务控制块在任务创建的时候被链接务的任务控制块在任务创建的时候被链接到使用链表中,在任务删除的时候从链表到使用链表中,在任务删除的时候从链表中被删除。双向连接的链表使得任一成员中被删
18、除。双向连接的链表使得任一成员都能快速插入或删除。都能快速插入或删除。28空闲空闲TCBTCB链表链表l所有的任务控制块都被放置在任务控制块列表数组所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl中,系统初始化时,所有中,系统初始化时,所有TCBTCB被链接成空闲的单向链表,被链接成空闲的单向链表,头指针为头指针为OSTCBFreeListOSTCBFreeList。当创建一个任务后,就把。当创建一个任务后,就把OSTCBFreeListOSTCBFreeList所指向的所指向的TCBTCB赋给了该任务,并将它加入到赋给了该任务,并将它加入到使用链表中,然后把使用链表中,然后把OS
19、TCBFreeListOSTCBFreeList指向空闲链表中的下一指向空闲链表中的下一个结点。个结点。29系统初始化后系统初始化后指针数组,指向相应指针数组,指向相应TCB30任务的状态休眠任务的状态休眠l休眠状态休眠状态(Dormant):任务存在于内存:任务存在于内存空间中,但内核不可见;空间中,但内核不可见;l可以通过以下函数通知内核,使之变为就可以通过以下函数通知内核,使之变为就绪状态:绪状态:OSTaskCreate()或或OSTaskCreateExt()l可以通过以下函数返回到休眠状态:可以通过以下函数返回到休眠状态:OSTaskDel()31任务的状态就绪任务的状态就绪l就绪
20、状态就绪状态(Ready):万事具备,只欠):万事具备,只欠CPU;l在所有的就绪任务当中,具有最高优先级在所有的就绪任务当中,具有最高优先级的任务被选中去运行;的任务被选中去运行;l如果任务在运行的时候被抢占了如果任务在运行的时候被抢占了CPU,则,则又回到就绪状态。又回到就绪状态。32任务的状态运行任务的状态运行l运行状态运行状态(Running):任务在):任务在CPU上运上运行;行;l当一个任务在运行时,如果没有关闭中断,当一个任务在运行时,如果没有关闭中断,则有可能被中断所打断;则有可能被中断所打断;l当一个任务在运行时,可能因为各种原因进当一个任务在运行时,可能因为各种原因进入阻塞
21、状态。入阻塞状态。OSMBoxPend(),OSQPend(),OSSemPend()OSTaskSuspend(),OSTimeDly()33任务的状态任务的状态ISRISRl中断服务状态中断服务状态(ISR):该任务原来在):该任务原来在CPU上运行,后来被中断所打断,由中断服务程上运行,后来被中断所打断,由中断服务程序序ISR接管了接管了CPU;l当中断服务程序运行完毕后,内核要判断是当中断服务程序运行完毕后,内核要判断是否有新的、更高优先级的任务就绪,如果有,否有新的、更高优先级的任务就绪,如果有,则原有的任务被抢占;如果没有,则原有的则原有的任务被抢占;如果没有,则原有的任务重新运行
22、。任务重新运行。34任务的状态阻塞任务的状态阻塞l阻塞阻塞/等待状态等待状态(Waiting):任务由于正在):任务由于正在等待某个事件(信号量、邮箱或队列)而被等待某个事件(信号量、邮箱或队列)而被挂起;挂起;l当任务等待的事件发生时,回到就绪状态。当任务等待的事件发生时,回到就绪状态。OSMBoxpost(),OSQPost(),OSSemPost(),OSTaskResume(),OSTimeDlyResume()或或OSTimeTick()35状态的转换状态的转换删除任务删除任务 36任务就绪表任务就绪表l每个任务的就绪态标志放入在就绪表中,每个任务的就绪态标志放入在就绪表中,就绪表中
23、有两个变量就绪表中有两个变量OSRdyGrpOSRdyGrp和和OSRdyTblOSRdyTbl。l在在OSRdyGrpOSRdyGrp中,任务按优先级分组,中,任务按优先级分组,8 8个任个任务为一组。务为一组。OSRdyGrpOSRdyGrp中的每一位表示中的每一位表示8 8组任组任务中每一组中是否有进入就绪态的任务。务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表任务进入就绪态时,就绪表OSRdyTblOSRdyTbl中中的相应元素的相应位也置位。的相应元素的相应位也置位。37任务就绪表任务就绪表OSRdyGrp OSRdyGrp 1207 6 5 4 300X XX XX
24、XY YY Y Y 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 5901234567OSRdyTbl8OSRdyTbl8X XY Y优先级最低任务优先级最低任务 (空闲任务)(空闲任务)优先级最高任务优先级最高任务 任务优先级号任务优先级号 对于整数对于整数OSRdyTbli(0 i 7),若它的某一位),若它的某一位为为1,则,
25、则OSRdyGrp的第的第i位为位为1。任务的优先级由任务的优先级由X和和Y确定确定38根据优先级确定就绪表根据优先级确定就绪表(1)(1)n假假 设设 优优 先先 级级 为为 1212的的 任任 务务 进进 入入 就就 绪绪 状状 态态,12=1100b,12=1100b,则则 OSRdyTbl1OSRdyTbl1的的 第第 4 4位位 置置 1 1,且且OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,相应的数学表达式为,相应的数学表达式为:OSRdyGrpOSRdyGrp|=0 x02|=0 x02;OSRdyTbl1|=0 x10;OSRdyTbl1|=0 x10;n而而优
26、优先先级级为为2121的的任任务务就就绪绪21=10 21=10 101b101b,则则OSRdyTbl2OSRdyTbl2的的第第5 5位位置置1 1,且且OSRdyGrpOSRdyGrp的的第第2 2位位置置1,1,相应的数学表达式为:相应的数学表达式为:OSRdyGrpOSRdyGrp|=0 x04|=0 x04;OSRdyTbl2|=0 x20;OSRdyTbl2|=0 x20;39根据优先级确定就绪表根据优先级确定就绪表(2)(2)n从从上上面面的的计计算算可可知知:若若OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的的第第n n位位置置1 1,则则应应该该把把
27、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=2OSMapTbl1=21 1=0 x02=0 x02(0000 00100000 0010)OSMapTbl7=2 OSMapTbl7=27 7=0 x80=0 x80(1000 000
28、01000 0000)40使任务进入就绪态使任务进入就绪态n如如果果prioprio是是任任务务的的优优先先级级,即即任任务务的的标标识识号号,则则将将任务放入就绪表,即使任务进入就绪态的方法是:任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrpOSRdyGrp|=|=OSMapTblprioOSMapTblprio3;3;OSRdyTblprioOSRdyTblprio3|=OSMapTblprio&0 x07;3|=OSMapTblprio&0 x07;n假设优先级为假设优先级为121100b121100bOSRdyGrpOSRdyGrp|=OSMapTbl123(0 x02)|
29、=OSMapTbl123(0 x02);OSRdyTbl1|=0 x10;OSRdyTbl1|=0 x10;41使任务脱离就绪态使任务脱离就绪态n将将任任务务就就绪绪表表OSRdyTblprioOSRdyTblprio33相相应应元元素素的的相相应应位位清清零零,而而且且当当OSRdyTblprioOSRdyTblprio33中中的的所所有有位位都都为为零零时时,即即该该任任务务所所在在组组的的所所有有任任务务中中没没有有一一个个进入就绪态时,进入就绪态时,OSRdyGrpOSRdyGrp的相应位才为零。的相应位才为零。if(OSRdyTblprio3&=OSMapTblprio&0 x07)
30、=0)OSRdyGrp&=OSMapTblprio3;42任务的调度任务的调度l C/OSC/OS是可抢占实时多任务内核,它总是运行是可抢占实时多任务内核,它总是运行就绪任务中优先级最高的那一个。就绪任务中优先级最高的那一个。l C/OSC/OS中不支持时间片轮转法,每个任务的优中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。并进行上下文切换。l C/OSC/OS任务调度所花的时间为常数,与应用程任务调度所花的时间为常数,与应用程序
31、中建立的任务数无关。序中建立的任务数无关。43l确定哪个任务的优先级最高,应该选择哪个任确定哪个任务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器务去运行,这部分的工作是由调度器(SchedulerScheduler)来完成的。)来完成的。w任务级的调度是由函数任务级的调度是由函数OSSchedOSSched()()完成的;完成的;w中断级的调度是由另一个函数中断级的调度是由另一个函数OSIntExtOSIntExt()()完完成的。成的。44根据就绪表确定最高优先级根据就绪表确定最高优先级两个关键两个关键:l将优先级数分解为高三位和低三位分别确将优先级数分解为高三位和低三位分别
32、确定;定;l高优先级有着小的优先级号;高优先级有着小的优先级号;45根据就绪表确定最高优先级根据就绪表确定最高优先级l通过通过OSRdyGrpOSRdyGrp值确定高值确定高3 3位,假设位,假设OSRdyGrpOSRdyGrp0 x08=0 x08=0 x000010000 x00001000,第,第3 3位为位为1 1,优先级的高,优先级的高3 3位为位为011011;l通过通过OSRdyTbl3OSRdyTbl3的值来确定低的值来确定低3 3位,假设位,假设OSRdyTbl3OSRdyTbl30 x3a0 x3a,第,第1 1位为位为1 1,优先级的低,优先级的低3 3位为位为00100
33、1,3*8+1=3*8+1=252500011001任务优先级任务优先级46任务调度器任务调度器voidOSSched(void)INT8Uy;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)y=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(y3)+OSUnMapTblOSRdyTbly);if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW();OS_EXIT_CRITICA
34、L();检查是否中断调用和允许任务调用找到优先级最高的任务该任务是否正在运行47源代码中使用了查表法n查查表表法法具具有有确确定定的的时时间间,增增加加了了系系统统的的可可预预测测性性,uCuC/OS/OS中中所所有有的的系系统统调调用用时时间间都都是是确定的确定的Y=OSUnMapTblOSRdyGrp;X=OSUnMapTblOSRdyTblY;Prio=(Y3)+X;参参见见OS_CORE.C48INT8U 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,
35、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,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,
36、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;优先级判定表OSUnMapTbl256举例:举例:如如OSRdyGrpOSRdyGrp的值为的值为01101000B01101000B,即,即0X680X68,则查,则查得得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的的值是值是3 3,它相应于,它相应于OSRdyGrpOSRdyGrp中的第中
37、的第3 3位置位置1 1;如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,则查,则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值是的值是2 2,则进入就绪态的,则进入就绪态的最高任务优先级最高任务优先级 Prio=3*8+2=26 Prio=3*8+2=26 49任务切换l将被挂起任务的寄存器内容入栈;将被挂起任务的寄存器内容入栈;l将较高优先级任务的寄存器内容出栈,将较高优先级任务的寄存器内容出栈,恢复到硬件寄存器中。恢复到硬件寄存器中。50任务级的任务切换OS_TASK_SW()l通过通过
38、scsc系统调用指令完成系统调用指令完成l保护当前任务的现场保护当前任务的现场l恢复新任务的现场恢复新任务的现场l执行中断返回指令执行中断返回指令l开始执行新的任务开始执行新的任务51调用OS_TASK_SW()前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)52保存当前CPU寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R
39、4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)53重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)54任务切换OS_TASK_SW()的代码Void OSCtxSw(void)将R1,R2,R3及R4推入当前堆栈;OSTCBCurOSTC
40、BStkPtr=SP;OSTCBCur =OSTCBHighRdy;SP =OSTCBHighRdy OSTCBSTKPtr;将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;55给调度器上锁lOSSchedlock():给调度器上锁函数,用于禁:给调度器上锁函数,用于禁止任务调度,保持对止任务调度,保持对CPU的控制权(即使有优的控制权(即使有优先级更高的任务进入了就绪态);先级更高的任务进入了就绪态);lOSSchedUnlock():给调度器开锁函数,当任:给调度器开锁函数,当任务完成后调用此函数,调度重新得到允许;务完成后调用此函数,调度重新得到允许;l当低优先级的任务要发消息
41、给多任务的邮箱、当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,它不希望高优先级的任消息队列、信号量时,它不希望高优先级的任务在邮箱、队列和信号量还没有得到消息之前务在邮箱、队列和信号量还没有得到消息之前就取得了就取得了CPU的控制权,此时,可以使用调度的控制权,此时,可以使用调度器上锁函数。器上锁函数。56任务管理的系统服务任务管理的系统服务v创建任务创建任务v删除任务删除任务v修改任务的优先级修改任务的优先级v挂起和恢复任务挂起和恢复任务v获得一个任务的有关信息获得一个任务的有关信息57创建任务创建任务(创建任务的函数创建任务的函数SOSTaskCreate();SOSTask
42、CreateExt();(OSTaskCreateExt()OSTaskCreateExt()是是OSTaskCreate()OSTaskCreate()的扩展版本,的扩展版本,提供了一些附加的功能提供了一些附加的功能;(任务可以在多任务调度开始任务可以在多任务调度开始 (即调用即调用OSStartOSStart()()之前创建,也可以在其它任务的执行过程中被创之前创建,也可以在其它任务的执行过程中被创建。但在建。但在OSStartOSStart()()被调用之前,用户必须创建至被调用之前,用户必须创建至少一个任务;少一个任务;(不能在中断服务程序不能在中断服务程序(ISR)(ISR)中创建新
43、任务。中创建新任务。58OSTaskCreate()OSTaskCreate()INT8UOSTaskCreate(void(*task)(void*pd),/任务代码指针任务代码指针void*pdata,/任务参数指针任务参数指针OS_STK*ptos,/任务栈的栈顶指针任务栈的栈顶指针INT8Uprio/任务的优先级任务的优先级);返回值返回值OS_NO_ERR:函数调用成功;:函数调用成功;OS_PRIO_EXIT:任务优先级已经存在;:任务优先级已经存在;OS_PRIO_INVALID:任务优先级无效。:任务优先级无效。59OSTaskCreate()OSTaskCreate()的实现
44、过程的实现过程v任务优先级检查任务优先级检查该优先级是否在该优先级是否在0 0到到OS_LOWSEST_PRIOOS_LOWSEST_PRIO之间?之间?该优先级是否空闲?该优先级是否空闲?v调用调用OSTaskStkInitOSTaskStkInit()(),创建任务的栈帧;,创建任务的栈帧;v调用调用OSTCBInitOSTCBInit()(),从空闲的,从空闲的OS_TCBOS_TCB池(即池(即OSTCBFreeListOSTCBFreeList链表)中获得一个链表)中获得一个TCBTCB并初始化其并初始化其内容,然后把它加入到内容,然后把它加入到OSTCBListOSTCBList链
45、表的开头,并链表的开头,并把它设定为就绪状态;把它设定为就绪状态;v任务个数任务个数OSTaskCtrOSTaskCtr加加1 1;v调用用户自定义的函数调用用户自定义的函数OSTaskCreateHookOSTaskCreateHook()();v判断是否需要调度(调用者是正在执行的任务)判断是否需要调度(调用者是正在执行的任务)60OSTaskCreateExt()OSTaskCreateExt()INT8UOSTaskCreateExt(前四个参数与前四个参数与OSTaskCreate相同,相同,INT16Uid,/任务的任务的IDOS_STK*pbos,/指向任务栈底的指针指向任务栈底
46、的指针INT32Ustk_size,/栈栈能容纳的成员能容纳的成员数目数目void*pext,/指向用户附加数据域的指针指向用户附加数据域的指针INT16Uopt/一些选项信息一些选项信息);返回值:与返回值:与OSTaskCreate()相同。相同。61任务的栈空间任务的栈空间(每个任务都有自己的栈空间(每个任务都有自己的栈空间(StackStack),栈必须声),栈必须声明为明为OS_STKOS_STK类型,并且由连续的内存空间组成;类型,并且由连续的内存空间组成;(栈空间的分配方法栈空间的分配方法?静态分配:在编译的时候分配,例如:静态分配:在编译的时候分配,例如:staticOS_ST
47、KMyTaskStackstack_size;OS_STKMyTaskStackstack_size;?动态分配:在任务运行的时候使用动态分配:在任务运行的时候使用mallocmalloc()()函函数来动态申请内存空间;数来动态申请内存空间;62OS_STK*pstk;pstk=(OS_STK*)malloc(stack_size);/*确认确认malloc()能得到足够的内存空间能得到足够的内存空间*/if(pstk!=(OS_STK*)0)Createthetask;动态分配动态分配63内存碎片问题内存碎片问题(在动态分配中,可能存在内存碎片问题。特别是在动态分配中,可能存在内存碎片问题
48、。特别是当用户反复地建立和删除任务时,内存堆中可能当用户反复地建立和删除任务时,内存堆中可能会出现大量的碎片,导致没有足够大的一块连续会出现大量的碎片,导致没有足够大的一块连续内存区域可用作任务栈,这时内存区域可用作任务栈,这时mallocmalloc()()便无法成便无法成功地为任务分配栈空间。功地为任务分配栈空间。3Kb堆初始状态堆初始状态A(1Kb)B(1Kb)C(1Kb)3个任务个任务1KbB(1Kb)1Kb删除删除A,C内碎片内碎片/外碎片外碎片?64栈的增长方向栈的增长方向(栈的增长方向的设置栈的增长方向的设置?从低地址到高地址:在从低地址到高地址:在OS_CPU.HOS_CPU.
49、H中,将常量中,将常量 OS_STK_GROWTHOS_STK_GROWTH设定为设定为 0 0;?从高地址到低地址:在从高地址到低地址:在OS_CPU.HOS_CPU.H中,将常量中,将常量 OS_STK_GROWTHOS_STK_GROWTH设定为设定为 1 1;OS_STKTaskStackTASK_STACK_SIZE;OSTaskCreate(task,pdata,&TaskStackTASK_STACK_SIZE-1,prio);65删除任务删除任务(OSTaskDelOSTaskDel()():删除一个任务,其:删除一个任务,其TCBTCB会从所有可能会从所有可能的系统数据结构中
50、移除。任务将返回并处于休眠状的系统数据结构中移除。任务将返回并处于休眠状态(任务的代码还在)。态(任务的代码还在)。F如果任务正处于就绪状态,把它从就绪表中移如果任务正处于就绪状态,把它从就绪表中移出,这样以后就不会再被调度执行了;出,这样以后就不会再被调度执行了;F如果任务正处于邮箱、消息队列或信号量的等如果任务正处于邮箱、消息队列或信号量的等待队列中,也把它移出;待队列中,也把它移出;F将任务的将任务的OS_TCBOS_TCB从从OSTCBListOSTCBList链表当中移动到链表当中移动到OSTCBFreeListOSTCBFreeList。66(OSTaskChangePrioOST