嵌入式实时操作系统+uC+OS.ppt

上传人:赵** 文档编号:65781881 上传时间:2022-12-08 格式:PPT 页数:45 大小:2.19MB
返回 下载 相关 举报
嵌入式实时操作系统+uC+OS.ppt_第1页
第1页 / 共45页
嵌入式实时操作系统+uC+OS.ppt_第2页
第2页 / 共45页
点击查看更多>>
资源描述

《嵌入式实时操作系统+uC+OS.ppt》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统+uC+OS.ppt(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第七讲第七讲 嵌入式实时操作系统嵌入式实时操作系统 C/OS12/7/202212/7/2022一、一、嵌入式实时操作系统嵌入式实时操作系统 C/OSC/OS C/OSC/OS简介简介内核结构内核结构-任务以及调度机制任务以及调度机制任务间通信任务间通信 C/OSC/OS的移植的移植12/7/202212/7/2022C/OS简介1 1、C/OSC/OSmicro C OSmicro C OS,微控制器操作系统,微控制器操作系统2 2、C/OSC/OS简介简介简介简介美国人美国人Jean Jean LabrosseLabrosse 1992 1992年完成年完成应用面覆盖了诸多领域,如照相机、

2、医疗器械、应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、音响设备、发动机控制、高速公路电话系统、自动提款机等自动提款机等 19981998年年 C/OSC/OS-II-II,目前的版本,目前的版本 C/OSC/OS-II V2.61 -II V2.61 网站网站www.ucoswww.ucos-II.comII.com12/7/202212/7/2022uu公开源代码公开源代码公开源代码公开源代码uu可移植性(可移植性(可移植性(可移植性(PortablePortablePortablePortable)绝大部分绝大部分 C/OS-IIC/OS-II的源码是

3、用移植性很强的的源码是用移植性很强的ANSI CANSI C写的。和微写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得分已经压到最低限度,使得 C/OS-IIC/OS-II便于移植到其他微处理器便于移植到其他微处理器上。上。C/OS-IIC/OS-II可以在绝大多数可以在绝大多数8 8位、位、1616位、位、3232位以至位以至6464位微处理位微处理器、微控制器器、微控制器 、数字信号处理器(、数字信号处理器(DSPDSP)上运行。上运行。uu可固化(可固化(可固化(可固化(ROMableROMab

4、leROMableROMable)C/OS-IIC/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(固化手段(C C编译、连接、下载和固化),编译、连接、下载和固化),C/OS-IIC/OS-II可以嵌入可以嵌入到读者的产品中成为产品的一部分。到读者的产品中成为产品的一部分。uu可裁剪(可裁剪(可裁剪(可裁剪(ScalableScalableScalableScalable)可以只使用可以只使用 C/OS-IIC/OS-II中应用程序需要的那些系统服务。也就是中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个说某产品可

5、以只使用很少几个 C/OS-IIC/OS-II调用,而另一个产品则调用,而另一个产品则使用了几乎所有使用了几乎所有 C/OS-IIC/OS-II的功能,这样可以减少产品中的的功能,这样可以减少产品中的 C/OS-IIC/OS-II所需的存储器空间(所需的存储器空间(RAMRAM和和ROMROM)。)。这种可剪裁性是这种可剪裁性是靠条件编译实现的。靠条件编译实现的。C/OS的性能特点12/7/202212/7/2022uu占先式(占先式(占先式(占先式(PreemptivePreemptivePreemptivePreemptive)uu多任务多任务多任务多任务 C/OS-IIC/OS-II可以

6、管理可以管理6464个任务,然而,目前这一版本保留个任务,然而,目前这一版本保留8 8个给系统。应用个给系统。应用程序最多可以有程序最多可以有5656个任务个任务uu可确定性可确定性可确定性可确定性 全部全部 C/OS-IIC/OS-II的函数调用与服务的执行时间具有可确定性。的函数调用与服务的执行时间具有可确定性。uu任务栈任务栈任务栈任务栈 每个任务有自己单独的栈,每个任务有自己单独的栈,C/OS-IIC/OS-II允许每个任务有不同的栈空间,以允许每个任务有不同的栈空间,以便压低应用程序对便压低应用程序对RAMRAM的需求。的需求。uu系统服务系统服务系统服务系统服务 C/OS-IIC/

7、OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。定的内存的申请与释放、时间相关函数等。uu中断管理中断管理中断管理中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达数可达255255层。层。uu稳定性与可靠性稳定性与可靠性稳定性与可靠性稳定性与可靠性C/OS的性能特点12/7/

8、202212/7/2022内核结构内核结构任务管理任务管理时间管理时间管理任务之间通信与同步任务之间通信与同步 C/OSC/OS的移植的移植C/OS的内核结构12/7/202212/7/2022任务任务tasktask典型的一个无限循环。典型的一个无限循环。void void mytask(voidmytask(void*pdatapdata)for(;)for(;)do something;do something;waiting;waiting;do something;do something;C/OSC/OS II II 2.52.5版版本本支支持持6464个个任任务务,每每个个任任务

9、务一一个个特特定定的的优优先先级级。优优先先级越高,数字越小级越高,数字越小系统占用了系统占用了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-0 OS_LOWEST_PRIO-0。12/7/202212/7/2022建立任务建立任务Use one of two servicesUse one of two servicesOS TaskC

10、reate()OSTaskCreateExtended()12/7/202212/7/2022check任务代码指针任务代码指针任务参数指针任务参数指针分配任务堆栈的分配任务堆栈的栈顶指针栈顶指针分配给任务的优先级分配给任务的优先级Set up task stackSet pointer if level is freeInitialize TCBOption to extend functionalityIf called from a task12/7/202212/7/2022As before12/7/202212/7/2022任务状态12/7/202212/7/2022任务控制块(T

11、CB)任务控制块任务控制块 OS_TCBOS_TCB是一个数据结构,保存该任务的是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。位置,任务链表指针等。所有的任务控制块分为两条链表,空闲链表和使用链表。所有的任务控制块分为两条链表,空闲链表和使用链表。12/7/202212/7/2022任务控制块结构StructStruct os_tcbos_tcb OS_STK *OS_STK *OSTCBStkPtrOSTCBStkPtr;structstruct os_tcbos_tcb*OSTCBNextO

12、STCBNext;structstruct os_tcbos_tcb*OSTCBprevOSTCBprev;OS_EVENT *OS_EVENT *OSTCBEventPtrOSTCBEventPtr;void *void *OSTCBMsgOSTCBMsg;INT16U INT16U OSTCBDlyOSTCBDly;INT8U INT8U OSTCBStatOSTCBStat;INT8U INT8U OSTCBPrioOSTCBPrio;INT8U OSTCBX,OSTCBY,INT8U OSTCBX,OSTCBY,OSTCBBitXOSTCBBitX,OSTCBBitYOSTCBBitY

13、;OS_TCB OS_TCB加速任务进入就绪态的过程事件控制块的指针任务的状态字12/7/202212/7/2022任务的调度-OSSched C/OSC/OS是是占先式实时多任务内核,优先级最高的任务占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有一旦准备就绪,则拥有CPUCPU的所有权开始投入运行。的所有权开始投入运行。C/OSC/OS中不支持时间片轮转法,每个任务的优先级要中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。找准备就绪的最高优先级的任务并

14、进行上下文切换。C/OSC/OS任务调度所花的时间为常数,与应用程序中建任务调度所花的时间为常数,与应用程序中建立的任务数无关。立的任务数无关。12/7/202212/7/2022检查是否中断调用和允许任务调用找到优先级最高的任务该任务是否正在运行12/7/202212/7/2022任务切换将被挂起的任务寄存器入栈将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈将较高优先级任务的寄存器出栈12/7/202212/7/2022任务间通信手段 C/OSC/OS中,采用多种方法保护任务之间的共享数据和提供中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。任务之间的通信。提供提供OS_E

15、NTER_CRITICALOS_ENTER_CRITICAL和和OS_EXIT_CRITICALOS_EXIT_CRITICAL来对来对临界资源进行保护临界资源进行保护OSSchedLockOSSchedLock()()禁止调度,禁止调度,保护任务级的共享资源。保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、消提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。息队列,事件标志。12/7/202212/7/2022中断我们知道:当发生中断时,首先应保护现场,将我们知道:当发生中断时,首先应保护现场,将CPUCPU寄存器入栈,再处理中断函数,然后恢复现场,将

16、寄存器入栈,再处理中断函数,然后恢复现场,将CPUCPU寄存器出栈,最后执行中断返回寄存器出栈,最后执行中断返回iret(x86)iret(x86)指令实指令实现中断返回。现中断返回。uCuC/OS/OS中提供了中提供了OSIntEnterOSIntEnter()()和和OSIntExitOSIntExit()()告诉内核告诉内核进入了中断状态。进入了中断状态。12/7/202212/7/2022多任务的启动首先创建任务首先创建任务最后调用最后调用OSStartOSStart开始多任务调度开始多任务调度void main()void main()OSInitOSInit();();.OSTas

17、kcreatOSTaskcreat()().OSStartOSStart();();12/7/202212/7/2022任务的格式每个任务不能占用全部每个任务不能占用全部CPUCPU的资源的资源需要有等待,或延时等系统调用需要有等待,或延时等系统调用典型的一个无限循环。典型的一个无限循环。void void mytask(voidmytask(void*pdatapdata)for(;)for(;)do something;do something;waiting;waiting;do something;do something;12/7/202212/7/2022任务调度For examp

18、le:For example:创建创建2 2个任务,每个任务仅仅是进行延时,延时不个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级同的时间片,不同优先级void Task1(void)void Task2(void)void Task1(void)void Task2(void)while(1)while(1)while(1)while(1)blinkled1();blinkled1();blinkled2();blinkled2();Task1Data+;Task1Data+;Task2Data+;Task2Data+;OSTimeDly(25);OSTimeDly(50);OS

19、TimeDly(25);OSTimeDly(50);12/7/202212/7/2022void main()void main()sysinitsysinit();();OSInitOSInit();();OSTaskCreateOSTaskCreate(Task1,(void*)&Task1Data,(Task1,(void*)&Task1Data,(void*)&Task1StkTASK_STK_SIZE,Task1prio);(void*)&Task1StkTASK_STK_SIZE,Task1prio);OSTaskCreateOSTaskCreate (Task2,(void*)&

20、Task2Data,(Task2,(void*)&Task2Data,(void*)&Task2StkTASK_STK_SIZE,Task2prio);(void*)&Task2StkTASK_STK_SIZE,Task2prio);ticker_start(OS_TICKS_PER_SEC);ticker_start(OS_TICKS_PER_SEC);OSStartOSStart();();12/7/202212/7/2022void void OSStartOSStart(void)(void)INT8U y,x;INT8U y,x;if(if(OSRunningOSRunning=FA

21、LSE)=FALSE)判断是否没有启动内核判断是否没有启动内核 y =y =OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp;x =x =OSUnMapTblOSRdyTblyOSUnMapTblOSRdyTbly;OSPrioHighRdyOSPrioHighRdy=(INT8U)(y 3)+x);=(INT8U)(y 0)if(ticks 0)确保确保ticktick大于大于0 0 OS_ENTER_CRITICAL();OS_ENTER_CRITICAL();进入临界段代码进入临界段代码 if(if(OSRdyTblOSTCBCurOSRdyTblOSTCBCur

22、-OSTCBY&=-OSTCBY&=OSTCBCurOSTCBCur-OSTCBBitXOSTCBBitX)=0)=0)/*Delay current task */*Delay current task */OSRdyGrpOSRdyGrp&=&=OSTCBCurOSTCBCur-OSTCBBitYOSTCBBitY;设置任务为非就绪状态设置任务为非就绪状态 OSTCBCurOSTCBCur-OSTCBDlyOSTCBDly=ticks;=ticks;在在TCBTCB中装载延时数中装载延时数 OS_EXIT_CRITICAL();OS_EXIT_CRITICAL();退出临界段代码退出临界段

23、代码 OSSchedOSSched();();调度下一个任务开始运行调度下一个任务开始运行 12/7/202212/7/2022void void OSSchedOSSched(void)(void)INT8U y;INT8U y;OS_ENTER_CRITICAL();OS_ENTER_CRITICAL();if(if(OSLockNestingOSLockNesting|OSIntNestingOSIntNesting)=0)=0)调度锁,或者处于中断状态禁止调度调度锁,或者处于中断状态禁止调度 y =y =OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp;OSPr

24、ioHighRdyOSPrioHighRdy=(INT8U)(y 3)+=(INT8U)(y OSTCBPrio!=OS_IDLE_PRIO)看是不是空闲任务,空闲任务是最后的任务 if(ptcb-OSTCBDly!=0)是否延时 if(-ptcb-OSTCBDly=0)延时减一,看是否延时结束 if(!(ptcb-OSTCBStat&OS_STAT_SUSPEND)OSRdyGrp|=ptcb-OSTCBBitY;是的话将其列入准备就绪表 OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;else ptcb-OSTCBDly=1;ptcb=ptcb-OSTCBNext;

25、指针指向下一个TCB结构 OSTime+;变量加一,记录系统启动以来的时钟滴答数 时钟节拍函数12/7/202212/7/2022OSTimeTick(void)令指针指向第一个任务是否是空闲任务?任务是否存在延时?延时数减一延时数是否为0?如果条件合适,将该任务放入就绪列表 令指针指向下一个任务 OSTime+返回是否是否是否空闲任务总是最后一个任务对任务表进行扫描预定的延时到了,就应该在使任务处于就绪条件是:任务没有处于挂起态任务没有延时的话忽略即可12/7/202212/7/2022时间任务一任务二OSStartTime Tick Time Tick 12550Time Tick 空闲任

26、务12/7/202212/7/2022总结不存在一个内核任务不存在一个内核任务/实体,内核的管理是通过调用系实体,内核的管理是通过调用系统函数来实现的。统函数来实现的。每个任务有自己的堆栈空间。内核对任务的占先式调每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。度不会干扰每个任务的总的运行结果。12/7/202212/7/2022COS-II在ARM上的移植所谓移植,是指使一个实时操作系统能够在某所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。个微处理器平台上运行。COS-IICOS-II的主要代码都是由的主要代码都是由标准的标准的C C语言写成的

27、,移植方便。语言写成的,移植方便。12/7/202212/7/2022移植COS-II满足的条件 处理器的处理器的C C编译器能产生可重入代码编译器能产生可重入代码 在程序中可以打开或者关闭中断在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断(通常在处理器支持中断,并且能产生定时中断(通常在101000Hz101000Hz之间)之间)处理器支承能够容纳一定量数据的硬件堆栈处理器支承能够容纳一定量数据的硬件堆栈 处理器有将堆栈指针和其他处理器有将堆栈指针和其他CPUCPU寄存器存储和读寄存器存储和读出到堆栈(或者内存)的指令出到堆栈(或者内存)的指令 12/7/202212/7/

28、2022打开/关闭中断 在在 COS-IICOS-II中,可以通过:中,可以通过:OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。宏来控制系统关闭或者打开中断。这需要处理器的支持。在在ARM7TDMIARM7TDMI的处理器上,可以设置相应的寄存器来的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。关闭或者打开系统的所有中断。12/7/202212/7/2022处理器支持中断并且能产生定时中断 COS-IICOS-II是通过处理器产生

29、的定时器的中断来实现是通过处理器产生的定时器的中断来实现多任务之间的调度的。多任务之间的调度的。ARM7TDMIARM7TDMI的处理器上可以产的处理器上可以产生定时器中断。生定时器中断。本系统工作在本系统工作在60MHz60MHz的主频下,定时器的中断的的主频下,定时器的中断的频率为频率为1000Hz1000Hz。也就是系统的响应时间为。也就是系统的响应时间为1ms1ms。12/7/202212/7/2022处理器支持硬件堆栈 COS-IICOS-II进行任务调度的时候,会把当前任务的进行任务调度的时候,会把当前任务的CPUCPU寄存器存放到此任务的堆栈中,然后,再从另一个寄存器存放到此任务

30、的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是务。所以,寄存器的入栈和出栈是 COS-IICOS-II多任务调度的多任务调度的基础。基础。ARM7ARM7处理器中有专门的指令处理堆栈,可以灵活处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。的使用堆栈。12/7/202212/7/2022 C/OS-IIC/OS-II在在S3C44B0XS3C44B0X上的移植上的移植 设置设置OS_CPU.HOS_CPU.H中与处理器和编译器相关的代码中与处理器和编译器相关的代码 用用C C语言编写

31、六个操作系统相关的函数语言编写六个操作系统相关的函数(OS_CPU_C.COS_CPU_C.C)用汇编语言编写四个与处理器相关的函数用汇编语言编写四个与处理器相关的函数(OS_CPU.ASMOS_CPU.ASM)12/7/202212/7/2022设置与处理器和编译器相关的代码OS_CPU.HOS_CPU.H中定义了与编译器相关的数据类型。比中定义了与编译器相关的数据类型。比 如:如:INT8UINT8U、INT8SINT8S等。等。与与 ARMARM处理器相关的代码,使用处理器相关的代码,使用OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()和和OS_EXIT_CR

32、ITICAL()OS_EXIT_CRITICAL()宏开启关闭中断宏开启关闭中断设堆栈的增长方向设堆栈的增长方向 :堆栈由高地址向低地址增长:堆栈由高地址向低地址增长 12/7/202212/7/2022用C语言编写六个操作系统相关的函数 void*void*OSTaskStkInitOSTaskStkInit(void(*(void(*task)(voidtask)(void*pd),voidpd),void *pdatapdata,void*,void*ptosptos,INT16U opt),INT16U opt)void void OSTaskCreateHookOSTaskCreat

33、eHook(OS_TCB*(OS_TCB*ptcbptcb)void void OSTaskDelHookOSTaskDelHook(OS_TCB*(OS_TCB*ptcbptcb)void void OSTaskSwHookOSTaskSwHook(void)(void)void void OSTaskStatHookOSTaskStatHook(void)(void)void void OSTimeTickHookOSTimeTickHook(void)(void)12/7/202212/7/2022用汇编语言编写四个与处理器相关的函数用汇编语言编写四个与处理器相关的函数 OSStartH

34、ighRdyOSStartHighRdy()()OSCtxSwOSCtxSw()()OSIntCtxSwOSIntCtxSw()()OSTickISROSTickISR()()12/7/202212/7/2022关于移植关于移植相对于其他的嵌入式操作系统,相对于其他的嵌入式操作系统,uCOSuCOS-II-II的的移植虽然是一个很简单的过程,但是,对于不熟移植虽然是一个很简单的过程,但是,对于不熟悉悉uCOSuCOS-II-II的开发者,移植还是有一定难度的。的开发者,移植还是有一定难度的。12/7/202212/7/2022移植要点移植要点定义函数定义函数OS_ENTER_CRITICALO

35、S_ENTER_CRITICAL和和OS_ENTER_CRITICALOS_ENTER_CRITICAL。定义函数定义函数OS_TASK_SWOS_TASK_SW执行任务切换。执行任务切换。定义函数定义函数OSCtxSwOSCtxSw实现用户级上下文切换,用纯汇编实现用户级上下文切换,用纯汇编实现。实现。定义函数定义函数OSIntCtxSwOSIntCtxSw实现中断级任务切换,用纯汇编实现中断级任务切换,用纯汇编实现。实现。定义函数定义函数OSTickISROSTickISR。定义定义OSTaskStkInitOSTaskStkInit来初始化任务的堆栈。来初始化任务的堆栈。12/7/202

36、212/7/2022uCuC/OS/OS的的改进改进固定的基于优先级的调度,不支持时间片,使用起来不方便。一固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核个任务的基础上增加一个基于时间片的微型调度核在对临界资源的访问上使用关闭中断实现,没有使用在对临界资源的访问上使用关闭中断实现,没有使用CPUCPU提供的提供的硬件指令,例如测试并置位。硬件指令,例如测试并置位。系统时钟中断,没有提供用户使用定时器,可以借鉴系统时钟中断,没有提供用户使用定时器,可以借鉴linuxlinux的的定时定时器加以修改器加以修改可以加上文件系统和可以加上文件系统和TCP/IPTCP/IP协议栈协议栈12/7/202212/7/2022嵌入式系统设计技术嵌入式系统设计技术THE END12/7/202212/7/2022

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