《uCOS嵌入式开发》PPT课件.ppt

上传人:m**** 文档编号:578630322 上传时间:2024-08-24 格式:PPT 页数:50 大小:432.60KB
返回 下载 相关 举报
《uCOS嵌入式开发》PPT课件.ppt_第1页
第1页 / 共50页
《uCOS嵌入式开发》PPT课件.ppt_第2页
第2页 / 共50页
《uCOS嵌入式开发》PPT课件.ppt_第3页
第3页 / 共50页
《uCOS嵌入式开发》PPT课件.ppt_第4页
第4页 / 共50页
《uCOS嵌入式开发》PPT课件.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《《uCOS嵌入式开发》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《uCOS嵌入式开发》PPT课件.ppt(50页珍藏版)》请在金锄头文库上搜索。

1、嵌入式操作系统uC/OS1WhatisuC/OS?u:MicroC:controluC/OS:适合于小的、控制器的操作系统n小巧n公开源代码,详细的注解n可剥夺实时内核n可移植性强n多任务多任务 n确定性嵌入式操作系统uC/OS2TheStoryofuC/OS n美国人JeanLabrosse1992年编写的n商业软件的昂贵n应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 nwww.uCOS-II.com嵌入式操作系统uC/OSnCOS不但提供了一个完整的嵌入式实时内核的源代码,而且对这些代码不但提供了一个完整的嵌入式实时内核的源代码,而且对这些

2、代码的细节作了详尽的解释,它不仅告诉读者这个实时内核是怎么写的,还的细节作了详尽的解释,它不仅告诉读者这个实时内核是怎么写的,还解释了为什么要这样写。而商业上的实时操作系统软件不但价格昂贵解释了为什么要这样写。而商业上的实时操作系统软件不但价格昂贵(一般都在(一般都在5千到千到2万美元的价位上),而且其中很多都是所谓黑盒子,万美元的价位上),而且其中很多都是所谓黑盒子,即不提供源代码。即不提供源代码。nl源代码的绝大部分是用源代码的绝大部分是用C语言写的,经过简单的编译,读者就能在语言写的,经过简单的编译,读者就能在PC机机上运行,边读书、边实践。由于用汇编语言写的部分只有上运行,边读书、边实

3、践。由于用汇编语言写的部分只有200行左右,该行左右,该实时内核可以方便地移植到几乎所有的嵌入式应用类实时内核可以方便地移植到几乎所有的嵌入式应用类CPU上。移植范例上。移植范例的源代码可以从因特网上下载。的源代码可以从因特网上下载。nl从最老版本的实时内核从最老版本的实时内核COS,以及后来的,以及后来的C/OS,到新版本的,到新版本的C/OS-II,已经有多年的历史。许多行业上都有成功应用该实时源代码,已经有多年的历史。许多行业上都有成功应用该实时源代码.实时内实时内核移植核移植.内核实时内核的实例,这些应用的实践是该内核实用性、无误性内核实时内核的实例,这些应用的实践是该内核实用性、无误

4、性的最好证据。的最好证据。3嵌入式操作系统uC/OS4嵌入式操作系统uC/OS5概要n内核结构-任务以及调度机制n任务间通信nuC/OS的移植n在PC机上运行uC/OS嵌入式操作系统uC/OS6任务taskn典型的一个无限循环。void mytask(void *pdata) for (;) do something;waiting;do something; n支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小n系统占用了两个任务,空闲任务和统计任务。嵌入式操作系统uC/OS任务优先级n每个任务按其重要性被赋予一定的优先级。C/OS-可以管理多达64个任务,但目前版本的C/OS-

5、有两个任务已经被系统占用了。作者保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任务以被将来使用。OS_LOWEST_PRI0是作为定义的常数在OS_CFG.H文件中用定义常数语句#defineconstant定义的。因此用户可以有多达56个应用任务。必须给每个任务赋以不同的优先级,优先级可以从0到OS_LOWEST_PR10-2。优先级号越低,任务的优先级越高。C/OS-总是运行进入就绪态的优先级最高的任务。目前版本的C/OS-中,任务的优先级号就是任务编号(ID)。优先级

6、号(或任务的ID号)也被一些内核服务函数调用,如改变优先级函数OSTaskChangePrio(),以及任务删除函数OSTaskDel()。7嵌入式操作系统uC/OS任务状态任务状态n休眠态休眠态(dormant):指任务驻留在程序空间中,还没有交给内核管:指任务驻留在程序空间中,还没有交给内核管理。把任务交给内核是通过调用理。把任务交给内核是通过调用OSTaskCreate( )或或OSTaskCreatExt( )实现的。实现的。n就绪就绪(Ready):当任务一旦建立,这个任务就处于就绪态准备运行。:当任务一旦建立,这个任务就处于就绪态准备运行。任务可以动态的被另一个程序建立,也可以在系

