课件:嵌入式实时操作系统分析.ppt

上传人(卖家):三亚风情 文档编号:3218693 上传时间:2022-08-07 格式:PPT 页数:145 大小:2.97MB
下载 相关 举报
课件:嵌入式实时操作系统分析.ppt_第1页
第1页 / 共145页
课件:嵌入式实时操作系统分析.ppt_第2页
第2页 / 共145页
课件:嵌入式实时操作系统分析.ppt_第3页
第3页 / 共145页
课件:嵌入式实时操作系统分析.ppt_第4页
第4页 / 共145页
课件:嵌入式实时操作系统分析.ppt_第5页
第5页 / 共145页
点击查看更多>>
资源描述

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

26、,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,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;举例:举例:如如OSRdyGrpOSRdyGrp的值为的值为01101000B

27、01101000B,即,即0X680X68,则查,则查得得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的的值是值是3 3,它相应于,它相应于OSRdyGrpOSRdyGrp中的第中的第3 3位置位置1 1;如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,则查,则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值是的值是2 2,则进入就绪态的,则进入就绪态的最高任务优先级最高任务优先级 Prio=3Prio=3*8+2=268+2=26 33任务切换 将被挂起任务的寄存器

28、内容入栈;将较高优先级任务的寄存器内容出栈,恢复到硬件寄存器中。34任务级的任务切换OS_TASK_SW()l通过通过scsc系统调用指令完成系统调用指令完成l保护当前任务的现场保护当前任务的现场l恢复新任务的现场恢复新任务的现场l执行中断返回指令执行中断返回指令l开始执行新的任务开始执行新的任务35调用OS_TASK_SW()前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)36保存当前CPU寄存器的值低优先级

29、任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)37重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)38任务切换OS_TA

30、SK_SW()的代码Void OSCtxSw(void)将R1,R2,R3及R4推入当前堆栈;OSTCBCurOSTCBStkPtr=SP;OSTCBCur =OSTCBHighRdy;SP =OSTCBHighRdy OSTCBSTKPtr;将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;39给调度器上锁 OSSchedlock():给调度器上锁函数,用于禁止任务调度,保持对CPU的控制权(即使有优先级更高的任务进入了就绪态);OSSchedUnlock():给调度器开锁函数,当任务完成后调用此函数,调度重新得到允许;当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,它不

