《嵌入式系统》课件.ppt

上传人:牧羊曲112 文档编号:5021773 上传时间:2023-05-30 格式:PPT 页数:82 大小:270KB
返回 下载 相关 举报
《嵌入式系统》课件.ppt_第1页
第1页 / 共82页
《嵌入式系统》课件.ppt_第2页
第2页 / 共82页
《嵌入式系统》课件.ppt_第3页
第3页 / 共82页
《嵌入式系统》课件.ppt_第4页
第4页 / 共82页
《嵌入式系统》课件.ppt_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《《嵌入式系统》课件.ppt》由会员分享,可在线阅读,更多相关《《嵌入式系统》课件.ppt(82页珍藏版)》请在三一办公上搜索。

1、第5章 嵌入式系统软件及操作系统基础,5.1 嵌入式软件基础,5.1.1 嵌入式软件的特点应用在嵌入式计算机系统当中的各种软件统称为嵌入式软件,作为嵌入式系统的一个组成部分,目前嵌入式软件的种类和规模都得到了极大的发展,形成了一个完整、独立的体系。除了具有通用软件的一般特性,同时还具有一些与嵌入式系统密切相关的特点,如:(l)规模较小在一般情况下,嵌入式系统的资源多是比较有限的,要求嵌入式软件必须尽可能地精简,多数的嵌入式软件都在几MB以内。,(2)开发难度大嵌入式系统由于硬件资源的有限,使得嵌入式软件在时间和空间上都受到严格的限制,需要开发人员对编程语言、编译器和操作系统有深刻的了解,才有可

2、能开发出运行速度快、存储空间少、维护成本低的软件。嵌入式软件一般都要涉及到底层软件的开发,应用软件的开发也是直接基于操作系统的,这就要求开发人员具有扎实的软、硬件基础,能灵活运用不同的开发手段和工具,具有较丰富的开发经验。嵌入式软件的运行环境和开发环境比PC机复杂,嵌入式软件是在目标系统上运行的,而嵌入式软件的开发工作则是在另外的开发系统中进行,当应用软件调试无误后,再把它放到目标系统上去。,(3)高实时性和可靠性要求具有实时处理的能力是许多嵌入式系统的基本要求,实时性要求软件对外部事件做出反应的时间必须要快,在某些情况下还要求是确定的、可重复实现的,不管系统当时的内部状态如何,都是可以预测的

3、。同时,对于事件的处理一定要在限定的时间期限之前完成,否则就有可能引起系统的崩溃。在航天控制、核电站、工业机器人等实时系统对嵌入式软件的可靠性要求是非常高的,一旦软件出了问题,其后果是非常严重的。(4)软件固化存储为了提高系统的启动速度、执行速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片或微处理器中。,嵌入式软件的分类,1系统软件系统软件控制和管理嵌入式系统资源,为嵌入式应用提供支持的各种软件,如设备驱动程序、嵌入式操作系统、嵌入式中间件等。2应用软件应用软件是嵌入式系统中的上层软件,它定义了嵌入式设备的主要功能和用途,并负责与用户进行交互。应用软件是嵌入式系统功能的体现,如飞行控制软

4、件、手机软件、MP3播放软件、电子地图软件等,一般面向于特定的应用领域,。3支撑软件支撑软件指辅助软件开发的工具软件,如系统分析设计工具、在线仿真工具、交叉编译器、源程序模拟器和配置管理工具等。在嵌入式系统当中,系统软件和应用软件运行在目标平台的(即嵌入式设备上),而对于各种软件开发工具来说,它们大部分都运行在开发平台(PC机)上,运行Windows或Linux操作系统。,5.1.3 嵌入式软件的体系结构,1无操作系统的嵌入式软件早期在嵌入式系统的应用范围主要集中在控制领域,硬件的配置比较低,嵌入式软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统,软件的规模也很小。无

5、操作系统的嵌入式软件主要采用循环轮转和中断(前后台)两种实现方式。(1)循环轮转方式循环轮转方式的基本设计思想是:把系统的功能分解为若干个不同的任务,放置在一个永不结束的循环语句当中,按照时间顺序逐一执行。当程序执行完一轮后,又回到程序的开头重新执行,循环不断。,循环轮转方式的程序简单、直观、开销小、可预测。软件的开发可以按照自顶向下、逐步求精的方式,将系统要完成的功能逐级划分成若干个小的功能模块进行编程,最后组合在一起。循环轮转方式的软件系统只有一条执行流程和一个地址空间,不需要任务之间的调度和切换,其程序的代码都是固定的,函数之间的调用关系也是明确的,整个系统的执行过程是可预测的。循环轮转

