您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 嵌入式操作系统深入分析
嵌入式操作系统分析本文分为以下几部分:1.实时嵌入式系统2.中断机制3.任务调度与上下文切换4.进程间通信与同步5.嵌入式系统内存管理6.浅析动态内存分配及Malloc/free的实现实时嵌入式系统实时操作系统(RTOS)设计成提供一个对真实世界的事件的及时响应(timelyresponse)。出现在真实世界中的事件可能有一个时间限制(deadline),在此期限之前,实时/嵌入式系统必须确保在有限时间时间内对此事件做出相应的响应,根据相应事件的时间限制,嵌入式实时操作系统可以分为两类:1、硬实时嵌入式系统此类实时系统必须保证在一定的时间里,对一定的外部事件做出相应的响应,如果在一定时间里没有能够做出相应的响应,就会带来灾难性的后果,也即是说,此类系统对于时间的相应快慢有非常严格的要求,比如:电力监控系统等。2、软实时嵌入式系统此类实时系统保证在一定的时间里,对一定的外部事件做出相应的响应,但是如果在一定时间里没有能够做出相应的响应,不会带来灾难性的后果,只是给用户带来一些不快乐的体验,比如:用户界面的显示。不同的系统,有不同实现方式,对于硬实时嵌入式系统,主要注重与实时性和可靠性,一般没有文件系统,虚拟内存管理等,主要用于实时监控等,典型的有:VxWorks,pSOS,uCOS-II等。软实时嵌入式系统注重实时性,也注重实用性,主要用于消费电子等,典型的有:嵌入式Linux。开源实时嵌入式系统:实时嵌入式操作系统在现在应用越来越多,其中大部分是商业的嵌入式操作系统,这些系统提高了丰富的开发工具和稳定的系统,很大的推动了嵌入式系统地发展,但是由于商业性,使我们很少有机会了解嵌入式操作系统的实现内幕。随着开源软件的兴起,使得我们有机会了解嵌入式操作系统的内部实现成为可能。由于多年的嵌入式开发,对于嵌入式操作系统特别的感兴趣,趁春节的时间,想读读开源的嵌入式操作系统源码,大体比较一下嵌入式操作系统的具体实现。对于开源的嵌入式操作系统,现在比较流行的主要有:嵌入式Linux,uCOS-II,eCOS,FreeRTOS等,这里主要想以嵌入式Linux,uCOS-II为例,对嵌入式操作系统的一些基本概念及其实现方式进行一些比较。之所以选择这两操作系统,因为:1、嵌入式Linux是现在用得最多的软实时嵌入式操作系统,而且也是最著名的开源软件之一,2、uCOS-II是一用得较多的硬实时嵌入式操作系统,尽管商业应用需要Licence,对于科研等可以免费使用,而且许多爱好者已经把它移植到了各种硬件平台。3、尽管硬实时嵌入式操作系统和软实时嵌入式操作系统有很大的区别,但是可以通过对他们的比较,使我们更容易了解实时嵌入式操作系统的基本概念和组成要素。实时多任务嵌入式系统基本概念:对于嵌入式系统,不像通用的计算机,提供通用的软硬件平台,而是对于特定的需求定制的系统,一般要求便携化,资源少,利用比较少的资源配置来实现特定的功能。如何在较小尺寸,较少的资源情况下,快速相应外部多种特定的事件,成为嵌入式系统的主要需求。这就要求嵌入式系统要有以下的模块:1、中断处理在没有嵌入式系统之前,对于一般的工控,都是用前后台机制实现的,中断是整个系统的推动力。在嵌入式系统相中,中断处理也是响应外部事件的主要途径。2、时间管理对于实时操作系统来说,时间管理是系统的核心,整个系统就是由一定间隔的时钟中断驱动的。在一般的实时操作系统中,主要有两种时间管理:OS定时器和RTC定时器。3、资源管理与资源共享由于有限的资源,在嵌入式系统中,资源的管理也非常的重要,CPU,IO,内存等是系统基本的资源,如何有效的应用和管理是一个很大的话题。同时如何共享,如何提供任务间资源的互斥,也是一稳定系统必不可缺的条件。4、多任务在嵌入式系统中,任务也可以叫进程,对于多任务系统,一般有多个任务同时存在于系统中,任务在嵌入式系统中有各种各样的状态,比如:运行态,IDLE态等。5、任务的实时调度与切换对于多任务的管理及其实时调度,决定了此系统的主要特征。任务的调度与如何切换,也是嵌入式多任务系统的一个基本问题。6、进程间(任务间)通讯对于不同任务间的通讯,在不同的系统中有不同的实现,大体与POSIX的IPC相似。但在硬实时嵌入式系统中,事件和消息用得较多。对于LINUX系统,还有虚拟内存管理和文件系统管理,在硬实时嵌入式系统中,由于关注点不同,这方面的应用不多。中断机制1.概述:中断控制是计算机发展中一种重要的技术。最初它是为克服对I/O接口控制采用程序查询所带来的处理器低效率而产生的。中断控制的主要优点是只有在I/O需要服务时才能得到处理器的响应,而不需要处理器不断地进行查询。由此,最初的中断全部是对外部设备而言的,即称为外部中断(或硬件中断)。但随着计算机系统结构的不断改进以及应用技术的提高,中断的适用范围也扩大,出现了所谓的内部中断(或异常),是为解决机器运行时所出现的某些随机事件及编程方便而出现的。因而形成了一个完整的中断系统。中断控制是所有计算机系统的一个核心模块,不同的硬件平台,有不同的中断机制.不管怎样,中断机制最核心的部分是中断向量表,每一种硬件体系根据自己的实现提供一张中断向量表。2.中断向量表:此向量表提供了所有支持的中断定义以及相应的中断服务程序,当发生异常时,首先要保存当前的处理器状态,然后进入到相应的异常向量地址,一般来说在异常向量地址是一个跳转指令,使程序进入相应的异常处理过程。X86中,中断向量表存储于存储器的前1024字节中,它包括256种不同的4字节中断向量。ARM中,中断向量表存储于存储器的低端或者高端地址的前0x1c(依赖于硬件的具体配置),它支持7种类型的异常,其中第一个中断向量是复位中断向量,当系统复位后,从此开始重新执行。在Motorola的68K中,中断向量表占用存储器的1024字节中,它包括256种不同的中断向量。其地址根据VBR的配置的不同而不同,其中第一个中断向量是复位中断向量,当系统复位后,从此开始重新执行。3.中断种类:根据中断向量表,可以把这些中断具体分为同步中断,异步中断,软中断:同步中断(exception),也即是我们通常所说的异常(),是在CPU执行特定指令时出现的非法情况,它的产生是由于前面的CPU操作引起的,是同步发生的。比较典型的异常有:除零异常。一些体系结构下的复位中断也可以算是一种异常。异步中断(interrupt):主要是由外部事件触发的,这就是我们常说的中断,它的发生不可预料的,是异步的。比如说,键盘中断等。在不同的体系结构中,中断机制也不一样。一般可以分为可屏蔽中断和非屏蔽中断。软中断(softwareinterrupt):在大多数硬件体系结构中,都提供软中断的功能,主要用于进入管理模式等的手段。X86中,除前32个作为Intel专用中断向量外,其他224作为用户自定义中断。0~31的向量对应于异常和非屏蔽中断。32~47的向量(即由I/O设备引起的中断)分配给屏蔽中断。48~255的向量用来标识软中断。Linux只用了其中的一个(即128或0x80向量)用来实现系统调用。ARM中,除了定义的5个异常外,有2个专门用于中断,这2个中断被分为快中断和慢中断。由于快中断有专门的寄存器保存上下文,避免了许多上下文切换开销,所以快中断能够比慢中断快,而且在处理快中断时,慢中断会被屏蔽掉。这2个中断提供了系统的所有中断入口,系统查询相应的中断控制器来区分具体的中断。在Motorola的68K中,中断向量表提供了7个中断优先级和192个可分配的中断向量,其中7级是不可屏蔽中断。参考:1。IntelXscaleProcessorDeveloper'sManual2。MC680360QUad通讯控制器手册3。Intel系列微处理器结构,编程和接口技术大全4。Arm嵌入式处理器结构与应用基础任务调度与上下文切换1.任务调度概述:任务调度(schedulers)是内核的主要职责,实际上它就是一个法官,决定当前由哪个任务占用CPU,多数实时内核都是基于优先级调度算法的,每个任务根据其重要程度的不同被赋予一定的优先级。基于此算法,CPU总是让处于就绪而且优先级最高的任务优先运行,然而何时高优先级任务能够得到CPU使用权,由内核的类型而定。基于优先级的内核有两种:不可抢占型和抢占型。1)不可抢占型内核:不可抢占型内核要求每个任务主动放弃CPU的使用权,其间不能被高优先级任务抢占。它的有点是:A.由于不需要在中断返回是进行任务切换,所以中断响应快。B.在任务级中可以调用不可重入函数而不必担心造成数据破坏。C.几乎不需要信号量来保护共享数据,也就是说,在任务运行过程中,数据是独享的。但它的最大缺点是:响应时间不确定,当有更高优先级任务就绪后,不知道什么时候才能得到执行,这在实时系统中是致命的缺陷。所以不可抢占型内核最要用于前后台系统中。2)抢占型内核:在嵌入式系统中,进程(任务)都是抢占型的,通过给每个进程(任务)设置一个优先级,当系统中有优先级比当前运行的进程(任务)的优先级更高的进程(任务)时,当前的进程(任务)执行被中断,并调用调度程序选择优先级高的进程(任务)运行。利用抢占式内核,可以保证高优先级的进程(任务)被优先执行,从而保证系统的实时响应。在多任务系统中,进程(任务)的调度主要包括以下一些方面:2.任务调度:在多任务系统中,都会提供一个系统函数来进行进程(任务)间切换,综合来说,他们有两种进程(任务)切换方式:1)由进程(任务)本身直接调用任务切换函数进行进程(任务)切换:在当前进程(任务)因为不能获得必须的资源而立即被堵塞时,就由进程(任务)本生直接调用进程(任务)切换函数进行进程(任务)间调度。在Linux中可以直接调用schedule()函数来实现。在UCos中,通过调用OSSched()来完成。2)延迟调用任务切换函数进行进程(任务)切换:此方式是把当前进程(任务)设置一调度标志而以延迟方式调用任务切换函数进行进程(任务)切换。在Linux系统中,总是在恢复用户态进程执行之前,检查这一调度标志,在这里标志是:TIF_NEED_RESCHED,如果有这一标志,就调用调度函数进行进程切换。此种情况主要包括以下几种:A.当前进程用完了它的CPU时间片,有scheduler_tick()函数完成schedule()的延迟调用。B.当一个被唤醒进程的优先级比当前进程优先级高时,由try_to_wake_up()函数完成schedule()的延迟调用。C.当发出系统调用sched_setscheduler()时。在这些情况中,主要由于系统调用或中断而进入内核态,或者当前进程本来在内核态时,返回用户态时发生的。在UCOS中,所有的任务有不同的优先级,不会出现同一优先级上有多个任务的情况,而且也没有系统调用的概念,所以任务调度的延迟调用只能出现在中断处理完成返回时,在OSIntExt()函数中,检查是否有高优先级的任务就绪,如果有高优先级的任务就绪,进行任务切换。3.调度算法:在Linux系统中,选用了比较复杂的调度算法,按照调度类型可以分为以下几种:SCHED_FIFO:此算法主要应用于实时进程,当调度程序把CPU分配给当前进程后,如果没有更高优先级的进程可以运行时,此进程会一直占用CPU直到此进程退出或者自愿放弃CPU,即使此时有其他相同优先级的进程存在。SCHED_RR:时间片轮询的实时进程,对于不同优先级的进程会调度优先级高的进程运行,对具有相同优先级的进程,会根据时间片来调度,当当前进程的时间片用完后,会调度相同优先级的其他进程运行,从而保证相同优先级进程的CPU调度公平性。SCHED_NORMAL:此算法主要用于普通进程,利用分时进行调度。在UCOS系统中,所有的任务都是实时任务,所以没有普通任务调度机制,而且为了简化调度算法,不同的任务有不同的优先级,不可能出现同一优先级有多个任务的情况,实际上它的调度算法就只有Linux中SCHED_FIFO这一种,即优先级高的任务抢占优先级低任务。4.上下文切换:上下文切
本文标题:嵌入式操作系统深入分析
链接地址:https://www.777doc.com/doc-3263240 .html