7、统运行开始之前任务可以动态的被另一个程序建立,也可以在系统运行开始之前建立。如果一个任务是被另一个任务建立的,而这个任务的优先建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。通过调用的控制权。通过调用OSTaskDel( )使任务返回到休眠态。就使任务返回到休眠态。就绪态的任务都放在就绪列表中。在任务调度时,指针绪态的任务都放在就绪列表中。在任务调度时,指针OSTCBHighRdy指向优先级最高的就绪任务,也就是立刻就要运指向优先级最高的就绪任务,也就是立刻就要运

8、行的任务。行的任务。8嵌入式操作系统uC/OSn运行运行(Running):准备就绪的最高优先级的任务获得:准备就绪的最高优先级的任务获得CPU的控制权,的控制权,从而处于运行态。指针从而处于运行态。指针OSTCBCur指向正在运行的任务。指向正在运行的任务。n等待或挂起等待或挂起(Pending):正在运行的任务由于调用延时函数:正在运行的任务由于调用延时函数OSTimeDly( )或等待事件信号量的来临而将自身挂起,因而处于等待或挂起或等待事件信号量的来临而将自身挂起,因而处于等待或挂起态。因为等待某事件而被挂起的任务注册在该事件的等待列表中。态。因为等待某事件而被挂起的任务注册在该事件的

9、等待列表中。n中断态中断态(Interrupt):正在运行的任务可以被中断,除非是该任务:正在运行的任务可以被中断,除非是该任务将中断关闭。被中断的任务进入中断服务程序将中断关闭。被中断的任务进入中断服务程序(ISR)。如果中断服。如果中断服务程序使一个更高优先级的任务准备就绪,则中断服务程序结束务程序使一个更高优先级的任务准备就绪,则中断服务程序结束后,更高优先级的任务开始运行程序。后,更高优先级的任务开始运行程序。9嵌入式操作系统uC/OS10嵌入式操作系统uC/OS任务堆栈任务堆栈n在C/OS-中,每个任务都有自己的堆栈空间。为方便使用,在C/OS-中专门定义了一个OS_STK类型的数据

10、,这样在应用程序中定义任务的堆栈就非常方便。例如:n程序 85n#defineTASK_STK_SIZE200nOS_STKTaskStartStkTASK_STK_SIZE;11嵌入式操作系统uC/OS12任务的数据结构任务控制块n任务控制块 OS_tcb,包括 任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。n所有的任务控制块分为两条链表,空闲链表和使用链表。OSTCBFreeListTCB0TCB1TCBn新任务TCB(1)空(2)(3)prenext图4.3TCB的双向链表结构嵌入式操作系统uC/OS13任务控制块结构nStructos_tcbOS_STK*OSTCBStkPt

11、r;structos_tcb*OSTCBNext;structos_tcb*OSTCBprev;OS_EVENT*OSTCBEventPtr;void*OSTCBMsg;INT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY;OS_TCB嵌入式操作系统uC/OSnOSTCBStkPtr是指向当前任务栈顶的指针。C/OS-允许每个任务有自己的栈,尤为重要的是,每个任务的栈的容量可以是任意的。有些商业内核要求所有任务栈的容量都一样,除非用户写一个复杂的接口函数来改变之。这种限制浪费了RA

12、M,当各任务需要的栈空间不同时,也得按任务中预期栈容量需求最多的来分配栈空间。OSTCBStkPtr是OS_TCB数据结构中唯一的一个能用汇编语言来处置的变量(在任务切换段的代码Context-switchingcode之中),把OSTCBStkPtr放在数据结构的最前面,使得从汇编语言中处理这个变量时较为容易。14嵌入式操作系统uC/OSn.OSTCBNext和.OSTCBPrev用于任务控制块OS_TCBs的双重链接,该链表在时钟节拍函数OSTimeTick()中使用,用于刷新各个任务的任务延迟变量.OSTCBDly,每个任务的任务控制块OS_TCB在任务建立的时候被链接到链表中,在任务删

13、除的时候从链表中被删除。双重连接的链表使得任一成员都能被快速插入或删除。15嵌入式操作系统uC/OSnOSTCBEventPtr是指向事件控制块的指针,后面的章节中会有所描述(见8.9任务的同步和通信)。n.OSTCBMsg是指向传给任务的消息的指针。用法将在后面的章节中提到(见8.9任务的同步和通信)。n.OSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段时间以等待某事件的发生,这种等待是有超时限制的。在这种情况下,这个变量保存的是任务允许等待事件发生的最多时钟节拍数。如果这个变量为0,表示任务不延时,或者表示等待事件发生的时间没有限制16嵌入式操作系统uC