6、方式的缺点是程序必须按顺序执行,无法处理异步事件,缺乏并行处理的能力。缺乏硬件上的时间控制机制,无法实现定时功能。,(2)中断方式中断方式又称为前后台系统形式,系统在循环轮转方式的基础上增加了中断处理功能。ISR(Interrupt Service Routine,中断服务程序)负责处理异步事件,即前台程序(foreground),也称为事件处理级程序。而后台程序(background)是一个系统管理调度程序,一般采用的是一个无限的循环形式,负责掌管整个嵌入式系统软、硬件资源的分配、管理以及任务的调度。后台程序也称为任务级程序。一般情形下,后台程序会检查每个任务是否具备运行条件,通过一定的调度

7、算法来完成相应的操作。而一些对实时性有要求的操作通常由中断服务程序来完成,大多数的中断服务程序只做一些最基本的操作,如标记中断事件的发生等,其余的事情会延迟到后台程序去完成。,2有操作系统的嵌入式软件从20世纪80年代开始,操作系统出现在嵌入式系统上。如今,嵌入式操作系统在嵌入式系统中广泛应用,尤其是在功能复杂、系统庞大的应用中显得愈来愈重要。在应用软件开发时,程序员不是直接面对嵌入式硬件设备,而是采用一些嵌入式软件开发环境,在操作系统的基础上编写程序。在控制系统中,采用前后台系统体系结构的软件,在遇到强干扰时,可能会使应用程序产生异常、出错,甚至死循环的现象,从而造成系统的崩溃。而采用嵌入式

8、操作系统管理的系统,在遇到强干扰时,可能只会引起系统中的某一个进程被破坏,但这可以通过系统的监控进程对其进行修复,系统具有自愈能力,不会造成系统崩溃。,在嵌入式操作系统环境下,开发一个复杂的应用程序,通常可以按照软件工程的思想,将整个程序分解为多个任务模块,每个任务模块的调试、修改几乎不影响其他模块。利用商业软件提供的多任务调试环境,可大大提高系统软件的开发效率,降低开发成本,缩短开发周期。嵌入式操作系统本身是可以剪裁的,嵌入式系统外设、相关应用也可以配置,所开发的应用软件可以在不同的应用环境、不同的处理器芯片之间移植,软件构件可复用,有利于系统的扩展和移植。,嵌入式软件体系结构,5.1.4

9、嵌入式系统的设备驱动,嵌入式系统的设备驱动层用来完成嵌入式系统硬件设备所需要的一些软件初始化和管理。设备驱动层直接对硬件进行管理和控制,并为上层软件提供所需的驱动支持。1板级支持包设备驱动层也称为BSP(Board Support Package,板级支持包),在BSP中把所有与硬件相关的代码都封装起来,为操作系统提供一个虚拟的硬件平台,操作系统运行在这个虚拟的硬件平台上。在BSP当中,使用一组定义好的编程接口来与BSP进行交互,并通过BSP来访问真正的硬件。在嵌入式系统中,BSP类似于PC系统中的BIOS和驱动程序。BSP把嵌入式操作系统与具体的硬件平台隔离开来。,一般来说,BSP是针对某个

10、特定的单板而设计的,系统都会提供相应的演示版本的BSP(最小系统BSP)。BSP对于用户(指系统开发人员)是开放的,用户可以根据不同的硬件需求对其进行改动或二次开发。在实际开发一个嵌入式系统的时候,通常可以找到一个与自己的硬件系统相近的演示版本的BSP,并以此为基础,进行修改和完善,以适应不同单板的需求。BSP主要包括BootLoader(引导加载程序)和设备驱动程序两个方面的内容。对于不同的嵌入式操作系统,BSP的具体结构和组成是不相同的。,2BootLoaderBootLoader(引导加载程序)是在操作系统内核运行之前运行的一小段程序。通过这段程序,初始化硬件设备、建立内存空间的映射图,

11、从而将系统的软硬件环境设置到一个合适的状态,以便为最终调用操作系统内核做好准备。BootLoader用来完成整个系统的加载启动任务。通常在系统上电或复位时,BootLoader程序从地址0 x00000000处开始执行。BootLoader的功能与嵌入式系统的硬件平台直接相关,不同的CPU体系结构和板级设备配置,BootLoader的功能不同。一般来说,BootLoader主要包含片级初始化、板级初始化和加载内核等一些基本功能。,(1)片级初始化片级初始化是一个纯硬件的初始化过程,把微处理器从上电时的默认状态逐步设置成系统所要求的工作状态。片级初始化主要完成设置微处理器的核心寄存器和控制寄存器

