实时嵌入式操作系统艾云峰aiyunfeng@gmail.comCollegeofComputing&CommunicationEngineeringReal-timeEmbeddedOperatingSystem2上节课内容回顾课程简介嵌入式系统介绍实时嵌入式系统介绍实时操作系统介绍3主要内容1.uc/os-II介绍2.实时系统的一些基本概念4uc/os-II介绍发展历史应用领域主要特点提纲5Uc/os-II的诞生设计基于Intel80C188的产品JeanJ.Labrosse使用B内核A内核太贵使用A内核出现故障签维护合同问题解决产品开发耽误开发ucos杂志投稿,代码开源CUser’sJournal嵌入式系统编程写书2个月后3个月后担保期已过6个月后大量下载广泛使用发展历史(1)6版本变迁1992uc/osthereal-timekernelv1.081999uc/os-IIthereal-timekernelv2.002002uc/os-IIthereal-timekernel(ver2)v2.52通过美国航空航天管理局(FAA)的安全认证,可以用于飞机、航天器等性命攸关的控制系统中V2.76v2.83发展历史(2)7Uc/os-II相关产品发展历史(3)8应用行业过程控制食品加工化工厂汽车业发动机控制防抱死系统(ABS)办公自动化传真机复印机计算机外设打印机计算机终端扫描仪调制解调器应用领域(1)通讯类SwitchHurb路由器机器人航空航天飞机管理系统武器系统喷气发动机控制民用消费微波炉洗碗机洗衣机稳温调节器9应用举例基于uC/OS-Ⅱ的Telematics车载终端控制器开发基于ARM和UC/OS-Ⅱ的多通道智能仪表设计基于uC/OS-Ⅱ的齿轮流量计二次仪表的设计基于uC/OS-Ⅱ的多电机高精度位置伺服系统uC/OS-Ⅱ支持下的以太网数据采集系统的设计嵌入式操作系统uC/OS—II在通信电源监控中的应用基于嵌入式操作系统uc/os—Ⅱ实现焊缝轨迹智能跟踪系统应用领域(2)10稳定性&可靠性&确定性稳定性和可靠性2000.7,得到了美国联邦航空管理局对用于商用飞机的、符合RTCADO-178B标准的认证,表明操作系统在稳定性和安全性两方面都符合要求;可以在任何应用中使用确定性绝大多数uc/os-ii的函数调用和服务的执行时间具有可确定性,也就是说用户总是能知道uc/os-ii的函数调用和服务执行了多长时间。除了函数OSTimeTick()和某些事件标志服务,uc/os-ii系统服务的执行时间不依赖于用户应用程序任务数目的多少主要特点(1)11可移植性(protable)Uc/os-II是用ANSI的C语言编写的,与微处理器相关的硬件部分是用汇编语言写的汇编语言写的部分已经压缩到最低限度,以使uc/os-II便于移植到其他微处理器上Uc/os-II可以移植到的处理器必须满足的条件:该微处理器必须有堆栈指针,具有CPU内部寄存器入栈、出栈指令使用的C编译器必须支持内嵌汇编(inlineassembly)Uc/os-II可以在大多数8位、16位、32位、以至64位微处理器、微控制器及数字信号处理器上运行主要特点(2)12可裁剪应用程序可以只使用其所需要的系统服务,即:某产品可能使用了所有的uc/os-ii的功能,而另一个产品则可以只使用很少几个uc/os-ii调用,从而减少产品中uc/os-ii所需要的存储器空间(RAM和ROM)可裁剪性是靠条件编译实现的,只要在用户的应用程序中(#defineconstants语句)定义哪些uc/os-ii中的功能是应用程序需要的就可以了主要特点(3)13可固化&可剥夺性可固化Uc/os-ii是专门为嵌入式应用而设计的,这就意味着,只要具备合适的系列软件工具(C编译、汇编、链接、及下载/固化),实际上就可以把uc/os-ii嵌入到产品中做为产品的一部分可剥夺性Uc/os-ii是完全可剥夺型的内核,即uc/os-ii总是运行就绪条件下的优先级最高的任务主要特点(4)14多任务&任务栈多任务Uc/os-ii可以管理64个任务,建议给系统保留8个任务赋予每个任务的优先级必须是不同的任务栈每个任务都有自己单独的堆栈。Uc/os-ii允许每个任务有不同的栈空间,以便压低应用程序队RAM的需求使用uc/os-ii的栈空间校验函数,可以确定每个任务到底需要多少个栈空间主要特点(5)15主要内容1.uc/os-II介绍2.实时系统的基本概念16前后台系统(Foreground/BackgroundSystem)应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为;中断服务程序处理异步事件,这部分可以看成前台行为;后台也可以叫做任务级,前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务来保证的中断服务提供的信息一直要等到后台程序走到该处理这个信息时才能得到处理。处理信息的及时性,称作任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执行时间。缺点:因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响17代码的临界段&资源代码的临界段代码的临界段也称为临界区,指运行时不可分割的代码;即一旦这部分代码开始执行,则不允许任何中断打入为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断资源任何为任务所占用的实体都可称为资源资源可以是输入输出设备,例如打印机、键盘、显示器;资源也可以是一个变量,一个结构或一个数组等。18共享资源&互斥(mutualexclusion)共享资源可以被一个以上任务使用的资源叫做共享资源互斥为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫做互斥(mutualexclusion)。19任务一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。实时应用程序的设计过程,包括如何把问题分割成多个任务每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间20任务的状态典型地、每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪态意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行。运行态的任务是指该任务掌握了CPU的控制权,正在运行中挂起状态也可以叫做等待事件态WAITING,指该任务在等待,等待某一事件的发生发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态21任务切换(ContextSwitchorTaskSwitch)当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Task’sContextStoragearea),也就是任务自己的栈区之中;入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈22内核(Kernel)内核提供的基本服务是任务切换使用内核的好处:使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们缺点:内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量;但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的一旦读者用实时内核做过系统设计,将决不再想返回到前后台系统23调度器(Scheduler)多数实时内核是基于优先级调度算法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指:CPU总是让处在就绪态的优先级最高的任务先运行究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是不可剥夺型的还是可剥夺型内核。24不可剥夺型内核(Non-PreemptiveKernel)不可剥夺型内核要求每个任务自我放弃CPU的所有权不可剥夺型内核中,异步事件由中断处理;中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权25可剥夺型内核(PreemptiveKernel)最高优先级的任务一旦就绪,立即得到CPU使用权例子:当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权例子:如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行μC/OS-Ⅱ以及绝大多数商业上销售的实时内核都是可剥夺型内核26两种内核的比较27可重入性(Reentrancy)可重入型函数(reentrantfunction)可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中;如果使用全局变量,则要对全局变量予以保护28可重入函数例子因为参数是存在堆栈中的,故函数Strcpy()可以被多个任务调用,而不必担心各任务调用函数期间会互相破坏对方的指针29不可重入函数例子假使一个低优先级的任务正在执行Swap()函数,而中断使一个更高优先级的任务运行,高优先级的任务也调用Swap()函数,则有可能30对上述例子的改造使用以下技术之一即可使Swap()函数具有可重入性:把Temp定义为局部变量调用Swap()函数之前关中断,调用后再开中断用信号量禁止该函数在使用过程中被再次调用如果中断发生在Swap()函数调用之前或调用之后,两个任务中的X,Y值都会是正确的。31任务优先级每个任务都有其优先级。任务越重要,赋予的优先级应越高。应用程序执行过程中诸任务优先级不变,则称之为静态优先级;在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级实时内核应当避免出现优先级反转问题。32优先级反转问题(1)–图示33优先级反转问题(2)-上图的解释任务1优先级高于任务2,任务2优先级高于任务3。任务1和任务2处于挂起状态,等待某一事件的发生,任务3正在运行[图(1)]。此时,任务3要使用其共享资源。使用共享资源之前,首先必须得到该资源的信号量(Semaphore)。任务3得到了该信号量,并开始使用该共享资源[图(2)]。由于任务1优先级高,它等待的事件到来之后剥夺了任务3的CPU使用权[图(3)],任务1开始运行[图(4)]。运行过程中任务1也要使用那个任务3正在使用着的资源,由于该资源的信号量还被任务3占用着,任务1只能进入挂起状态,等待任务3释放该信号量[图(5)]。任务3得以继续运行[图(6)]。由于任务2的优先级高于任务3,当任务2等待的事件发生后,任务2剥夺了任务3的CPU的使用权[图(7)]并开始运行。处理它该处理的事件[图(8)],直到处理完之后将CPU控制权还给任3[图(9)]。任务3接着运行[图(10)],直到释放那个共享资源的信号量[图(11)]。直到此时,由于实时内核知道有个高优先级的任务在等待这个信号量,内核做任务切换,使任务1得到该信号量并接着运行[图(12)]。34优先级反转问题(3)-解释在