14、/OSnOSTCBStat是任务的状态字。当.OSTCBStat为0,任务进入就绪态。可以给.OSTCBStat赋其它的值,在文件uCOS_II.H中有关于这个值的描述。n.OSTCBPrio是任务优先级。高优先级任务的.OSTCBPrio值小。也就是说,这个值越小,任务的优先级越高。n.OSTCBX, .OSTCBY, .OSTCBBitX和和 .OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程(避免在运行中去计算这些值)。这些值是在任务建立时算好的,或者是在改变任务优先级时算出的。n.OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除。17嵌入式操作系

15、统uC/OS18任务的调度-OSSchednuC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。nuC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。嵌入式操作系统uC/OS19任务的调度n就绪任务表:用于存贮每个任务的就绪状态标志。由两个变量组成:nOSRdyGrp:8位,每位表示一组(8个)任务中是否有就绪的任务。nOSRdyTbl:位图方式表示某个任务是否就绪。嵌入式操作系统uC/OS20就绪状态标志Bit0inOSRdyGrp is1whenanybi

16、tinOSRdyTbl0 is1.Bit1inOSRdyGrp is1whenanybitinOSRdyTbl1 is1.Bit2inOSRdyGrp is1whenanybitinOSRdyTbl2 is1.Bit3inOSRdyGrp is1whenanybitinOSRdyTbl3 is1.Bit4inOSRdyGrp is1whenanybitinOSRdyTbl4 is1.Bit5inOSRdyGrp is1whenanybitinOSRdyTbl5 is1.Bit6inOSRdyGrp is1whenanybitinOSRdyTbl6 is1.Bit7inOSRdyGrp is1w

17、henanybitinOSRdyTbl7 is1.嵌入式操作系统uC/OS21根据优先级找到任务在就绪任务表中的位置嵌入式操作系统uC/OS22根据优先级确定就绪表n假设优先级为12的任务进入就绪状态,12=1 100b,则OSRdyTbl1的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为: OSRdyGrp |=0x02; OSRdyTbl1 |=0x10;n而 优 先 级 为 21的 任 务 就 绪 21=10 101b, 则OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为: OSRdyGrp |=0x04; OSRdyTbl2 |=0x2

18、0;嵌入式操作系统uC/OS23根据优先级确定就绪表n从上面的计算我们可以得到:若第n位置1,则应该与2n 相或。uC/OS中,把2n的n=0-7的8个值 先计算好存在数组OSMapTbl7中,也就是:OSMapTbl0 =20=0x1;OSMapTbl1 =21=0x2; OSMapTbl7 =27=0x80;嵌入式操作系统uC/OS24根据优先级确定就绪表n利用OSMapTbl,通过任务的识别号-优先级prio来设置任务在就绪组和就绪表数组中相应位置的数学式为:OSRdyGrp |=OSMapTblprio3;OSRdyTblprio3 |=OSMapTblprio & 0x07;假设优先

19、级为12,1 100bOSRdyGrp |=0x02;OSRdyTbl1 |=0x10;嵌入式操作系统uC/OS25根据就绪表确定最高优先级(1)两个关键:n优先级数分解为高三位和低三位分别确定;n高优先级有着小的优先级号着小的优先级号 ;嵌入式操作系统uC/OS26根据就绪表确定最高优先级(2)n通过OSRdyGrp值确定高3位,假设为0x24=100100b,-OSRdyTbl2和OSRdyTbl5,高优先级为2n通过OSRdyTbl2的值来确定低3位, 假设为0x12=010010b,-第2个和第5个任务,取高优先级第2个-17嵌入式操作系统uC/OS27源代码中使用了查表法查表法具有确

20、定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的nHigh3 =OSUnMapTblOSRdyGrp;nLow3 =OSUnMapTblOSRdyTblHigh3;nPrio =(Hign33)+Low3;?为什么频繁的使用查表法?请问OSUnMapTbl的来历;嵌入式操作系统uC/OS28INT8UconstOSUnMapTbl=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

21、,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,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1

22、,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;嵌入式操作系统uC/OS任务调度核心之任务切换宏任务调度核心之任务切换宏OS_TASK_SW()n任务切换很简单,简单说就是终止正在运行的任务,然后去运行另外一个任务,这由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在C/OS-中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,C/OS-运行就绪态的任务所要做

23、的一切,只是恢复所有的CPU寄存器并运行中断返回指令。为了做任务切换,运行OS_TASK_SW(),人为模仿了一次中断。多数微处理器有软中断指令SWI或者陷阱指令TRAP来实现上述操作。中断服务子程序或陷阱处理(Traphardler),也称作事故处理(exceptionhandler),必须提供中断向量给汇编语言函数OSCtxSw()。OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务29嵌入式操作系统uC/OS30任务间通信手段n提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界

24、资源进行保护nOSSchedLock()禁止调度保护任务级的共享资源。n提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。 嵌入式操作系统uC/OS31信号量semaphorenuC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。n系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。 嵌入式操作系统uC/OS32中断与时钟节拍n我们知道:当发生中断时,首先应保护现场,将CP