12、、微处理器的核心工作模式及其局部总线模式等初始化。(2)板级初始化板级初始化是一个同时包含有软件和硬件在内的初始化过程,通过正确地设置各种寄存器的内容来完成微处理器以外的其他硬件设备的初始化。例如,初始化LED显示设备、定时器、串口通信和内存控制器,建立内存空间的地址映射,设置中断控制寄存器和某些软件的数据结构和参数等。(3)加载内核将操作系统和应用程序的映像从Flash存储器复制到系统的内存当中,然后跳转到系统内核的第一条指令处继续执行。,1.Bootloader 概述,Bootloader,启动引导程序,又叫引导加载程序,功能强大的Bootloader也就直接叫做板级支持包(BSP,Boa

13、rd Support Packet)或者固件(Firmware)。近年来,为了方便嵌入式产品的推广,也有些直接将Bootloader叫做BIOS。BIOS是PC机的“基本输入输出系统”,烧录在电脑主板上一块专门的芯片中。一般BIOS由主板厂商或者专门的BIOS生产商提供,不是开源的,用户不能修改其中的代码进行定制。而嵌入式系统的开发则离不开Bootloader的开发,它也是整个系统开发中的难点之一。,1.1 Bootloader 的作用,Bootloader是在嵌入式操作系统内核运行之前运行的一段小程序,也是系统开机后执行的第一段程序。通过这段小程序,可以初始化硬件设备、建立内存空间,从而将系

14、统的软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader是依赖于底层硬件而实现的,因此建立一个通用的嵌入式系统Bootloader几乎是不可能的。在PC机中,主板的BIOS和位于硬盘0磁道上的主引导记录(Master Boot Record,MBR)中的引导程序(如LILO或GRUB等),两者一起的作用就相当于Bootloader在嵌入式系统中的作用,即实现整个系统的启动引导,并最终能引导操作系统的运行。,1.1 Bootloader 的作用,在嵌入式系统中,Bootloader对嵌入式设备中的主要部件如CPU、SDRAM、FLASH、串口等进行了初

15、始化,这样可以使用Bootloader通过串口下载各种文件到设备的SDRAM中或者烧录Flash,然后将操作系统内核读入到内存中来或者直接跳转到内核的入口点,从而实现操作系统的引导。现在有些Bootloader也把对以太网的支持等功能也加进去了,这样一个功能比较强大的Bootloader实际上就已经相当于一个微型的操作系统了。,10.1.1 Bootloader 的作用,Bootloader从第一条指令跳转后,就开始初始化各种最重要的硬件,比如CPU的工作频率、定时器、中断、看门狗、检测RAM大小和Flash等。一般,硬件初始化的这段程序是用汇编语言编写的,其后就用C语言编写。总体上Bootl

16、oader主要完成以下工作:,1.1 Bootloader 的作用,初始化CPU速度;初始化内存,包括启用内存库,初始化内存配置寄存器等;初始化中断控制器,在系统启动时,关闭中断,关闭看门狗;初始化串行端口(如果在目标上有的话);启用指令/数据高速缓存;设置堆栈指针;设置参数区域并构造参数结构和标记,即引导参数;执行POST(上电自检)来标识存在的设备并报告有何问题;为电源管理提供挂起/恢复支持;传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像文件事先存放在Flash中,这样就不需要Bootloader和主机传输操作系统内核镜像文件,这通常是在做成产品的情况下使用。而一般在开发过程中

17、,为了调试内核的方便,不将操作系统内核镜像文件固化在Flash中,这就需要主机和目标机进行文件传输;跳转到内核的开始,在此又分为ROM启动和RAM启动。所谓ROM启动就是直接在Flash中执行操作系统镜像文件;所谓RAM启动就是指把内核镜像从Flash复制到RAM中,然后再将PC指针跳转到RAM中的操作系统启动地址。,1.1 Bootloader 的作用,在嵌入式Linux软件系统的开发中,一般将软件分为启动引导程序(Bootloader)、操作系统内核(OS Kernel)、根文件系统(File System)、图形窗口系统(GUI)和应用程序(AP)等几个部分,其中前三部分是一个可运行的嵌

18、入式系统必不可少的,它们在开发的过程中,被分别独立地编译链接或打包为一个二进制目标文件,然后下载(烧录)到嵌入式系统的ROM(一般是Flash)中。后两部分如果有的话,通常也是和根文件系统一起打包后烧录到Flash中。因此,在Bootloader阶段,也提供了对Flash设备的分区格式化的支持,其空间分配通常如图所示。,1.2 Bootloader 的工作模式,对于嵌入式系统的开发人员而言,Bootloader通常包含“启动加载”和“下载”这两种不同的工作模式。当然,这两种工作模式的区别一般仅仅对于开发人员才有意义,而对最终用户来说,Bootloader 的作用就是用来加载操作系统,从而启动整

