版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一嵌入式实时操作系统1、嵌入式实时操作系统的概念嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”。实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。常用的系统有ucosii,rtthread,MsgOS。实时操作系统是保证在一定时间限制内完成特定功能的操作系统。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。2、实时操作系统在嵌入式系统中的作用和地位首先,嵌入式实时操作系统提高了系统的可靠性。在控制系统中,出于安全方面的考虑,要求系统起码不能崩溃,而且还要有自愈能力。不仅要求在硬件设计方面提高系统的可靠性和抗干扰性,而且也应在软件设计方面提高系统的抗干扰性,尽可能地减少安全漏洞和不可靠的隐患。长期以来的前后台系统软件设计在遇到强干扰时,使得运行的程序产生异常、出错、跑飞,甚至死循环,造成了系统的崩溃。而实时操作系统管理的系统,这种干扰可能只是引起若干进程中的一个被破坏,可以通过系统运行的系统监控进程对其进行修复。通常情况下,这个系统监视进程用来监视各进程运行状况,遇到异常情况时采取一些利于系统稳定可靠的措施,如把有问题的任务清除掉。其次,提高了开发效率,缩短了开发周期。在嵌入式实时操作系统环境下,开发一个复杂的应用程序,通常可以按照软件工程中的解耦原则将整个程序分解为多个任务模块。每个任务模块的调试、修改几乎不影响其他模块。商业软件一般都提供了良好的多任务调试环境。再次,嵌入式实时操作系统充分发挥了32位cpu的多任务潜力。32位cpu比8、16位cpu快,另外它本来是为运行多用户、多任务操作系统而设计的,特别适于运行多任务实时系统。32位cpu采用利于提高系统可靠性和稳定性的设计,使其更容易做到不崩溃。例如,cpu运行状态分为系统态和用户态。将系统堆栈和用户堆栈分开,以及实时地给出cpu的运行状态等,允许用户在系统设计中从硬件和软件两方面对实时内核的运行实施保护。如果还是采用以前的前后台方式,则无法发挥32位cpu的优势。从某种意义上说,没有操作系统的计算机(裸机)是没有用的。在嵌入式应用中,只有把cpu嵌入到系统中,同时又把操作系统嵌入进去,才是真正的计算机嵌入式应用。3、实时操作系统的应用场合(1)过程控制,例如无线打印机,打印过程对实时性要求较高。例如工业机器人的操作控制。还有航天方面的火星车,月球车的控制。(2)数据采集,例如无线摄像头,必须实时对画面进行压缩和发送。例如物联网设备的信息采集和上传。(3)通信,例如蓝牙耳机,需要实时接收数据并且解码。例如网络中的路由设备,对实时性要求比较高。4、嵌入式实时操作系统的发展前景RTOS可划分为3个不同的领域:1.系统级:指RTOS运行在1个小型的计算机系统中完成实时的控制作用。这个领域将主要是微软与Sun竞争之地,传统上Unix在这里占有绝对优势。Sun通过收购,让他的Solaris与Chrousos(原欧洲的1种RTOS)结合,微软力推NT的嵌入式版本"EmbeddedNT"。此外,嵌入式Linux将依托源程序码开放和软件资源丰富的优势,进入系统级RTOS的市场。2.板级:传统的RTOS的主要市场。如Vxwork,PSOS,QNX,Lynx和VRTX的应用将主要集中在航空航天、电话电讯等设备上。3.SOC级(即片上系统):新一代RTOS的领域:主要应用在消费电子、互联网络和手持设备等产品上。代表的产品有Symbian的Epoc、ATI的Nucleus,Expresslogic的Threadx。老牌的RTOS厂家的产品VRTX和Vxwork也很注意这个市场。从某种程度讲,不会出现1个标准的RTOS(像微软的Windows在桌面系统中的地位一样),因为嵌入式应用本身就极具多样性。在某个时间段以及某种行业,会出现1种绝对领导地位的RTOS,比如今天在宽带的数据通信设备中的Vxwork和在亚洲手持设备市场上的WinCE就是一例子。但是,这种垄断地位也并不是牢不可破的,因为在某种程度上用户和合作伙伴更愿意去培养1个新的竞争对手。比如,Intel投资的Montivista和Motorola投资的Lineo,这两家嵌入式Linux系统,就是说明半导体厂商更愿意看到1个经济适用的、开放的RTOS环境。二UCOS系统1、UCOS系统介绍μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。现在最新版的是μC/OS-III。μC/OS-II的前身是μC/OS,最早出自于1992年美国嵌入式系统专家JeanJ.Labrosse在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把μC/OS的源码发布在该杂志的BBS上。μC/OS和μC/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。μC/OS-II已经移植到了几乎所有知名的CPU上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。μC/OS-II被广泛应用于微处理器、微控制器和数字信号处理器。2、UCOS系统的应用μC/OS-II可以提供如下服务:信号量互斥信号量事件标识消息邮箱消息队列任务管理固定大小内存块管理时间管理另外,在μC/OS-II内核之上,有如下独立模块可供用户选择:μC/FS文件系统模块μC/GUI图形软件模块μC/TCP-IP协议栈模块μC/USB协议栈模块3、系统的组成μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。(1)核心部分(OSCore.c)是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。(2)任务处理部分(OSTask.c)任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。(3)时钟部分(OSTime.c)μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。(4)任务同步和通信部分为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。(5)与CPU的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。4、原理及特点(1)原理UC/OS-II的工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。首先,初始化MCU,再进行操作系统初始化,主要完成任务控制块TCB初始化,TCB优先级表初始化,TcB链表初始化,事件控制块E(CB)链表初始化,空任务的创建等等;然后就可以开始创建新任务,并可在新创建的任务中再创建其他的新任务;最后调用OSSTART()函数启动多任务调度。在多任务调度开始后,启动时钟节拍源开始计时,此节拍源给系统提供周期性的时钟中断信号,实现延时和超时确认。操作系统在下面的情况下进行任务调度:中断和调用API函数(用户主动调用)。一种是当时钟中断来临时,系统把当前正在执行的任务挂起,保护现场,进行中断处理,判断有无任务延时到期,若有则使该任务进入就绪态,并把所有进入就绪态的任务的优先级进行比较,通过任务切换去执行最高优先级的就绪任务,若没有别的任务进入就绪态,则恢复现场继续执行原任务。另一种调度方式是任务级的调度即调用API函数(由用户主动调用),是通过发软中断命令或依靠处理器在任务执行中调度,如任务要等待信号量或一个正在执行的任务被悬挂起来时,就需要在此任务中调度,找出目前处于就绪态的优先级最高的任务去执行。当没有任何任务进入就绪态时,就去执行空任务。(2)特点1.UC/OS一H提供了对64个任务的管理,除了系统内核本身所保留了8个任务外,用户的应用程序最多可以有56个任务。由于UC/05-II是一个基于优先级的(不支持时间片轮转调度)实时操作系统,因此每个任务的优先级必须不相同。系统中的每个任务都处于以下5种状态之一的状态中,这5种状态是休眠态、就绪态、运行态、等待态(等待某一事件发生)和被中断态。2.UC/05-II是一个占先式(peremPtive)的内核,即最高优先级的任务一旦就绪,总能得到处理器的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,则当前任务的处理器控制权就被剥夺了,或者说被挂起,那个高优先级的任务立刻得到处理器的控制权。如果是中断服务程序(ISR)使一个高优先级的任务进入就绪态,中断处理完成后,被中断了的任务将被挂起,优先级高的那个任务则开始运行。3.UC/05-II提供了对信号量(Semaphore)、邮箱(MailBox)和消息队列(MessageQueue)的支持。通过这3种方法可以完成任务与中断服务程序(ISR)之间的通信、任务与任务之间的通信以及多个任务对共享资源的互斥访问。UCOS系统的优点在于:(1)它的内核是完全免费的,用户不需支付任何费用,有利于降低系统开发成本。(2)它的源代码是公开的,并且仍在不断的升级,增加新功能。源代码的开放可以使得用户根据实际要求对源代码进行取舍,去掉不必要的变量和不使用的函数,提高系统性能。另外,由于对系统内核有源代码级的了解,用户可以添加自己的模块,与原有系统内核兼容,使得系统具有可扩展性。(3)系统内核实用性强、可靠性高。从最老版本的UCOS,以及后来的UC/S0,到最新版本的UC/05-11,该实时内核己经走过了近10年的历程。10年来,世界上己有数千人在各个领域使用了该实时内核,如医疗器械、网络设备、自动提款机、工业机器人等等。这些应用的实践是该内核实用性、无误性的最好证据。(4)操作系统内核对处理器以及ORM、RAM资源的要求不高,有利于在8位处理器上的移植。三μC/OS-II系统移植1、μC/OS-II移植条件虽然μC/OS-II的大部分源代码是用C语言写成的,但是仍需要用汇编语言完成一些与微处理器相关的代码。例如,μC/OS-II在读写微处理器、寄存器时只能通过汇编语言来实现,这是因为μC/OS-II在设计时就已经充分考虑了可移植性。为了要使μC/OS-II可以正常工作,处理器必须要满足如下要求:(1)微处理器的C编译器能产生可重入代码。可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏其内部的数据。可重入型函数在任何时候都可以被中断执行,也不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。下面列举了两个例子来对可重入型函数和非可重入型函数进行比较。程序1:可重入型函数程序2:非可重入型函数程序1中使用的是局部变量nTemp,C编译器把局部变量分配在栈中,所以多次调用同一个函数可以保证每次的nTemp互不受影响。而程序2中g_nTemp是全局变量,多次调用函数时必然受到影响。代码的可重入性是保证完成多任务的基础,除了在C语言程序中使用局部变量外,还需要C编译器的支持。基于ARM的SDT.ADS等集成开发环境,都可以生成可重入的代码。(2)打开或者关闭中断。在μC/OS-II操作系统中,可以通过进入中断屏蔽的宏定义OS_ENTER_CRITICAL()或者退出中断屏蔽的宏定义OSEXIT_CRITICAL0来控制系统关闭中断或者打开中断,这需要微处理器的支持。在目前的ARM系列的ARM7TDMI、ARM9T等微处理器上,都可以设置相应的寄存器来关闭或者打开系统的所有中断。(3)微处理器支持中断,并且能产生定时中断(通常在10~1000Hz),μC/OS-II是通过微处理器产生定时的中断来实现多任务之间的调度的。(4)微处理器支持能够容纳一定量数据的硬件堆栈,并具有将堆栈指针和其他CPU寄存器读写到堆栈(或者内存)的指令。μC/OS-II进行任务调度时,会把当前任务的CPU内部寄存器的内容存放到此任务的堆栈中,然后从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器中内容的入栈和出栈是μC/OS-II多任务调度的基础。2、μC/OS-lI的移植步骤1.设置头文件OS__CPU.H中与处理器和编译器相关的代码(1)与编译器相关的数据类型因为不同的微处理器有不同的字长,所以μC/OS-II的移植包括了一系列的类型定义以确保其可移植性。例如,μC/OS-II的代码不使用C语言的short、int和long等数据类型,这是因为它们是与编译器密切相关的,不可移植。然而,我们所要求定义的整型数据结构是能够可移植的。为了方便起见,虽然μC/OS-II不采用浮点数据类型,但我们在实际中还是可以定义为浮点数据类型的。例如,INTI6U数据类型表示16位的无符号整数,μC/OS-II和用户的应用程序就可以估计出声明为该数据类型的变量的取值范围是0~65535。将μC/OS-II移植到32位的微处理器上也就意味着INTI6U实际被声明为无符号短整型数据结构,而不是无符号整数数据结构。但是,μC/OS-II所处理的仍然是INTI6U。用户必须将任务堆栈的数据类型定义到μC/OS-II操作系统中,这个过程是通过为OS_STK声明正确的C语言数据类型来完成的。由于使用的微处理器.上的堆栈成员是16位的,所以将OS__TSK声明为无符号整型数据类型。值得注意的是,所有的任务堆栈都必须使用OS_TSK声明数据类型。(2)进入中断屏蔽的宏定义OS_ENTER_CRITICAL()和退出中断屏蔽的宏定义OS_EXIT_CRITICAL()。与所有的实时内核一样,μC/OS-II操作系统在进行任务切换时需要先禁止中断在访问代码的临界区,并且在访问完毕后重新允许中断,这就使得μC/OS-II能够保护临界区代码免受多任务或中断服务例程(ISR)的破坏。在ARM微处理器上,如S3C2410微处理器是通过OS_ENTER_CRITICAL(和OS_EXIT_CRITICAL0两个函数来实现开、关中断的。(3)栈增长方向标OS_STK_GROWTH.绝大多数的微处理器的堆栈是从高地址向低地址增长的,但是有些微处理器是采用相反的方式工作的。鉴于这种情况,μC/OS-II操作系统被设计成为这两种情况都可以处理,只要在结构常量OS_STK_GROWTH中指定堆栈的生长方式就可以了。例如,设OS_STK__GROWTH为0表示堆栈从下往上增长,设OS_STK__GROWTH为1表示堆栈从上往下增长。2.用汇编语言在OS_CPU_A.ASM文件中编写4个与微处理器相关的函数(1)调用优先级最高的就绪任务函数OSStartHighRdyO。函数原型如下。OSStartHighRdy()函数在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针SP,并通过SP依次将CPU现场恢复。这时系统就将控制权交给用户创建的任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占CPU。该函数仅仅在多任务启动时被执行一次,用来启动最高优先级的任务执行。移植该函数的原因是,它涉及将处理器寄存器保存到堆栈的操作。(2)任务级的任务切换函数OSCtxSw()。函数原型如下。OSCtxSw()函数由OS_TASK_SW()宏调用,OS_TASK_SW()由OSSched()函数调用,OSSched()函数负责任务之间的调度。OSCtxSw()函数的工作是先将当前任务的CPU现场保存到该任务的堆栈中,然后获得最高优先级任务的堆栈指针并从该堆栈中恢复此任务的CPU现场使之继续执行。这样,该函数就完成了一次任务切换。(3)中断级的任务切换函数OSIntCtxSw()。函数原型如下。OSIntCtxSw()函数由系统中断退出OSIntExit()调用。由于中断可能会使更高优先级的任务进入就绪态,为了让更高优先级的任务能立即运行,在中断服务子程序的最后,OSIntExit()函数会调用OSIntCtxSw()进行任务切换。这样做的目的主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。OSIntCtxSw()与OSCtxSw()都是用于任务切换的函数,其区别在于OSIntCtxSw()中无须再保存CPU寄存器。因为在调用OSIntCtxSw()之前已发生了中断,OSIntCtxSw()已将默认的CPU寄存器保存到了被中断的任务的堆栈中。(4)时钟节拍中断服务函数OSTickISR()。时钟节拍是特定的周期性中断,并且是由硬件定时器产生的,这个中断可看作系统心脏的脉动。时钟节拍是中断使得内核可将任务延时若干个整数时钟节拍,以及当任务等待事件发生时提供等待超时的依据,时钟节拍频率越高,系统的额外开销就越大,中断期间的时间间隔取决于不同的应用。OSTickISR()首先将CPU寄存器的值保存在被中断任务的堆栈中,之后调用系统中断响应函数OSIntEnter(),随后OSTickISR()调用OSTimeTick(),检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任务。OSTickISR()最后调用OSIntExit(),如果在中断中(或其他嵌套的中断)有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,那么OSIntExit()将进行任务调度。如果进行了任务调度,OSIntExit()将不再返回调用者,而是用新任务堆栈中的寄存器数值恢复CPU现场,然后用IRET实现任务切换。如果当前中断不是中断嵌套的最后一层,或中断中没有改变任务的就绪状态,那么OSIntExit()将返回调用者OSTickISR(),最后OSTickISR()返回被中断的任务。3.用C语言编写6个操作系统相关的函数(OS__CPU_C.C)这里主要涉及6个函数:OSTaskStklnit()、OSTaskCreateHook()、OSTaskDelHook()OSTaskSwHook()、OSTaskStatHook()及OSTimeTickHook()。在这些函数中,唯一必须移植的是任务堆栈初始化函数OSTaskStklInit()。这个函数在任务创建时被调用,负责初始化任务的堆栈结构并返回新堆栈的指针stk。在ARM体系结构下,任务堆栈空间由高至低依次保存着PC、LR、R12、R11.R10...R1、R0.CPSR及SPSR.OSTaskStkInit()初始化后的堆栈内容如图所示,堆栈初始化工作结束后,返回新的堆栈栈顶指针。图4.1寄存器保存示意图以下5个Hook函数,又称为钩子函数,主要用来扩展μC/OS-II功能,使用前必须被声明,但并不一定要包含任何代码。(1)OSTaskCreateHook()函数。当用OSTaskCreate()函数或OSTaskCreateExt()函数建立任务时,就会调用OSTaskCreateHook()函数。μC/OS-II设置完自己的内部结构后,会在调用任务调度程序之前调用OSTaskCreateHook()函数。该函数被调用时中断是禁止的,因此应尽量减少该函数中的代码以缩短中断的响应时问。(2)OSTaskDelHook()函数。当任务被删除时就会调用OSTaskDellHook()函数,该函数在把任务从μC/OS-II的内部任务链表中解开之前被调用。当OSTaskDelHook()函数被调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 痛经课件流程教学课件
- 手机原理课件教学课件
- 护士课件英语教学课件
- 公司机密保密协议
- 2024年市场营销与协作合同
- 2024年城市供水管道铺设工程承包合同
- 2024可再生能源发电并网服务合同
- 2024年婚姻外遇协议书
- 2024年《夏令营老师与营员心理辅导协议》心理辅导内容与保密原则
- 2024年企业间产品生产与销售合同
- 营养不良的五阶梯治疗详解演示文稿
- 乳鼠肾细胞的原代培养盛心磊
- 青岛东北亚大宗商品交易中心可行性研究报告
- 八年级科学上册 《生命活动的调节》同步练习1 浙教版
- 硫酸储罐标准
- 2023年6月四级听力第一套真题及听力原文
- GB/T 40016-2021基础零部件通用元数据
- 搪塑成型工艺
- 千年菩提路解说词
- 煤矿隐蔽致灾因素普查课件
- 通用版高中化学二轮复习专题课件原子结构
评论
0/150
提交评论