课件:嵌入式实时操作系统分析.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《课件:嵌入式实时操作系统分析.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课件 嵌入式 实时 操作系统 分析
- 资源描述:
-
1、1 C/OS-II概述概述任务管理任务管理中断和时间中断和时间管理管理任务之间的通信与任务之间的通信与同步同步存储管理存储管理2任务的实现创建任务的系统服务创建任务的系统服务lOSTaskCreate()INT8U OSTaskCreate(void(*task)(void*pd),/任务代码指针任务代码指针 void*pdata,/任务参数指针任务参数指针OS_STK*ptos,/任务栈的栈顶指针任务栈的栈顶指针 INT8U prio /任务的优先级任务的优先级);lOSTaskCreateExt()提问:提问:C/OS-II中的任务是进程还是线程?中的任务是进程还是线程?3任务主函数一个任
2、务通常是一个无限循环(返回值类型一个任务通常是一个无限循环(返回值类型voidvoid)void MyTask(void*pdata)while(1)do something;waiting;do something;Why?4任务也可以自我删除(并非真的删除,只是内核不任务也可以自我删除(并非真的删除,只是内核不再知道该任务)再知道该任务)void MyTask(void*pdata)./*用户代码用户代码*/OSTaskDel(OS_PRIO_SELF);5lC/OS-C/OS-可以管理多达可以管理多达6464个任务;个任务;l每个任务被赋以不同的优先级,取值从每个任务被赋以不同的优先级,
3、取值从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个任个任务以被将来使用,用户可以有务以被将来使用,用户可以有5656个应用任务;个应用任务;l任务的优先级同样也是它的标识号任务的优
4、先级同样也是它的标识号IDID。OS_CFG.H中定义中定义636空闲任务和统计任务l内核总是创建一个内核总是创建一个空闲任务空闲任务OSTaskIdle()OSTaskIdle();w总是设置为最低优先级,总是设置为最低优先级,OS_LOWEST_PRIOROS_LOWEST_PRIOR;w当所有其他任务都未在执行时,空闲任务开始当所有其他任务都未在执行时,空闲任务开始执行;执行;w应用程序不能删除该任务;应用程序不能删除该任务;w空闲任务的工作就是把空闲任务的工作就是把3232位计数器位计数器OSIdleCtrOSIdleCtr加加1 1,该计数器被统计任务所使用;,该计数器被统计任务所使
5、用;l统计任务统计任务OSTaskStat()OSTaskStat(),提供运行时间统计。每,提供运行时间统计。每秒钟运行一次,计算当前的秒钟运行一次,计算当前的CPUCPU利用率。其优先级利用率。其优先级是是OS_LOWEST_PRIOR-1OS_LOWEST_PRIOR-1,可选。,可选。7任务控制块TCBl任务控制块任务控制块 OS_TCBOS_TCB是描述一个任务的核是描述一个任务的核心数据结构,存放了它的各种管理信息心数据结构,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优,包括任务堆栈指针,任务的状态、优先级,任务链表指针等;先级,任务链表指针等;l一旦任务建立了,任务控
6、制块一旦任务建立了,任务控制块OS_TCBOS_TCB将将被赋值。被赋值。8任务控制块TCBtypedef struct os_tcb 栈指针;栈指针;INT16U OSTCBId;/*任务的任务的ID*/链表指针;链表指针;OS_EVENT*OSTCBEventPtr;/*事件指针事件指针*/void *OSTCBMsg;/*消息指针消息指针*/INT8U OSTCBStat;/*任务的状态任务的状态*/INT8U OSTCBPrio;/*任务的优先级任务的优先级*/其他其他 OS_TCB;9栈指针lOSTCBStkPtrOSTCBStkPtr:指向当前任务栈顶的指针指向当前任务栈顶的指针,
7、每个任务可以有自己的栈,栈的容量可,每个任务可以有自己的栈,栈的容量可以是任意的;以是任意的;lOSTCBStkBottomOSTCBStkBottom:指向任务栈底的指针;:指向任务栈底的指针;lOSTCBStkSizeOSTCBStkSize:栈的容量,用可容纳的指:栈的容量,用可容纳的指针数目而不是字节数(针数目而不是字节数(ByteByte)来表示。)来表示。1011链表指针l所有的任务控制块分属于两条不同的链表所有的任务控制块分属于两条不同的链表,单向的,单向的空闲链表空闲链表(头指针为(头指针为OSTCBFreeListOSTCBFreeList)和双向的)和双向的使用链表使用链表
8、(头(头指针为指针为OSTCBListOSTCBList););lOSTCBNextOSTCBNext、OSTCBPrevOSTCBPrev:用于将任务控制用于将任务控制块插入到空闲链表或使用链表中。每个任块插入到空闲链表或使用链表中。每个任务的任务控制块在任务创建的时候被链接务的任务控制块在任务创建的时候被链接到使用链表中,在任务删除的时候从链表到使用链表中,在任务删除的时候从链表中被删除。双向连接的链表使得任一成员中被删除。双向连接的链表使得任一成员都能快速插入或删除。都能快速插入或删除。12空闲TCB链表l所有的任务控制块都被放置在任务控制块列表数组所有的任务控制块都被放置在任务控制块列
9、表数组OSTCBTbl中,系统初始化时,所有中,系统初始化时,所有TCBTCB被链接成空闲的被链接成空闲的单向链表,头指针为单向链表,头指针为OSTCBFreeListOSTCBFreeList。当创建一个任务后。当创建一个任务后,就把,就把OSTCBFreeListOSTCBFreeList所指向的所指向的TCBTCB赋给了该任务,并将它赋给了该任务,并将它加入到使用链表中,然后把加入到使用链表中,然后把OSTCBFreeListOSTCBFreeList指向空闲链表指向空闲链表中的下一个结点。中的下一个结点。13系统初始化后指针数组,指向相应指针数组,指向相应TCB14任务的状态休眠l休眠
10、状态休眠状态(Dormant):任务存在于内存):任务存在于内存空间中,但内核不可见;空间中,但内核不可见;l可以通过以下函数通知内核,使之变为就可以通过以下函数通知内核,使之变为就绪状态:绪状态:OSTaskCreate()或或OSTaskCreateExt()l可以通过以下函数返回到休眠状态:可以通过以下函数返回到休眠状态:OSTaskDel()15任务的状态就绪l就绪状态就绪状态(Ready):万事具备,只欠):万事具备,只欠CPU;l在所有的就绪任务当中,具有最高优先级在所有的就绪任务当中,具有最高优先级的任务被选中去运行;的任务被选中去运行;l如果任务在运行的时候被抢占了如果任务在运
11、行的时候被抢占了CPU,则,则又回到就绪状态。又回到就绪状态。16任务的状态运行l运行状态运行状态(Running):任务在):任务在CPU上运上运行;行;l当一个任务在运行时,如果没有关闭中断,当一个任务在运行时,如果没有关闭中断,则有可能被中断所打断;则有可能被中断所打断;l当一个任务在运行时,可能因为各种原因进当一个任务在运行时,可能因为各种原因进入阻塞状态。入阻塞状态。OSMBoxPend(),OSQPend(),OSSemPend()OSTaskSuspend(),OSTimeDly()17任务的状态ISRl中断服务状态中断服务状态(ISR):该任务原来在):该任务原来在CPU上运行
12、,后来被中断所打断,由中断服务程上运行,后来被中断所打断,由中断服务程序序ISR接管了接管了CPU;l当中断服务程序运行完毕后,内核要判断是当中断服务程序运行完毕后,内核要判断是否有新的、更高优先级的任务就绪,如果有否有新的、更高优先级的任务就绪,如果有,则原有的任务被抢占;如果没有,则原有,则原有的任务被抢占;如果没有,则原有的任务重新运行。的任务重新运行。18任务的状态阻塞l阻塞阻塞/等待状态等待状态(Waiting):任务由于正在):任务由于正在等待某个事件(信号量、邮箱或队列)而被等待某个事件(信号量、邮箱或队列)而被挂起;挂起;l当任务等待的事件发生时,回到就绪状态。当任务等待的事件
13、发生时,回到就绪状态。OSMBoxpost(),OSQPost(),OSSemPost(),OSTaskResume(),OSTimeDlyResume()或或OSTimeTick()19状态的转换删除任务删除任务 20任务就绪表l每个任务的就绪态标志放入在就绪表中,每个任务的就绪态标志放入在就绪表中,就绪表中有两个变量就绪表中有两个变量OSRdyGrpOSRdyGrp和和OSRdyTblOSRdyTbl。l在在OSRdyGrpOSRdyGrp中,任务按优先级分组,中,任务按优先级分组,8 8个任个任务为一组。务为一组。OSRdyGrpOSRdyGrp中的每一位表示中的每一位表示8 8组任组任
14、务中每一组中是否有进入就绪态的任务。务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表任务进入就绪态时,就绪表OSRdyTblOSRdyTbl中中的相应元素的相应位也置位。的相应元素的相应位也置位。21任务就绪表OSRdyGrp OSRdyGrp 1207 6 5 4 300X XX XX 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 515
15、8565763 62 61 60 5901234567OSRdyTbl8OSRdyTbl8X XY Y优先级最低任务优先级最低任务 (空闲任务)(空闲任务)优先级最高任务优先级最高任务 任务优先级号任务优先级号 对于整数对于整数OSRdyTbli(0 i 7),若它的某一位),若它的某一位为为1,则,则OSRdyGrp的第的第i位为位为1。任务的优先级由任务的优先级由X和和Y确定确定22根据优先级确定就绪表根据优先级确定就绪表(1)(1)n假 设 优 先 级 为假 设 优 先 级 为 1 21 2 的 任 务 进 入 就 绪 状 态,的 任 务 进 入 就 绪 状 态,12=1100b,12=
16、1100b,则则OSRdyTbl1OSRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,相应的数学表达式为,相应的数学表达式为: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,相应的数学表达式为:相应的数学表达式为:OSRd
17、yGrp|=0 x04OSRdyGrp|=0 x04;OSRdyTbl2|=0 x20;OSRdyTbl2|=0 x20;23根据优先级确定就绪表根据优先级确定就绪表(2)(2)n从上面的计算可知从上面的计算可知:若若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中中,
18、也就是:也就是: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)24使任务进入就绪态使任务进入就绪态n如果如果prioprio是任务的优先级,即任务的标识号,则将是任务的优先级,即任务的标识号,则将任务放入就绪表,即使任务进入就绪态的方法是:任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp|
19、=OSMapTblprio3;OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0 x07;OSRdyTblprio3|=OSMapTblprio&0 x07;n假设优先级为假设优先级为12121100b1100bOSRdyGrp|=OSMapTbl123(0 x02)OSRdyGrp|=OSMapTbl123(0 x02);OSRdyTbl1|=0 x10;OSRdyTbl1|=0 x10;25使任务使任务脱离脱离就绪态就绪态n将任务就绪表将任务就绪表OSRdyTblprio3OSRdyTblprio3相应元素的相应相应元素的相应位清零,
20、而且当位清零,而且当OSRdyTblprio3OSRdyTblprio3中的所有位都中的所有位都为零时,即该任务所在组的所有任务中没有一个为零时,即该任务所在组的所有任务中没有一个进入就绪态时,进入就绪态时,OSRdyGrpOSRdyGrp的相应位才为零。的相应位才为零。if(OSRdyTblprio3&=OSMapTblprio&0 x07)=0)OSRdyGrp&=OSMapTblprio3;26任务的调度l C/OSC/OS是可抢占实时多任务内核,它总是运行是可抢占实时多任务内核,它总是运行就绪任务中优先级最高的那一个。就绪任务中优先级最高的那一个。l C/OSC/OS中不支持时间片轮转
21、法,每个任务的优中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。并进行上下文切换。l C/OSC/OS任务调度所花的时间为常数,与应用程任务调度所花的时间为常数,与应用程序中建立的任务数无关。序中建立的任务数无关。27l确定哪个任务的优先级最高,应该选择哪个任确定哪个任务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器(务去运行,这部分的工作是由调度器(SchedulerScheduler)来完成的。)来完成的。w任务级
22、的调度是由函数任务级的调度是由函数OSSched()OSSched()完成的;完成的;w中断级的调度是由另一个函数中断级的调度是由另一个函数OSIntExt()OSIntExt()完完成的。成的。28根据就绪表确定最高优先级两个关键两个关键:l将优先级数分解为高三位和低三位分别确将优先级数分解为高三位和低三位分别确定;定;l高优先级有着小的优先级号;高优先级有着小的优先级号;29根据就绪表确定最高优先级l通过通过OSRdyGrpOSRdyGrp值确定高值确定高3 3位,假设位,假设OSRdyGrpOSRdyGrp0 x08=0 x08=0 x000010000 x00001000,第,第3 3
23、位为位为1 1,优先级的高,优先级的高3 3位为位为011011;l通过通过OSRdyTbl3OSRdyTbl3的值来确定低的值来确定低3 3位,假设位,假设OSRdyTbl3OSRdyTbl30 x3a0 x3a,第,第1 1位为位为1 1,优先级的低,优先级的低3 3位为位为001001,3 3*8+1=8+1=252500011001任务优先级任务优先级30任务调度器void OSSched(void)INT8U y;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)y =OSUnMapTblOSRdyGrp;OSPrioHighR
24、dy=(INT8U)(y 3)+OSUnMapTblOSRdyTbly);if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW();OS_EXIT_CRITICAL();检查是否中断调用和允许任务调用找到优先级最高的任务该任务是否正在运行31源代码中使用了查表法n查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的Y=OSUnMapTblOSRdyGrp;X=OSUnMapTblOSRdyTblY;Prio=(Y3)+X;参参见见OS_C
25、ORE.C32优先级判定表OSUnMapTbl256INT8U 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,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
展开阅读全文