19、个嵌入式系统。,1.2 Bootloader 的工作模式,启动加载(Boot loading)模式 正常启动模式 下载(Downloading)模式提供给开发人员或者技术支持人员使用,1.3 Bootloader 的启动流程,分为stage1和stage2两个阶段 一般依赖于 CPU 体系结构的代码,比如设备初始化代码等,都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍且启动快的目的;而 stage2 则通常用C语言来实现,这样可以实现各种复杂的功能(比如串口、以太网接口的支持等),Bootloader的第一阶段,1.硬件设备初始化2.为加载 Bootloader 的 stag

20、e2 准备 RAM 空间 3.拷贝 Bootloader的 stage2 到 RAM 空间中4.设置好堆栈 5.跳转到 stage2 的 C 入口点main()函数处,Bootloader的第二阶段,初始化本阶段要使用到的硬件设备检测系统内存映射(memory map)将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中为内核设置启动参数调用内核,3设备驱动程序在一个嵌入式系统中,可以没有操作系统,但设备驱动程序是必不可少的。设备驱动程序是一组库函数,用来对硬件进行初始化和管理,并向上层软件提供访问接口。不同功能的硬件设备,它们的设备驱动程序是不同的。但大多数的设备驱动

21、程序都具有硬件启动(初始化)、硬件关闭(关机)、硬件停用(暂停)、硬件启用(重新启用)、读操作(读取数据)、写操作(写入数据)等基本功能。设备驱动程序通常可以完成一些特定的功能,这些功能一般采用函数的形式来实现,这些函数有分层结构和混合结构两种组织结构形式。,5.2嵌入式操作系统基础,嵌入式操作系统的功能在嵌入式系统中工作的操作系统称为EOS(Embedded Operating System,嵌入式操作系统),EOS的基本功能主要体现在以下两个方面:1构成一个易于编程的虚拟机平台EOS构成一个虚拟机平台,EOS把底层的硬件细节封装起来,为运行在它上面的软件(如中间件软件和各种应用软件)提供了

22、一个抽象的编程接口。软件开发在这个编程接口的上进行,而不直接与机器硬件层打交道。EOS所提供的编程接口实际上就是操作系统对外提供的系统调用函数。2系统资源的管理者EOS是一个系统资源的管理者,负责管理系统当中的各种软硬件资源,如处理器、内存、各种I/O设备、文件和数据等,使得整个系统能够高效、可靠地运转。,运行在嵌入式环境中的EOS其目标是为了完成某一项或有限项功能,而非通用型的操作系统,因此在性能和实时性方面有严格的限制,能耗、成本和可靠性通常是影响设计的重要因素,要求占用资源少,适合在有限存储空间运行,要求系统功能可以根据产品的设计要求进行剪裁、调整。所有的EOS都有一个内核(kernel

23、),内核是系统当中的一个组件,它包含了任务管理、存储管理、输入输出(I/O)设备管理和文件系统管理四个功能模块。其中:任务管理:对嵌入式系统中的运行软件进行描述和管理,并完成处理机资源的分配与调度;存储管理:用来提高内存的利用率,方便用户的使用,并提供足够的存储空间;I/O设备管理:方便设备的使用,提高CPU和输入输出设备的利用率;文件管理:解决文件资源的存储、共享、保密和保护等问题。注意:不同的嵌入式系统的EOS所包含的组件可能各不相同,内核设计也可能各不相同的,完全取决于系统的设计以及实际的应用需求。,嵌入式操作系统的分类,EOS可以按照系统的类型、响应时间和软件结构等不同的标准来分类。1

24、按系统的类型分类按照系统的类型,可以把EOS分为商业化系统、专用系统和开放源代码系统三大类。(1)商业化系统商业化的EOS有风河公司(WindRiver)的VxWorks,微软公司的Windows CE,Palm公司的PalmOS等等,其特点是功能强大,性能稳定,辅助软件工具齐全,应用范围广泛,但成本较高。(2)专用系统专用系统是一些专业厂家为本公司产品特制的嵌入式操作系统,一般不提供给应用开发者使用。(3)开放源代码系统开放源代码的嵌入式操作系统有C/OS和各类嵌入式Linux系统等,具有免费、开源、性能优良、资源丰富、技术支持强等优点,是近年来发展迅速的一类操作系统。,2按响应时间分类按照

25、系统对响应时间的敏感程度,EOS可以分为RTOS(Real Time Operating Systems,实时操作系统)和非实时操作系统两大类:。RTOS对响应时间有非常严格的要求,当某一个外部事件或请求发生时,相应的任务必须在规定的时间内完成相应的处理。RTOS可以分为硬实时和软实时两种情形。(1)硬实时系统硬实时系统对响应时间有严格的要求,如果响应时间不能满足可能会引起系统的崩溃或致命的错误。(2)软实时系统软实时系统对响应时间有要求,如果响应时间不能满足,将需要支付能够接受的额外代价。非实时系统对响应时间没有严格的要求,各个进程分享处理器,以获得各自所需要的运行时间。,3按软件结构分类按