25、U寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回iret(x86)指令实现中断返回。 nuC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。OSIntNestingn时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。嵌入式操作系统uC/OS33多任务的启动n首先创建任务n最后调用OSStart开始多任务调度voidmain()OSInit();.OSTaskcreat().OSStart();嵌入式操作系统uC/OS34

26、任务的格式n每个任务不能占用全部CPU的资源n需要有等待,或延时等系统调用n典型的一个无限循环。void mytask(void *pdata) for (;) do something;waiting;do something; 嵌入式操作系统uC/OS35揭开神秘的面纱任务调度全程追踪nForexample1创建2个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级voidTask1(void)voidTask2(void)while(1)while(1)blinkled1();blinkled2();Task1Data+;Task2Data+;OSTimeDly(25);OSTi

27、meDly(50);嵌入式操作系统uC/OS36voidmain()sysinit();OSInit();OSTaskCreate(Task1,(void*)&Task1Data,(void*)&Task1StkTASK_STK_SIZE,Task1prio);OSTaskCreate(Task2,(void*)&Task2Data,(void*)&Task2StkTASK_STK_SIZE,Task2prio);ticker_start(OS_TICKS_PER_SEC);OSStart();嵌入式操作系统uC/OS37voidOSStart(void)INT8Uy,x;if(OSRunni

28、ng=FALSE)判断是否没有启动内核 y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;OSPrioHighRdy=(INT8U)(y0)确保tick大于0OS_ENTER_CRITICAL();进入临界段代码 if(OSRdyTblOSTCBCur-OSTCBY&=OSTCBCur-OSTCBBitX)=0)/*Delaycurrenttask*/OSRdyGrp&=OSTCBCur-OSTCBBitY;设置任务为非就绪状态 OSTCBCur-OSTCBDly=ticks;在TCB中装载延时数 OS_EXIT_CRITICAL();退出临界段代码 OSS

29、ched();调度下一个任务开始运行 嵌入式操作系统uC/OS40voidOSSched(void)INT8Uy;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)调度锁,或者处于中断状态禁止调度 y=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(yOSTCBPrio!=OS_IDLE_PRIO)看是不是空闲任务,空闲任务是最后的任务if(ptcb-OSTCBDly!=0)是否延时if(-ptcb-OSTCBDly=0)延时减一,看是否延时结束if(!(ptcb-OSTCBStat&OS_STAT_SU

30、SPEND)OSRdyGrp|=ptcb-OSTCBBitY;是的话将其列入准备就绪表OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;elseptcb-OSTCBDly=1;ptcb=ptcb-OSTCBNext;指针指向下一个TCB结构OSTime+;变量加一,记录系统启动以来的时钟滴答数嵌入式操作系统uC/OS44OSTimeTick(void)令指针指向第一个任务是否是空闲任务?任务是否存在延时?延时数减一延时数是否为0?如果条件合适,将该任务放入就绪列表令指针指向下一个任务OSTime+返回是否是否是否空闲任务总是最后一个任务对任务表进行扫描预定的延时到了,就应

31、该在使任务处于就绪条件是:任务没有处于挂起态任务没有延时的话忽略即可嵌入式操作系统uC/OS45时间任务一任务二OSStartTime Tick Time Tick 12550Time Tick 空闲任务嵌入式操作系统uC/OS46总结n不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。n每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。嵌入式操作系统uC/OS47uC/OS的移植n代码分为三部分:n与 CPU无 关 的 内 核 代 码 , 包 括 os_core.c, os_mbox.c,os_mem.c, os_q.c, os_sem.c, os

32、_task.c, os_time.c, ucos_ii.c,ucos_ii.h; n与应用相关的设置头文件,包括: os_cfg.h, include.h;n处 理 器 相 关 的 代 码 , 包 括 : os_cpu.h, os_cpu_a.asm, os_cpu.c.c。嵌入式操作系统uC/OS48移植要点n定义函数OS_ENTER_CRITICAL和OS_ENTER_CRITICAL。n定义函数OS_TASK_SW执行任务切换。 n定义函数OSCtxSw实现用户级上下文切换,用纯汇编实现。 n定义函数OSIntCtxSw实现中断级任务切换,用纯汇编实现。 n定义函数OSTickISR。 n定义OSTaskStkInit来初始化任务的堆栈。 嵌入式操作系统uC/OS49uC/OS的改进n固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核n在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。n系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器加以修改n可以加上文件系统和TCP/IP协议栈嵌入式操作系统uC/OS50学习uC/OS的步骤n学习与研究uC/OS的起点:在PC上执行uC/OS,环境:VC编译环境,新建一个工程n源代码阅读n移植:DSP,单片机

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号