31、希望高优先级的任务在邮箱、队列和信号量还没有得到消息之前就取得了CPU的控制权,此时,可以使用调度器上锁函数。40任务管理的系统服务v创建任务创建任务v删除任务删除任务v修改任务的优先级修改任务的优先级v挂起和恢复任务挂起和恢复任务v获得一个任务的有关信息获得一个任务的有关信息41创建任务(创建任务的函数创建任务的函数SOSTaskCreate();SOSTaskCreateExt();(OSTaskCreateExt()OSTaskCreateExt()是是OSTaskCreate()OSTaskCreate()的扩展版的扩展版本,提供了一些附加的功能本,提供了一些附加的功能;(任务可以在多

32、任务调度开始任务可以在多任务调度开始 (即调用即调用OSStart()OSStart()之前创建,也可以在其它任务的执行过程中被创之前创建,也可以在其它任务的执行过程中被创建。但在建。但在OSStart()OSStart()被调用之前,用户必须创建至被调用之前,用户必须创建至少一个任务;少一个任务;(不能在中断服务程序不能在中断服务程序(ISR)(ISR)中创建新任务。中创建新任务。42OSTaskCreate()INT8U OSTaskCreate(void(*task)(void*pd),/任务代码指针任务代码指针 void*pdata,/任务参数指针任务参数指针OS_STK*ptos,/

33、任务栈的栈顶指针任务栈的栈顶指针 INT8U prio /任务的优先级任务的优先级);返回值返回值OS_NO_ERR:函数调用成功;:函数调用成功;OS_PRIO_EXIT:任务优先级已经存在;:任务优先级已经存在;OS_PRIO_INVALID:任务优先级无效。:任务优先级无效。43OSTaskCreate()的实现过程v任务优先级检查任务优先级检查该优先级是否在该优先级是否在0 0到到OS_LOWSEST_PRIOOS_LOWSEST_PRIO之间?之间?该优先级是否空闲?该优先级是否空闲?v调用调用OSTaskStkInit()OSTaskStkInit(),创建任务的栈帧;,创建任务的

34、栈帧;v调用调用OSTCBInit()OSTCBInit(),从空闲的,从空闲的OS_TCBOS_TCB池(即池(即OSTCBFreeListOSTCBFreeList链表)中获得一个链表)中获得一个TCBTCB并初始化其并初始化其内容,然后把它加入到内容,然后把它加入到OSTCBListOSTCBList链表的开头,并链表的开头,并把它设定为就绪状态;把它设定为就绪状态;v任务个数任务个数OSTaskCtrOSTaskCtr加加1 1;v调用用户自定义的函数调用用户自定义的函数OSTaskCreateHook()OSTaskCreateHook();v判断是否需要调度(调用者是正在执行的任务

35、)判断是否需要调度(调用者是正在执行的任务)44OSTaskCreateExt()INT8U OSTaskCreateExt(前四个参数与前四个参数与OSTaskCreate相同,相同,INT16U id,/任务的任务的IDOS_STK*pbos,/指向任务栈底的指针指向任务栈底的指针 INT32U stk_size,/栈栈能容纳的成员能容纳的成员数目数目void *pext,/指向用户附加数据域的指针指向用户附加数据域的指针INT16U opt /一些选项信息一些选项信息);返回值:与返回值:与OSTaskCreate()相同。相同。45任务的栈空间(每个任务都有自己的栈空间(每个任务都有自

36、己的栈空间(StackStack),栈必须声),栈必须声明为明为OS_STKOS_STK类型,并且由连续的内存空间组成;类型,并且由连续的内存空间组成;(栈空间的分配方法栈空间的分配方法?静态分配:在编译的时候分配,例如:静态分配:在编译的时候分配,例如:static OS_STK MyTaskStackstack_size;OS_STK MyTaskStackstack_size;?动态分配:在任务运行的时候使用动态分配:在任务运行的时候使用malloc()malloc()函函数来动态申请内存空间;数来动态申请内存空间;46OS_STK *pstk;pstk=(OS_STK*)malloc(

37、stack_size);/*确认确认malloc()能得到足够的内存空间能得到足够的内存空间*/if(pstk!=(OS_STK*)0)Create the task;动态分配47内存碎片问题A(1Kb)B(1Kb)C(1Kb)(在动态分配中,可能存在内存碎片问题。特别是在动态分配中,可能存在内存碎片问题。特别是当用户反复地建立和删除任务时,内存堆中可能当用户反复地建立和删除任务时,内存堆中可能会出现大量的碎片,导致没有足够大的一块连续会出现大量的碎片,导致没有足够大的一块连续内存区域可用作任务栈,这时内存区域可用作任务栈,这时malloc()malloc()便无法成便无法成功地为任务分配栈空

38、间。功地为任务分配栈空间。3Kb堆初始状态堆初始状态3个任务个任务1KbB(1Kb)1Kb删除删除A,C内碎片内碎片/外碎片外碎片?48栈的增长方向(栈的增长方向的设置栈的增长方向的设置?从低地址到高地址:在从低地址到高地址:在OS_CPU.HOS_CPU.H中,将常量中,将常量 OS_STK_GROWTHOS_STK_GROWTH设定为设定为 0 0;?从高地址到低地址:在从高地址到低地址:在OS_CPU.HOS_CPU.H中,将常量中,将常量 OS_STK_GROWTHOS_STK_GROWTH设定为设定为 1 1;OS_STK TaskStackTASK_STACK_SIZE;OSTas

39、kCreate(task,pdata,&TaskStackTASK_STACK_SIZE-1,prio);49删除任务(OSTaskDel()OSTaskDel():删除一个任务,其:删除一个任务,其TCBTCB会从所有可能会从所有可能的系统数据结构中移除。任务将返回并处于休眠状的系统数据结构中移除。任务将返回并处于休眠状态(任务的代码还在)。态(任务的代码还在)。F如果任务正处于就绪状态,把它从就绪表中移如果任务正处于就绪状态,把它从就绪表中移出,这样以后就不会再被调度执行了;出,这样以后就不会再被调度执行了;F如果任务正处于邮箱、消息队列或信号量的等如果任务正处于邮箱、消息队列或信号量的等

40、待队列中,也把它移出;待队列中,也把它移出;F将任务的将任务的OS_TCBOS_TCB从从OSTCBListOSTCBList链表当中移动到链表当中移动到OSTCBFreeListOSTCBFreeList。50(OSTaskChangePrio()OSTaskChangePrio():在程序运行期间,用户可:在程序运行期间,用户可以通过调用本函数来改变某个任务的优先级。以通过调用本函数来改变某个任务的优先级。INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio)(OSTaskQuery()OSTaskQuery():获得一个任务的有关信息:获得

41、一个任务的有关信息F获得的是对应任务的获得的是对应任务的OS_TCBOS_TCB中内容的拷贝。中内容的拷贝。51(OSTaskSuspend()OSTaskSuspend():挂起一个任务:挂起一个任务F如果任务处于就绪态,把它从就绪表中移出;如果任务处于就绪态,把它从就绪表中移出;F在任务的在任务的TCBTCB中设置中设置OS_STAT_SUSPENDOS_STAT_SUSPEND标志,表标志,表明该任务正在被挂起。明该任务正在被挂起。(OSTaskResume()OSTaskResume():恢复一个任务:恢复一个任务F恢复被恢复被OSTaskSuspend()OSTaskSuspend(

42、)挂起的任务;挂起的任务;F清除清除TCBTCB中中OSTCBStatOSTCBStat字段的字段的OS_STAT_SUSPENDOS_STAT_SUSPEND位位挂起和恢复任务52第三章、实时操作系统第三章、实时操作系统C/OS-II C/OS-II概述概述任务管理任务管理中断和时间中断和时间管理管理任务之间的通信与任务之间的通信与同步同步存储管理存储管理 C/OS-II的移植的移植53中断处理l中断:中断:由于某种事件的发生而导致程序流由于某种事件的发生而导致程序流程的改变。产生中断的事件称为程的改变。产生中断的事件称为中断源中断源。lCPU响应中断的条件:响应中断的条件:n至少有一个中断

43、源向至少有一个中断源向CPU发出中断信发出中断信号;号;n系统允许中断,且对此中断信号未予系统允许中断,且对此中断信号未予屏蔽。屏蔽。54中断服务程序ISRl中断一旦被识别,中断一旦被识别,CPU会保存部分(或全会保存部分(或全部)运行上下文(部)运行上下文(context,即寄存器的,即寄存器的值),然后跳转到专门的子程序去处理此值),然后跳转到专门的子程序去处理此次事件,称为次事件,称为中断服务子程序中断服务子程序(ISR)。lC/OS-中,中,中断服务子程序要用汇编中断服务子程序要用汇编语言来编写,然而,如果用户使用的语言来编写,然而,如果用户使用的C语语言编译器支持在线汇编语言的话,用

44、户可言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在以直接将中断服务子程序代码放在C语言语言的程序文件中。的程序文件中。55(1)保存全部保存全部CPU寄存器的值寄存器的值;(2)调用调用OSIntEnter(),或直接把全局变量,或直接把全局变量OSIntNesting(中断嵌套层次)加(中断嵌套层次)加1;(3)执行用户代码做中断服务执行用户代码做中断服务;(4)调用调用OSIntExit();(5)恢复所有恢复所有CPU寄存器;寄存器;(6)执行中断返回指令。执行中断返回指令。用户ISR的框架5657OSIntEnter()/*在调用本函数之前必须先将中断关闭在调用本函

45、数之前必须先将中断关闭*/void OSIntEnter(void)if(OSRunning=TRUE)if(OSIntNesting 255)OSIntNesting+;58OSIntExit的意义59OSIntExit()void OSIntExit(void)OS_ENTER_CRITICAL();/关中断关中断 if(-OSIntNesting|OSLockNesting)=0)/判判断嵌套是否为零断嵌套是否为零 /把高优先级任务装入把高优先级任务装入 OSIntExitY=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(OSIntExitYOSTCB

46、Prio!=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_ENTER_CRITICAL();(6)OSTime+;(7)OS_EXIT_CRITICAL();66

47、时间管理与时间管理相关的系统服务与时间管理相关的系统服务:lOSTimeDLY()lOSTimeDLYHMSM()lOSTimeDlyResmue()lOStimeGet()lOSTimeSet()67OSTimeDLY()vOSTimeDLY()OSTimeDLY():任务延时函数,申请该服:任务延时函数,申请该服务的任务可以延时一段时间;务的任务可以延时一段时间;v调用调用OSTimeDLYOSTimeDLY后,任务进入等待状态;后,任务进入等待状态;v使用方法使用方法wvoid OSTimeDly(INT16U ticks);wticks表示需要延时的时间长度,用时钟节表示需要延时的时间

48、长度,用时钟节拍的个数来表示。拍的个数来表示。68OSTimeDLY()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();69OSTimeDLY(1)的问题70OSTimeDlyHMSM()vOSTimeDlyHMSM()OSTimeDlyHMSM():OSTimeD

49、ly()OSTimeDly()的另一个的另一个版本,即按时分秒延时函数;版本,即按时分秒延时函数;v使用方法使用方法wINT8U OSTimeDlyHMSM(INT8U hours,/小时小时 INT8U minutes,/分钟分钟 INT8U seconds,/秒秒 INT16U milli /毫秒毫秒 );71OSTimeDlyResume()vOSTimeDlyResume()OSTimeDlyResume():让处在延时期的任:让处在延时期的任务提前结束延时,进入就绪状态;务提前结束延时,进入就绪状态;v使用方法使用方法wINT8U OSTimeDlyResume(INT8Uprio)

50、;wprio表示需要提前结束延时的任务的优先级表示需要提前结束延时的任务的优先级/任务任务ID。72系统时间v每隔一个时钟节拍,发生一个时钟中断,将一每隔一个时钟节拍,发生一个时钟中断,将一个个3232位的计数器位的计数器OSTimeOSTime加加1 1;v该计数器在用户调用该计数器在用户调用OSStart()OSStart()初始化多任务和初始化多任务和4,294,967,2954,294,967,295个节拍执行完一遍的时候从个节拍执行完一遍的时候从0 0开开始计数。若时钟节拍的频率等于始计数。若时钟节拍的频率等于100Hz100Hz,该计数,该计数器每隔器每隔497497天就重新开始计

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(课件:嵌入式实时操作系统分析.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|