26、照软件的体系结构,EOS可以分为单体结构、分层结构和微内核结构三大类,(1)单体结构单体结构是一种常见的组织结构,嵌入式Linux操作系统、Jbed RTOS、C/OS-II和PDOS都属于单体内核系统。在单体结构(monolithic)的操作系统中,中间件和设备驱动程序通常就集成在系统内核当中,整个系统通常只有一个可执行文件,里面包含了所有的功能组件。单体结构的操作系统由一组功能模块组成,系统的各个模块之间可以相互调用,通信开销比较小,系统高度集成和相互关联,系统剪裁、修改、调试和维护不方便。,图5.2.1 单体结构,图5.2.2 分层结构,采用分层结构(layered)的操作系统内部分为若

27、干个层次(0N),各个层次之间的调用关系是单向的,即某一层次上的代码只能调用比它低层的代码。分层结构要求在每个层次上都要提供一组API接口函数,增加了系统的额外开销,但系统的开发和维护较为简单。典型代表有MS-DOS,其结构就是一个有代表性的、组织良好的分层结构。(3)微内核结构微内核(microkernel)结构把操作系统的大部分功能都剥离出去,在内核中只保留最核心的功能单元(如进程管理和存储管理),大部分的系统功能都位于内核之外,例如,将所有的设备驱动程序都被置于内核之外。在微内核操作系统中,大部分的系统功能被放置在内核之外,系统具有更高的安全性。新的功能组件也可以被动态地添加进来,扩展、

28、调试、移植方便。在微内核操作系统中,核内组件与核外组件之间的通信方式是消息传递,而不是直接的函数调用,运行速度可能会慢一些。另外,由于它们的内存地址空间是相互独立的,在切换的时候,也会增加额外的开销。,OS-9、C Executive、VxWorks,CMX-RTX、Nucleus Plus和QNX等EOS采用的都是微内核结构。,微内核结构,常见的嵌入式操作系统简介,嵌入式操作系统是操作系统研究领域中的一个重要分支,有许多公司在从事相关方面的研究,开发了数以百计的各具特色的嵌入式操作系统产品,其中比较有影响的系统有VxWorks、嵌入式Linux、Windows CE、C/OS-II和Palm

29、OS等。,5.3 嵌入式系统的任务管理,5.3.1 单道程序设计和多道程序设计嵌入式操作系统可以分为单道程序设计和多道程序设计(mufti-programming)两种类型。1单道程序设计类型采用单道程序设计的操作系统在任何时候只能有一个程序在运行。例如:有两个程序甲和乙,它们在运行过程中都要用到CPU和I/O设备。如图所示,图中我们采用不同的方框来表示这两个程序对两种资源的使用情况,方框的长度表示使用的时间。在单道程序设计的环境下,在任何时候,系统中只能有一个程序在运行,因此,甲和乙这两个程序只能一个接一个的执行。首先执行程序甲,从t0时刻开始,到t6时刻结束。然后再执行程序乙,从t6时刻开

30、始,一直到它所有的工作都已完成。,2.多道程序设计类型采用多道程序设计的操作系统允许多个程序同时存在并运行,采用多道程序技术可以有效提高系统资源的利用率。在多道程序设计的环境下,允许多个程序同时运行,当一个程序在访问I/O设备时,会主动把CPU交出来,让另一个程序去运行,从而提高系统资源的使用效率。从t0到t1,甲在使用I/O设备,乙处于等待状态。在到达了t1时刻后,甲释放刚刚占用的I/O设备,交给程序乙去使用。因此,在t1到t2期间,程序甲在使用CPU,程序乙在使用I/O设备。在到达t2时刻后,乙释放刚刚占用的I/O设备,交给程序甲去使用。因此,在t2到t3期间,甲和乙两个程序相互交换资源,

31、继续执行。同样的情形也发生在t3时刻和t4时刻。但是在t5时刻,甲已经使用完了I/O设备,而乙仍然在使用CPU,所以甲只能处于等待状态,等到t6时刻再交换资源。这样一直进行下去,在t7时刻,甲执行完毕,在t8时刻,乙也执行完毕。从图可见,由于CPU和I/O设备的使用是并行进行的,在总的执行时间上要明显少于单道程序系统。,单道程序与多道程序的运行过程,进程、线程和任务,1进程进程(process)是在描述多道系统中并发活动过程引入的一个概念。进程和程序是两个既有联系又有区别的概念,两者不能混为一谈。例如:一个程序主要由代码和数据两部分内容组成。而进程是正在执行的程序,它是由程序和该程序的运行上下

32、文两部分内容组成。程序是静态的,而进程是一个动态的,变化的。进程和程序之间并不是一一对应的。一个进程在运行的时候可以启动一个或多个程序,同一个程序也可能由多个进程同时执行。程序可以以文件的形式存放在硬盘或光盘上,作为一种软件资源长期保存。而进程则是一次执行过程,它是暂时的,是动态地产生和终止的。一个进程通常包含有以下几个方面的内容:相应的程序:进程是一个正在运行的程序,有相应程序的代码和数据。,CPU上下文:程序在运行时,CPU中含有PC(Program Counter,程序计数器)、PSW(Program Status Word,程序状态字)、通用寄存器、段寄存器、栈指针寄存器等各种寄存器的

33、当前值内容,例如:在PC中记录的将要取出的指令的地址,在PSW中用于记录处理器的运行状态信息,通用寄存器存放的数据或地址;段寄存器存放的程序中各个段的地址;栈指针寄存器记录的栈顶的当前位置。一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地址空间、进程正在使用的文件等。总而言之,进程包含了正在运行的一个程序的所有状态信息。进程具有动态性,进程是一个正在运行的程序,程序的运行状态都在不断地变化,如PC寄存器的值、堆和栈的内容、通用寄存器存放数据和地址等。进程具有独立性,一个进程是一个独立的实体,占有计算机的系统资源,每个进程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进

34、程。进程具有并发性,在系统中同时有多个进程存在,它们相互独立地运行。,2线程线程(thread)是一个比进程更小的能独立运行的基本单位。所谓的线程,就是进程当中的一条执行流程。从资源组合的角度来看,进程把一组相关的资源组合起来,构成了一个资源平台(资源环境),其中包括运行上下文、内存地址空间、打开的文件等,在图中用深色的方框来表示。从程序运行的角度来看,进程就是一个正在运行的程序,在图中用一条带有箭头的线段来表示。从图可见,可以把进程看成是程序代码在这个资源平台上的一条执行流程(线程),也就是可以认为进程等于线程加上资源平台。如图所示,在一个进程当中,或者说在一个资源平台上,可以同时存在多个线

35、程。可以用线程来作为CPU的基本调度单位,使得各个线程之间可以并发执行。对于同一个进程当中的各个线程来说,运行在相同的资源平台上,可以共享该进程的大部分资源(如内存地址空间、代码、数据、文件等),但也有一小部分资源是不能共享的,每个线程都必须拥有各自独立的一份(如CPU运行上下文(如PC寄存器、PSW寄存器、通用寄存器和栈指针等)和栈)。,线程与进程的资源关系,3任务在一些嵌入式系统中,把能够独立运行的实体称为“任务”(task),并没有使用“进程”或“线程”这两个概念。任务到底是进程还是线程,在研究一个具体的嵌入式操作系统的时候,要注意加以区分。在任务的创建过程需要定义的主要参数有任务的优先

36、级、栈空间的大小和函数名。任务具有独立的优先级和栈空间,CPU上下文一般也是存放在栈空间中。对于不同的任务,它们也能够访问相同的全局变量,在这些任务之间,可以很方便地、直接地去使用共享的内存,而不需要经过系统内核来进行通信。通常认为,在嵌入式操作系统中“任务”就是线程,如在VxWorks、C/OS-II、Jbed、嵌入式Linux等嵌入式操作系统中。,任务的实现,1任务的层次结构任务的层次结构如图所示。在多道程序的嵌入式操作系统中,同时存在着多个任务,嵌入式内核启动时,只有一个任务存在,然后由该任务派生出其他所有任务,这些任务采用层状结构,存在着父子关系。,2.任务的创建与终止(1)任务的创建

37、在一个嵌入式操作系统中,在系统初始化、任务运行过程中、人机交互等过程中都可以创建任务。在系统初始化时,一般都会创建系统与用户进行交互的一些前台任务,以及完成键盘扫描、系统状态检测、时间统计等一些特定功能的后台任务。在任务运行过程中,也能够使用相应的系统调用来创建新的任务,以帮助它完成自己的工作。在一些具有交互功能的嵌入式系统中,用户可以通过输入命令或单击图标的方式,让系统启动一个新的任务。创建任务的基本方法是在一个已经存在的任务当中,通过调用相应的系统函数来创建一个新的任务。,(2)任务的终止任务的终止可能有多种原因,正常退出、错误退出、被其他任务踢出等情况可以使任务终止。当一个任务完成了所有

38、的工作,需要结束运行,提出退出要求,称为正常退出。当一个任务在执行过程中,出现了致命的错误(例如执行了非法指令、内存访问错误等),系统中止该任务的运行,强制性地让该任务退出,称为错误退出。在一些操作系统中可以提供一些系统调用函数,用来把一个任务从系统中清除出局,称为被其他任务踢出。在一些嵌入式系统中,某些任务被设计为“死循环”的模式,任务不会自行终止。,3任务的状态在多道程序系统中,任务是独立运行的实体,需要竞争系统资源,而任务所拥有的资源是在不断变化中的,使得任务的状态也在不断的变化。一般来说,任务具有运行(running)、就绪(ready)和阻塞(blocked)三种基本状态。任务在运行

39、状态时占有CPU并在CPU上运行,在任何一个时刻,处于运行状态的任务个数必须小于或等于CPU的数目。如果在一个系统中只有一个CPU的话,那么最多只能有一个任务处于运行状态。当一个任务已具备运行条件,但由于CPU正在运行其他的任务,暂时不能运行该任务时,称为就绪状态。不过,只要把CPU分给该任务,它就能够立刻执行。,任务因为正在等待某种事件的发生而暂时不能运行称为阻塞状态,也叫等待状态(waiting)。此时,即使CPU已经空闲下来了,该任务也还是不能运行。如图所示,在一定条件下,任务会在不同的状态之间来回转换,存在运行阻塞、运行就绪、就绪运行、阻塞就绪四种转换关系。,任务间的状态转换图,4任务

40、控制块TCB(Task Control Block,任务控制块)是在操作系统当中用来描述和管理一个任务的数据结构。通过对各个任务的TCB的操作来实现任务管理。利用TCB这个数据结构可以描述任务的基本情况,以及它的运行变化过程。可以把TCB看成是任务存在的唯一标志。当需要创建一个新任务的时候,就为它生成一个TCB,并初始化这个TCB的内容;当需要终止一个任务的时候,只要回收它的TCB即可。对任务的组织和管理可以通过对它们的TCB的组织和管理来实现。TCB主要包括任务的管理信息、CPU上下文信息、资源管理信息等内容。(1)任务的管理信息任务的管理信息包括任务的标识ID、任务的状态、任务的优先级、任

41、务的调度信息、任务的时间统计信息、各种队列指针等。,(2)CPU上下文信息CPU上下文信息包括通用寄存器、PC寄存器、程序状态字、栈指针等各种CPU寄存器的当前值。在实际的嵌入式系统中,CPU上下文信息不一定直接存放在TCB当中,而是存放在任务的栈当中,可以通过相应的栈指针来访问。(3)资源管理信息在操作系统中,任务表示的是进程,则还应包含一些资源管理方面的信息,如段表地址、页表地址等存储管理方面的信息,根目录、文件描述字等文件管理方面的信息。,5任务切换任务切换(context switching)是指一个任务正在CPU上运行,由于某种原因,系统需要调度另一个任务去运行,那么这时就需要进行把

42、当前任务的运行上下文保存起来,并设置新任务的上下文,这一过程称为任务切换。任务切换通常包含有以下几个基本步骤:(1)将处理器的运行上下文保存在当前任务的TCB中;(2)更新当前任务的状态,从运行状态变为就绪状态或阻塞状态。(3)按照一定的策略,从所有处于就绪状态的任务中选择一个去运行。(4)修改新任务的状态,从就绪状态变成运行状态。(5)根据新任务的TCB的内容,恢复它的运行上下文环境。,6任务队列在一个多任务的操作系统中,各个任务的状态是经常变化的,有时处于运行状态,有时处于就绪状态,有时又处于阻塞状态。通常采用任务队列的方式来组织它的所有任务,以提高对这些任务的管理效率。操作系统用一组队列

43、来表示系统当中所有任务的当前状态。例如,处于运行状态的所有任务构成了运行队列,处于就绪状态的所有任务构成了就绪队列,而对于处于阻塞状态的任务,则要根据它们阻塞的原因,分别构成相应的阻塞队列。不同的状态用不同的队列来表示。然后,对于系统当中的每一个任务,根据它的状态把它的TCB加入到相应的队列当中去。如果一个任务的状态发生变化,就要把它的TCB从一个状态队列中脱离出来,加入到另一个队列当中去。,5.3.4 任务的调度,1任务调度概述在多道程序操作系统中,当有两个或多个任务同时处于就绪状态时,而系统中只有一个CPU而且这个CPU己经空闲下来了,就会出现多个任务同时去竞争这个CPU的情况。通常利用调

44、度器(scheduler)选择就绪队列中的那些任务中的一个去运行,调度器是CPU这个资源的管理者。调度器在决策过程中所采用的算法称为调度算法。一般来说,在一个新的任务被创建时、在一个任务运行结束时、在一个任务由于I/O操作、信号量或其他原因被阻塞时、在一个I/O中断发生时、在一个时钟中断发生时这五种调度时机都可能会发生任务的调度。,任务调度存在可抢占调度(preemptive)和不可抢占调度(nonpreemptive)两种调度方式。(1)在可抢占调度方式,当一个任务正在运行的时候,出现调度时机当中的五种情况之一,都有可能会发生调度。调度程序可以去打断它,并安排另外的任务去运行。实时操作系统大

45、都采用可抢占的调度方式。(2)在不可抢占调度方式,一个任务长时间地占用着CPU系统也不会强制它中止。当出现新任务创建、任务运行结束及任务被阻塞的调度时机时,有可能会发生调度。而对于发生的各种中断,并不会去调用调度程序,而是在中断处理完成后,又会回到刚才被打断的任务中继续执行。,在嵌入式操作系统中,存在着许多的调度算法,每一种算法都有各自的优点和缺点。可以根据响应时间、周转时间、调度开销、公平性、均衡性、吞吐量等指标来评价一个调度算法的好坏。其中:调度器为一个就绪任务进行上下文切换时所需的时间,以及任务在就绪队列中的等待时间称为响应时间(response time)。一个任务从提交到完成所经历的

46、时间称为周转时间(turnaround time)。调度器在做出调度决策时所需要的时间和空间开销称为调度开销(overhead)。,公平性(fairness)是指大致相当的两个任务所得到的CPU时间也应该是大致相同的。另外,要防止饥饿(starvation)情况出现,即某一个任务始终得不到处理器去运行。均衡性(balance)是指要尽可能使整个系统的各个部分(CPU,I/O)都忙起来,提高系统资源的使用效率。单位时间内完成的任务数量称为吞吐量(throughput)。对于一个调度算法来说,这些指标中一些是共存的,而另一些是相互牵制的,这些指标不可能全部都实现,而是需要根据系统的要求,综合权衡和

47、折中选择。,2先来先服务算法(First Come First Served,FCFS)FCFS(First Come First Served,先来先服务算法)是一种最简单的调度算法。FCFS的基本思想就是按照任务到达的先后次序来进行调度,它是一种不可抢占的调度方式。FCFS也叫做FIFO(First In First Out,先进先出算法)。FCFS的最大优点就是简单,易于理解也易于实现。缺点是一批任务的平均周转时间取决于各个任务到达的顺序,如果短任务位于长任务之后,那么将增大平均周转时间。,3短作业优先算法(Shortest Job First,SJF)在SJF(Shortest Job

48、 First,短作业优先算法)中,在各个任务在开始执行前,事先预计好各任务的执行时间,调度算法根据这些预计时间,安排执行时间较短的任务优先执行。可以证明,对于一批同时到达的任务,采用SJF算法将得到一个最小的平均周转时间。SJF算法有不可抢占方式和可抢占方式两种实现方案。在不可抢占方式,只有任务运行完毕或者是被阻塞时,才会让出CPU进行新的调度。而在可抢占方式,当前任务正在运行的时候,来了一个比它执行时间更短的任务,而且它的运行时间要小于当前正在运行的任务的剩余时间,那么这个新任务就会抢占CPU去运行。这种方法也称为SRTF(Shortest Remaining Time First,最短剩余

49、时间优先算法),4时间片轮转算法(Round Robin,RR)RR算法如图所示。在RR(Round Robin,时间片轮转算法)中,把系统当中的所有就绪任务按照先来先服务的原则进行排列,然后,在每次调度的时候,处理器分派给队列当中的第一个任务一小段CPU执行时间(time slice,时间片)。当这个时间片结束的时候,如果任务还没有执行完的话,将会发生时钟中断,调度器将会暂停当前任务的执行,并把这个任务送到就绪队列的末尾,然后再执行当前的队列的第一个任务。如果一个任务在分配给它的时间片结束前就已经运行结束了或者是被阻塞了,那么它就会立即让出CPU给其他的任务。,5优先级算法(priority

50、)在优先级调度算法(priority)中,给每一个任务都设置一个优先级,然后在任务调度的时候,在所有处于就绪状态的任务中选择优先级最高的那个任务去运行。优先级算法可以分为可抢占和不可抢占两种方式。在可抢占方式中,当一个任务正在运行的时候,如果这时来了一个新的任务,其优先级更高,则立即抢占CPU去运行这个新任务。而不可抢占方式则是需要等当前任务运行完后再决定。可以采用静态方式和动态方式确定任务的优先级。,5.4 嵌入式系统的存储管理,嵌入式存储管理方式的特点 嵌入式系统的存储管理方式与系统的实际应用领域及硬件环境密切相关,不同的嵌入式系统采用不同的存储管理方式,需要考虑硬件条件、实时性要求、系统

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号