【文档说明】ARM汇编语言程序设计基础-第8章--嵌入式系统-课件.ppt,共(93)页,338.512 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44737.html
以下为本文档部分文字说明:
第8章嵌入式系统软件及操作系统基础8.1嵌入式软件基础8.1.1嵌入式软件的特点应用在嵌入式计算机系统当中的各种软件统称为嵌入式软件,作为嵌入式系统的一个组成部分,目前嵌入式软件的种类和规模都得到了极大的发展,形成了一个完整、独立的体系。除了具有通用软件的一般特性,
同时还具有一些与嵌入式系统密切相关的特点,如:(l)规模较小在一般情况下,嵌入式系统的资源多是比较有限的,要求嵌入式软件必须尽可能地精简,多数的嵌入式软件都在几MB以内。(2)开发难度大嵌入式系统由于硬件资源的有限,使得嵌入式
软件在时间和空间上都受到严格的限制,需要开发人员对编程语言、编译器和操作系统有深刻的了解,才有可能开发出运行速度快、存储空间少、维护成本低的软件。嵌入式软件一般都要涉及到底层软件的开发,应用软件的开发也是直接基于操作系统的,这就要求开发人员具有扎
实的软、硬件基础,能灵活运用不同的开发手段和工具,具有较丰富的开发经验。嵌入式软件的运行环境和开发环境比PC机复杂,嵌入式软件是在目标系统上运行的,而嵌入式软件的开发工作则是在另外的开发系统中进行,当应用软件调试无误后,再把它放到目标系统上去。(3)高实时性和可靠性要求具有实时处理的
能力是许多嵌入式系统的基本要求,实时性要求软件对外部事件做出反应的时间必须要快,在某些情况下还要求是确定的、可重复实现的,不管系统当时的内部状态如何,都是可以预测的。同时,对于事件的处理一定要在限定的时间期限之前完成,否则就有可能引起系
统的崩溃。在航天控制、核电站、工业机器人等实时系统对嵌入式软件的可靠性要求是非常高的,一旦软件出了问题,其后果是非常严重的。(4)软件固化存储为了提高系统的启动速度、执行速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片或微处理器中。8.1.2嵌入式软件的分
类1.系统软件系统软件控制和管理嵌入式系统资源,为嵌入式应用提供支持的各种软件,如设备驱动程序、嵌入式操作系统、嵌入式中间件等。2.应用软件应用软件是嵌入式系统中的上层软件,它定义了嵌入式设备的主要功能和用途,并
负责与用户进行交互。应用软件是嵌入式系统功能的体现,如飞行控制软件、手机软件、MP3播放软件、电子地图软件等,一般面向于特定的应用领域,。3.支撑软件支撑软件指辅助软件开发的工具软件,如系统分析设计工具、在线仿真工具、交叉编译器、源程序模拟器和配置管理工具等。在嵌入式系统
当中,系统软件和应用软件运行在目标平台的(即嵌入式设备上),而对于各种软件开发工具来说,它们大部分都运行在开发平台(PC机)上,运行Windows或Linux操作系统。8.1.3嵌入式软件的体系结构1.无操作系统的嵌入式软件早期在嵌入式系统的应用范围主要集中在控制领域,硬件的配置比较低,嵌入式
软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统,软件的规模也很小。无操作系统的嵌入式软件主要采用循环轮转和中断(前后台)两种实现方式。(1)循环轮转方式循环轮转方式的基本设计思想是:把系统的功能分解为若干个不同的
任务,放置在一个永不结束的循环语句当中,按照时间顺序逐一执行。当程序执行完一轮后,又回到程序的开头重新执行,循环不断。循环轮转方式的程序简单、直观、开销小、可预测。软件的开发可以按照自顶向下、逐步求精的方式,将系统要完成的功能逐级划分成若干个小的功能模块进行
编程,最后组合在一起。循环轮转方式的软件系统只有一条执行流程和一个地址空间,不需要任务之间的调度和切换,其程序的代码都是固定的,函数之间的调用关系也是明确的,整个系统的执行过程是可预测的。循环轮转方式的缺点是程序
必须按顺序执行,无法处理异步事件,缺乏并行处理的能力。缺乏硬件上的时间控制机制,无法实现定时功能。(2)中断方式中断方式又称为前后台系统形式,系统在循环轮转方式的基础上增加了中断处理功能。ISR(InterruptServ
iceRoutine,中断服务程序)负责处理异步事件,即前台程序(foreground),也称为事件处理级程序。而后台程序(background)是一个系统管理调度程序,一般采用的是一个无限的循环形式,负责掌管整
个嵌入式系统软、硬件资源的分配、管理以及任务的调度。后台程序也称为任务级程序。一般情形下,后台程序会检查每个任务是否具备运行条件,通过一定的调度算法来完成相应的操作。而一些对实时性有要求的操作通常由中断服务程序来完成,大多数的中断服务程序只做一些最基本的操作,如标记中断
事件的发生等,其余的事情会延迟到后台程序去完成。2.有操作系统的嵌入式软件从20世纪80年代开始,操作系统出现在嵌入式系统上。如今,嵌入式操作系统在嵌入式系统中广泛应用,尤其是在功能复杂、系统庞大的应用中显得愈来愈重要。在
应用软件开发时,程序员不是直接面对嵌入式硬件设备,而是采用一些嵌入式软件开发环境,在操作系统的基础上编写程序。在控制系统中,采用前后台系统体系结构的软件,在遇到强干扰时,可能会使应用程序产生异常、出错,甚至死循环的现象,
从而造成系统的崩溃。而采用嵌入式操作系统管理的系统,在遇到强干扰时,可能只会引起系统中的某一个进程被破坏,但这可以通过系统的监控进程对其进行修复,系统具有自愈能力,不会造成系统崩溃。在嵌入式操作系统环境下,开发一个复杂的应用程序,通常可以按照软件工程的思想,将整个程序分解为多
个任务模块,每个任务模块的调试、修改几乎不影响其他模块。利用商业软件提供的多任务调试环境,可大大提高系统软件的开发效率,降低开发成本,缩短开发周期。嵌入式操作系统本身是可以剪裁的,嵌入式系统外设、相关应用也可以配置,所开发的应用软件可以在不同的应用环境、不
同的处理器芯片之间移植,软件构件可复用,有利于系统的扩展和移植。嵌入式软件的体系结构图如图8.1.2所示,最底层的是嵌入式硬件系统,包括嵌入式微处理器、存储器、键盘、LCD显示器等输入/输出设备。在硬件层之上的是设备驱动层,它负责与硬件直接打交道,并为操作系统
层软件提供所需的驱动支持。操作系统层可以分为基本部分和扩展部分,基本部分是操作系统的核心,负责整个系统的任务调度、存储管理、时钟管理和中断管理等功能;扩展部分为用户提供网络、文件系统、图形用户界面GUI、数据库等扩展功能,扩展部分的内容可以根据系统的需要来进行剪裁。在操作系统的上面是一些
中间件软件。最上层是网络浏览器、MP3播放器、文本编辑器、电子邮件客户端、电子游戏等各种应用软件,实现嵌入式系统的功能。图8.1.2嵌入式软件体系结构8.1.4嵌入式系统的设备驱动嵌入式系统的设备驱动层用来完成嵌入式系
统硬件设备所需要的一些软件初始化和管理。设备驱动层直接对硬件进行管理和控制,并为上层软件提供所需的驱动支持。1.板级支持包设备驱动层也称为BSP(BoardSupportPackage,板级支持包),在BSP中把所有与硬件相关的代码都封装起来,为操作系
统提供一个虚拟的硬件平台,操作系统运行在这个虚拟的硬件平台上。在BSP当中,使用一组定义好的编程接口来与BSP进行交互,并通过BSP来访问真正的硬件。在嵌入式系统中,BSP类似于PC系统中的BIOS和驱
动程序。BSP把嵌入式操作系统与具体的硬件平台隔离开来。一般来说,BSP是针对某个特定的单板而设计的,系统都会提供相应的演示版本的BSP(最小系统BSP)。BSP对于用户(指系统开发人员)是开放的,用户可以根据不同的硬件需求对其进行改动或二次开发。在实际开发一个嵌入式系统的时候,
通常可以找到一个与自己的硬件系统相近的演示版本的BSP,并以此为基础,进行修改和完善,以适应不同单板的需求。BSP主要包括BootLoader(引导加载程序)和设备驱动程序两个方面的内容。对于不同的嵌入式操作系统,BSP的具体结构和组成是不相同的。2.BootLoader
BootLoader(引导加载程序)是在操作系统内核运行之前运行的一小段程序。通过这段程序,初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境设置到一个合适的状态,以便为最终调用操作系统内核做好准备。Boo
tLoader用来完成整个系统的加载启动任务。通常在系统上电或复位时,BootLoader程序从地址0x00000000处开始执行。BootLoader的功能与嵌入式系统的硬件平台直接相关,不同的CPU体系结构和板级设备配置,Boot
Loader的功能不同。一般来说,BootLoader主要包含片级初始化、板级初始化和加载内核等一些基本功能。(1)片级初始化片级初始化是一个纯硬件的初始化过程,把微处理器从上电时的默认状态逐步设置成系统所要求的工作状态。片级初始化主要完成设置微处理器的核心寄存器和控制
寄存器、微处理器的核心工作模式及其局部总线模式等初始化。(2)板级初始化板级初始化是一个同时包含有软件和硬件在内的初始化过程,通过正确地设置各种寄存器的内容来完成微处理器以外的其他硬件设备的初始化。例如,初始化LED显示
设备、定时器、串口通信和内存控制器,建立内存空间的地址映射,设置中断控制寄存器和某些软件的数据结构和参数等。(3)加载内核将操作系统和应用程序的映像从Flash存储器复制到系统的内存当中,然后跳转到系统内核的第一条指令处继续
执行。3.设备驱动程序在一个嵌入式系统中,可以没有操作系统,但设备驱动程序是必不可少的。设备驱动程序是一组库函数,用来对硬件进行初始化和管理,并向上层软件提供访问接口。不同功能的硬件设备,它们的设备驱动程序是不同的。但大多数的设备
驱动程序都具有硬件启动(初始化)、硬件关闭(关机)、硬件停用(暂停)、硬件启用(重新启用)、读操作(读取数据)、写操作(写入数据)等基本功能。设备驱动程序通常可以完成一些特定的功能,这些功能一般采用函数的形式来实现,这些函数有分层结构和混合结构两种组织结构形式。在分层结构中,设备驱动
程序中的函数分为硬件接口和调用接口两种类型。硬件接口直接跟硬件打交道的,直接去操作和控制硬件设备;调用接口不直接与硬件打交道,它们调用硬件接口当中的函数,与上层软件(包括操作系统、中间件和应用软件)打交道的。分层结构把所有与硬件有关的细节
都封装在硬件接口当中,在硬件要升级时,只需要改动硬件接口当中的函数即可,而上层接口当中的函数不用做任何修改。在混合结构中,上层接口和硬件接口的函数是混在一起、相互调用的,之间没有明确的层次关系。8.
1.5嵌入式中间件中间件是一种软件平台技术,在银行、证券、电信等行业的大型计算机应用系统中广泛应用。近年来,中间件技术也被引入到嵌入式系统的设计中,并与实时多任务操作系统紧密结合。利用中间件技术可以使用户把精力集中到系统功能的实现上,实现嵌入式系统
的软硬件协同设计。嵌入式中间件是指不包括操作系统内核、设备驱动程序和应用软件在内的所有系统软件。嵌入式中间件把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,为应用软件提供一个灵活、安全、移植性好、
相互通信、协同工作的平台。嵌入式中间件可以分为消息中间件、对象中间件、远程过程调用(RemoteProcedureCalls,RPC)、数据库访问中间件、安全中间件等不同的类型。一些公司可提供嵌入式中间件集
成解决方案,如Sun公司的嵌入式Java,微软公司的.NETCompactFrame-work,OMG(ObjectManagementGroup)的嵌入式CORBA等。8.2嵌入式操作系统基础8.
2.1嵌入式操作系统的功能在嵌入式系统中工作的操作系统称为EOS(EmbeddedOperatingSystem,嵌入式操作系统),EOS的基本功能主要体现在以下两个方面:1.构成一个易于编程的虚拟机
平台EOS构成一个虚拟机平台,EOS把底层的硬件细节封装起来,为运行在它上面的软件(如中间件软件和各种应用软件)提供了一个抽象的编程接口。软件开发在这个编程接口的上进行,而不直接与机器硬件层打交道。EOS所提供的编程接口实际上就是
操作系统对外提供的系统调用函数。2.系统资源的管理者EOS是一个系统资源的管理者,负责管理系统当中的各种软硬件资源,如处理器、内存、各种I/O设备、文件和数据等,使得整个系统能够高效、可靠地运转。运行在嵌入式环境中的
EOS其目标是为了完成某一项或有限项功能,而非通用型的操作系统,因此在性能和实时性方面有严格的限制,能耗、成本和可靠性通常是影响设计的重要因素,要求占用资源少,适合在有限存储空间运行,要求系统功能可以根据产品的设计要求进行剪裁、调整。所有
的EOS都有一个内核(kernel),内核是系统当中的一个组件,它包含了任务管理、存储管理、输入/输出(I/O)设备管理和文件系统管理四个功能模块。其中:●任务管理:对嵌入式系统中的运行软件进行描述和管理,并完成处理机资源的分配与调度;●存储管理:用来提高内存的利用率,方
便用户的使用,并提供足够的存储空间;●I/O设备管理:方便设备的使用,提高CPU和输入/输出设备的利用率;●文件管理:解决文件资源的存储、共享、保密和保护等问题。注意:不同的嵌入式系统的EOS所包含的组件可能各不相同,内核设计也可
能各不相同的,完全取决于系统的设计以及实际的应用需求。8.2.2嵌入式操作系统的分类EOS可以按照系统的类型、响应时间和软件结构等不同的标准来分类。1.按系统的类型分类按照系统的类型,可以把EOS分为商业化系统、专用系统和开放源代码系统三大类。
(1)商业化系统商业化的EOS有风河公司(WindRiver)的VxWorks,微软公司的WindowsCE,Palm公司的PalmOS等等,其特点是功能强大,性能稳定,辅助软件工具齐全,应用范围广泛,但成本较高。(2)专用系统专用系统是一些
专业厂家为本公司产品特制的嵌入式操作系统,一般不提供给应用开发者使用。(3)开放源代码系统开放源代码的嵌入式操作系统有µC/OS和各类嵌入式Linux系统等,具有免费、开源、性能优良、资源丰富、技术支持强
等优点,是近年来发展迅速的一类操作系统。2.按响应时间分类按照系统对响应时间的敏感程度,EOS可以分为RTOS(RealTimeOperatingSystems,实时操作系统)和非实时操作系统两大类:。RTOS对响应时间有非常严格的要求
,当某一个外部事件或请求发生时,相应的任务必须在规定的时间内完成相应的处理。RTOS可以分为硬实时和软实时两种情形。(1)硬实时系统硬实时系统对响应时间有严格的要求,如果响应时间不能满足可能会引起系统的崩溃或致命的错误。(2)软实时系统软实时系统对响应时间有要求,如果响应时间不能满足
,将需要支付能够接受的额外代价。非实时系统对响应时间没有严格的要求,各个进程分享处理器,以获得各自所需要的运行时间。3.按软件结构分类按照软件的体系结构,EOS可以分为单体结构、分层结构和微内核结构三大类,如8.2.1~8.2.3所示。(1)单体结构
单体结构是一种常见的组织结构,嵌入式Linux操作系统、JbedRTOS、µC/OS-II和PDOS都属于单体内核系统。在单体结构(monolithic)的操作系统中,中间件和设备驱动程序通常就集成在系统内核当中,整个系统通常只有一个可执行文件,里面包
含了所有的功能组件。单体结构的操作系统由一组功能模块组成,系统的各个模块之间可以相互调用,通信开销比较小,系统高度集成和相互关联,系统剪裁、修改、调试和维护不方便。图8.2.1单体结构图8.2.2分层结构采用分层结构(layere
d)的操作系统内部分为若干个层次(0~N),各个层次之间的调用关系是单向的,即某一层次上的代码只能调用比它低层的代码。分层结构要求在每个层次上都要提供一组API接口函数,增加了系统的额外开销,但系统的开发和维护较为简单。典型代表有MS-DOS,其结构就是一个有代表性
的、组织良好的分层结构。(3)微内核结构微内核(microkernel)结构把操作系统的大部分功能都剥离出去,在内核中只保留最核心的功能单元(如进程管理和存储管理),大部分的系统功能都位于内核之外,例如,将所有的设备驱动程序
都被置于内核之外,如图8.2.3所示。在微内核操作系统中,大部分的系统功能被放置在内核之外,客户单元和服务器单元的内存地址空间是相互独立的,系统具有更高的安全性。新的功能组件也可以被动态地添加进来,扩展、调试、移植方便。在
微内核操作系统中,核内组件与核外组件之间的通信方式是消息传递,而不是直接的函数调用,运行速度可能会慢一些。另外,由于它们的内存地址空间是相互独立的,在切换的时候,也会增加额外的开销。OS-9、CEx
ecutive、VxWorks,CMX-RTX、NucleusPlus和QNX等EOS采用的都是微内核结构。图8.2.3微内核结构8.2.3常见的嵌入式操作系统简介嵌入式操作系统是操作系统研究领域中的一个重要分支,有许多公司在从事相关方面的研究,
开发了数以百计的各具特色的嵌入式操作系统产品,其中比较有影响的系统有VxWorks、嵌入式Linux、WindowsCE、µC/OS-II和PalmOS等。1.VxWorks美国WindRiverSys
tem公司开发的嵌入式实时操作系统VxWorks采用基于微内核的体系结构,整个系统由四百多个相对独立、短小精练的目标模块组成,用户可以根据自己的需要选择适当的模块,进行裁减和配置。VxWorks采用GNU类型的编译和调试器,专有的API函数,支持x86、MotorolaMC68xxx、Col
dfire、PowerPC、MIPS、ARM、i960等主流的32位处理器,具有良好的可靠性和卓越的实时性,是目前嵌入式系统领域中使用最广泛、市场占有率最高的商业系统之一。在VxWorks操作系统中,主要包含有实时微内核Wind、I/O处理系统、文件系统
、网络处理模块、虚拟内存模块VxVMI、板级支持包BSP等功能模块。其中:实时微内核Wind包括基于优先级的任务调度、任务间的通信、同步和互斥、中断处理、定时器和内存管理机制等功能。与ANSIC兼容
的I/O系统包括UNIX标准的缓冲I/O和POSIX标准的异步I/O。文件系统主要包括与MS-DOS兼容的文件系统、与RT-11兼容的文件系统、RawDisk文件系统和SCSI磁带设备。网络处理模块能与如TCP/IP、NFS、UDP、SNMP、FTP等许多运行其他协
议的网络进行通信。虚拟内存模块VxVMI主要用于对指定内存区的保护,以加强系统的安全性。板级支持包BSP由初始化和驱动程序两部分组成,用来管理硬件的功能模块,对各种板卡的硬件功能提供统一的接口。2.嵌入式Linux嵌入式Linux(EmbeddedL
inux)是指对标准Linux进行小型化剪裁处理之后,可固化在存储器或单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。常见的嵌入式Linux有μClinux、RT-Linux、Embedix和HardHatLinux等,具有如下特点:
●具有高性能、可裁剪的内核,其独特的模块机制使用户可以根据自己的需要,实时地将某些模块插入到内核或从内核中移走,很适合于嵌入式系统的小型化的需要。●具有完善的网络通信和文件管理机制,支持所有标准的Internet网
络协议,支持ext2,fat16,fat32,romfs等文件系统。●可提供完整的工具链(ToolChain),利用GNU的gcc做编译器,用gdb,kgdb,xgdb做调试工具,能够方便地实现从操作系统到应用软件各个级别的调试。●嵌入式Linux是开放源码的
自由操作系统,用户可以根据自己的应用需要方便地对内核进行修改和优化。●支持x86、ARM、MIPS、Alpha、PowerPC等多种体系结构,支持各种主流硬件设备和最新硬件技术。●几乎每一种通用程序在Linux上都能找到,具有丰
富的软件资源。●μClinux主要针对没有MMU的微处理器;RT-Linux是最早实现硬实时支持的Linux版本;Embedix采用模块化的设计方案,方便系统剪裁;HardHatLinux是一个嵌入式实时系统,可以针对硬件环境进行配置,以获得
最佳的性能和最小的容量。3.WindowsCEWindowsCE是一个基于优先级的多任务嵌入式操作系统,提供了256个优先级别,基本内核需要至少200KB的ROM,支持Win32API子集、支持多种用户界面硬件、支持多种串行和网络通信技术。W
indowsCE不是一个硬实时系统。WindowsCE主要包含内核模块、内核系统调用接口模块、文件系统模块、图形窗口和事件子系统模块和通信模块五个功能模块。其中:内核模块支持进程和线程处理及内存管理等基本服务。内核系统调用接口模块允许应用软件访问操作系统提供的服务。文件系统模块支持DO
S等格式的文件系统。图形窗口和事件子系统模块控制图形显示,并提供WindowsGUI图形界面。通信模块允许同其他的设备进行信息交换。WindowsCE操作系统集成了大量的WindowsXPProfessional的特性,能提供与PC机类似的桌面、任务栏、窗
口、图标、控件等图形界面和各种应用程序。熟悉Windows操作系统的用户可以很快地使用基于WindowsCE的嵌入式设备。另外,微软公司提供了VisualStudio.NET、EmbeddedVisualC++、Embe
ddedVisualBasic等一组功能强大的应用程序开发工具,专门用于对WindowsCE操作系统的开发。4.C/OS-IIC/OS-II是一种免费、开放源代码、结构小巧、基于可抢占优先级调度的实时操作系统,其内核提供任务调度与管理、时间管理、任务间同步与通信、内存
管理和中断服务等功能。名称C/OS-II来源于术语Micro-ControllerOperatingSystem(微控制器操作系统),它通常也称为MUCOS或者UCOS。C/OS-II内核在2KB~10KB数量级,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,主
要面向中小型嵌入式系统。μC/OS-II内核提供最基本的系统服务,例如信号量、邮箱、消息队列、内存管理、中断管理等。μC/OS-II内核本身并不支持文件系统,但它具有良好的扩展性能,可以根据需要自行加入。C/OS-II具有良好的可移植性。C/OS-II的大部分代码都是用C语言
写成的,只有与处理器的硬件相关的一部分代码采用汇编语言编写。C/OS-II并不是一个商业实时操作系统,但C/OS-II的稳定性和实用性却被数百个商业级的应用所验证,C/OS-II不已在众多的商业领域中
获得了广泛的应用。C/OS-II支持ARM、PowerPC、MIPS、68k/ColdFire和x86等多种体系结构。8.3嵌入式系统的任务管理8.3.1单道程序设计和多道程序设计嵌入式操作系统可以分为单道程序
设计和多道程序设计(mufti-programming)两种类型。1.单道程序设计类型采用单道程序设计的操作系统在任何时候只能有一个程序在运行。例如:有两个程序甲和乙,它们在运行过程中都要用到CPU和I/O设备。如图8.3.1所示,图中我
们采用不同的方框来表示这两个程序对两种资源的使用情况,方框的长度表示使用的时间。在单道程序设计的环境下,在任何时候,系统中只能有一个程序在运行,因此,甲和乙这两个程序只能一个接一个的执行。如图8.3.1所示,首先执行程序甲,从t0时刻开始,到t6时刻结束。然后再执
行程序乙,从t6时刻开始,一直到它所有的工作都已完成。2.多道程序设计类型采用多道程序设计的操作系统允许多个程序同时存在并运行,采用多道程序技术可以有效提高系统资源的利用率。在多道程序设计的环境下,允许多个程序同时运行,当一个程序在访问I/O设
备时,会主动把CPU交出来,让另一个程序去运行,从而提高系统资源的使用效率。如图8.3.1所示,从t0到t1,甲在使用I/O设备,乙处于等待状态。在到达了t1时刻后,甲释放刚刚占用的I/O设备,交给程序乙去使
用。因此,在t1到t2期间,程序甲在使用CPU,程序乙在使用I/O设备。在到达t2时刻后,乙释放刚刚占用的I/O设备,交给程序甲去使用。因此,在t2到t3期间,甲和乙两个程序相互交换资源,继续执行。同样的情形也发生在t3时刻和t4时刻。但是在t5时刻,甲已经使用完了
I/O设备,而乙仍然在使用CPU,所以甲只能处于等待状态,等到t6时刻再交换资源。这样一直进行下去,在t7时刻,甲执行完毕,在t8时刻,乙也执行完毕。从图8.3.1可见,由于CPU和I/O设备的使用是并行进行的,在总的执行时间上要明显少于单道
程序系统。图8.3.1单道程序与多道程序的运行过程8.3.2进程、线程和任务1.进程进程(process)是在描述多道系统中并发活动过程引入的一个概念。进程和程序是两个既有联系又有区别的概念,两者不能混为一谈。例如:一个程序主要由代码和数据两部分内容组
成。而进程是正在执行的程序,它是由程序和该程序的运行上下文两部分内容组成。程序是静态的,而进程是一个动态的,变化的。进程和程序之间并不是一一对应的。一个进程在运行的时候可以启动一个或多个程序,同一个程序也可能由多个进程同时执行
。程序可以以文件的形式存放在硬盘或光盘上,作为一种软件资源长期保存。而进程则是一次执行过程,它是暂时的,是动态地产生和终止的。一个进程通常包含有以下几个方面的内容:相应的程序:进程是一个正在运行的
程序,有相应程序的代码和数据。CPU上下文:程序在运行时,CPU中含有PC(ProgramCounter,程序计数器)、PSW(ProgramStatusWord,程序状态字)、通用寄存器、段寄存器、栈指针寄存器等各种寄存器的当前值
内容,例如:在PC中记录的将要取出的指令的地址,在PSW中用于记录处理器的运行状态信息,通用寄存器存放的数据或地址;段寄存器存放的程序中各个段的地址;栈指针寄存器记录的栈顶的当前位置。一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地
址空间、进程正在使用的文件等。总而言之,进程包含了正在运行的一个程序的所有状态信息。进程具有动态性,进程是一个正在运行的程序,程序的运行状态都在不断地变化,如PC寄存器的值、堆和栈的内容、通用寄存器存放数据和地址等。进程具有独立性,一个进程是一个独立
的实体,占有计算机的系统资源,每个进程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进程。进程具有并发性,在系统中同时有多个进程存在,它们相互独立地运行。2.线程线程(thread)是一个比进程更小的能独立运行的基本单位。所谓的线程,就是进程当中的一
条执行流程。从资源组合的角度来看,进程把一组相关的资源组合起来,构成了一个资源平台(资源环境),其中包括运行上下文、内存地址空间、打开的文件等,在图8.3.2中用深色的方框来表示。从程序运行的角度来看,进程就是一个正在运行的程序,在图8.
3.2中用一条带有箭头的线段来表示。从图8.3.2可见,可以把进程看成是程序代码在这个资源平台上的一条执行流程(线程),也就是可以认为进程等于线程加上资源平台。如图8.3.2所示,在一个进程当中,或者说在一个资源平台上,可以同时存在多个线程。可以用线程来作
为CPU的基本调度单位,使得各个线程之间可以并发执行。对于同一个进程当中的各个线程来说,运行在相同的资源平台上,可以共享该进程的大部分资源(如内存地址空间、代码、数据、文件等),但也有一小部分资源是不能共享的,每个线程都
必须拥有各自独立的一份(如CPU运行上下文(如PC寄存器、PSW寄存器、通用寄存器和栈指针等)和栈)。图8.3.2线程与进程的资源关系3.任务在一些嵌入式系统中,把能够独立运行的实体称为“任务”(task),并没有使用“进程”或“线程”这两个概念。任务到底是进程
还是线程,在研究一个具体的嵌入式操作系统的时候,要注意加以区分。在任务的创建过程需要定义的主要参数有任务的优先级、栈空间的大小和函数名。任务具有独立的优先级和栈空间,CPU上下文一般也是存放在栈空间
中。对于不同的任务,它们也能够访问相同的全局变量,在这些任务之间,可以很方便地、直接地去使用共享的内存,而不需要经过系统内核来进行通信。通常认为,在嵌入式操作系统中“任务”就是线程,如在VxWorks、
µC/OS-II、Jbed、嵌入式Linux等嵌入式操作系统中。8.3.3任务的实现1.任务的层次结构任务的层次结构如图8.3.3所示。在多道程序的嵌入式操作系统中,同时存在着多个任务,嵌入式内核启动时,只有
一个任务存在,然后由该任务派生出其他所有任务,这些任务采用层状结构,存在着父子关系。图8.3.3任务的层次结构2.任务的创建与终止(1)任务的创建在一个嵌入式操作系统中,在系统初始化、任务运行过程中、人机交互等过程中都可以创建任务。在系统初始
化时,一般都会创建系统与用户进行交互的一些前台任务,以及完成键盘扫描、系统状态检测、时间统计等一些特定功能的后台任务。在任务运行过程中,也能够使用相应的系统调用来创建新的任务,以帮助它完成自己的工作。在一些具有交互功能的嵌入式系统中,用户可以通过输入命
令或单击图标的方式,让系统启动一个新的任务。创建任务的基本方法是在一个已经存在的任务当中,通过调用相应的系统函数来创建一个新的任务。在嵌入式操作系统当中,任务的创建主要采用fork/exec和spawn两种模型。fork/exec模型源于IEEE/I
SOPOSIX1003.1标准,而spawn模型是从它派生出来的。两种模型创建任务的过程非常相似,包括为新任务分配相应的数据结构,存放各种管理信息,分配内存空间,存放任务的代码和数据。当这个新任务准备就绪后,就可以启动它运行了。在fork/exec模型,首先调
用fork函数为新任务创建一份与父任务完全相同的内存空间,然后再调用exec函数装入新任务的代码,并用它来覆盖原有的属于父任务的内容。对于新创建的子任务来说,它可以从父任务那里继承代码、数据等各种属性。而spawn模型在创建新任务的时,直接为
它分配一个全新的地址空间,然后将新任务的代码装入并运行。(2)任务的终止任务的终止可能有多种原因,正常退出、错误退出、被其他任务踢出等情况可以使任务终止。当一个任务完成了所有的工作,需要结束运行,提出退出要求,称为正常退出。当一个任务在执行
过程中,出现了致命的错误(例如执行了非法指令、内存访问错误等),系统中止该任务的运行,强制性地让该任务退出,称为错误退出。在一些操作系统中可以提供一些系统调用函数,用来把一个任务从系统中清除出局,称为被其他任务踢出。在一些嵌入式系统中
,某些任务被设计为“死循环”的模式,任务不会自行终止。3.任务的状态在多道程序系统中,任务是独立运行的实体,需要竞争系统资源,而任务所拥有的资源是在不断变化中的,使得任务的状态也在不断的变化。一般来说,任务具有运行(running)、就绪(ready)和阻
塞(blocked)三种基本状态。任务在运行状态时占有CPU并在CPU上运行,在任何一个时刻,处于运行状态的任务个数必须小于或等于CPU的数目。如果在一个系统中只有一个CPU的话,那么最多只能有一个任务处于运行状态。当一个任务
已具备运行条件,但由于CPU正在运行其他的任务,暂时不能运行该任务时,称为就绪状态。不过,只要把CPU分给该任务,它就能够立刻执行。任务因为正在等待某种事件的发生而暂时不能运行称为阻塞状态,也叫等待状态(waiting)。此时,即使CPU已经空
闲下来了,该任务也还是不能运行。如图8.3.4所示,在一定条件下,任务会在不同的状态之间来回转换,存在运行→阻塞、运行→就绪、就绪→运行、阻塞→就绪四种转换关系。图8.3.4任务间的状态转换图4.任务控制
块TCB(TaskControlBlock,任务控制块)是在操作系统当中用来描述和管理一个任务的数据结构。通过对各个任务的TCB的操作来实现任务管理。利用TCB这个数据结构可以描述任务的基本情况,以及它的运行变化过程。可以把TCB看成
是任务存在的唯一标志。当需要创建一个新任务的时候,就为它生成一个TCB,并初始化这个TCB的内容;当需要终止一个任务的时候,只要回收它的TCB即可。对任务的组织和管理可以通过对它们的TCB的组织和管理来实现。TCB主要包括任务的管理信息、CPU
上下文信息、资源管理信息等内容。(1)任务的管理信息任务的管理信息包括任务的标识ID、任务的状态、任务的优先级、任务的调度信息、任务的时间统计信息、各种队列指针等。(2)CPU上下文信息CPU上下文信息包括通用寄存器、PC寄存器、程序状态字、栈指针等各种C
PU寄存器的当前值。在实际的嵌入式系统中,CPU上下文信息不一定直接存放在TCB当中,而是存放在任务的栈当中,可以通过相应的栈指针来访问。(3)资源管理信息在操作系统中,任务表示的是进程,则还应包含一些资源管理方面的
信息,如段表地址、页表地址等存储管理方面的信息,根目录、文件描述字等文件管理方面的信息。5.任务切换任务切换(contextswitching)是指一个任务正在CPU上运行,由于某种原因,系统需要调度另一个任务去运行,那么这时就需要进行把当前任务的运行上下文保存起来,并设
置新任务的上下文,这一过程称为任务切换。任务切换通常包含有以下几个基本步骤:(1)将处理器的运行上下文保存在当前任务的TCB中;(2)更新当前任务的状态,从运行状态变为就绪状态或阻塞状态。(3)按照一定的策略,从所有处于就绪状态的任务中选择一个去运行。(4)修改新任务
的状态,从就绪状态变成运行状态。(5)根据新任务的TCB的内容,恢复它的运行上下文环境。6.任务队列在一个多任务的操作系统中,各个任务的状态是经常变化的,有时处于运行状态,有时处于就绪状态,有时又处于阻
塞状态。通常采用任务队列的方式来组织它的所有任务,以提高对这些任务的管理效率。操作系统用一组队列来表示系统当中所有任务的当前状态。例如,处于运行状态的所有任务构成了运行队列,处于就绪状态的所有任务构成了就绪队列
,而对于处于阻塞状态的任务,则要根据它们阻塞的原因,分别构成相应的阻塞队列。不同的状态用不同的队列来表示。然后,对于系统当中的每一个任务,根据它的状态把它的TCB加入到相应的队列当中去。如果一个任务的状态发生变化
,就要把它的TCB从一个状态队列中脱离出来,加入到另一个队列当中去。8.3.4任务的调度1.任务调度概述在多道程序操作系统中,当有两个或多个任务同时处于就绪状态时,而系统中只有一个CPU而且这个C
PU己经空闲下来了,就会出现多个任务同时去竞争这个CPU的情况。通常利用调度器(scheduler)选择就绪队列中的那些任务中的一个去运行,调度器是CPU这个资源的管理者。调度器在决策过程中所采用的算法称为调度算法。一般来说,在一个新的任务被创建时
、在一个任务运行结束时、在一个任务由于I/O操作、信号量或其他原因被阻塞时、在一个I/O中断发生时、在一个时钟中断发生时这五种调度时机都可能会发生任务的调度。任务调度存在可抢占调度(preemptive)和不可抢
占调度(nonpreemptive)两种调度方式。(1)在可抢占调度方式,当一个任务正在运行的时候,出现调度时机当中的五种情况之一,都有可能会发生调度。调度程序可以去打断它,并安排另外的任务去运行。实时操作系统大都采用可抢占的调度
方式。(2)在不可抢占调度方式,一个任务长时间地占用着CPU系统也不会强制它中止。当出现新任务创建、任务运行结束及任务被阻塞的调度时机时,有可能会发生调度。而对于发生的各种中断,并不会去调用调度程序,而是在中断处理完成后,
又会回到刚才被打断的任务中继续执行。在嵌入式操作系统中,存在着许多的调度算法,每一种算法都有各自的优点和缺点。可以根据响应时间、周转时间、调度开销、公平性、均衡性、吞吐量等指标来评价一个调度算法的好坏。其中:●调度器为一个就绪任务进
行上下文切换时所需的时间,以及任务在就绪队列中的等待时间称为响应时间(responsetime)。●一个任务从提交到完成所经历的时间称为周转时间(turnaroundtime)。●调度器在做出调度决策时所需要的时间和空间开销称为调度开销(overhe
ad)。●公平性(fairness)是指大致相当的两个任务所得到的CPU时间也应该是大致相同的。另外,要防止饥饿(starvation)情况出现,即某一个任务始终得不到处理器去运行。●均衡性(balance)
是指要尽可能使整个系统的各个部分(CPU,I/O)都忙起来,提高系统资源的使用效率。●单位时间内完成的任务数量称为吞吐量(throughput)。对于一个调度算法来说,这些指标中一些是共存的,而另一些是相
互牵制的,这些指标不可能全部都实现,而是需要根据系统的要求,综合权衡和折中选择。2.先来先服务算法(FirstComeFirstServed,FCFS)FCFS(FirstComeFirstServed,先来先服务算法)是一种最简单的调度算法。FCFS的基本思想就是
按照任务到达的先后次序来进行调度,它是一种不可抢占的调度方式。FCFS也叫做FIFO(FirstInFirstOut,先进先出算法)。FCFS的最大优点就是简单,易于理解也易于实现。缺点是一批任务的平均周转时间取决于各个任务到达的顺序,如果短任务位于长任务之后,那么将增大平均周转时间。3.短作
业优先算法(ShortestJobFirst,SJF)在SJF(ShortestJobFirst,短作业优先算法)中,在各个任务在开始执行前,事先预计好各任务的执行时间,调度算法根据这些预计时间,安排执行时间较短的任务优先执行。可以证明,对于一批同时到达的任务,采用SJF算法将得到一个最小
的平均周转时间。SJF算法有不可抢占方式和可抢占方式两种实现方案。在不可抢占方式,只有任务运行完毕或者是被阻塞时,才会让出CPU进行新的调度。而在可抢占方式,当前任务正在运行的时候,来了一个比它执行时间更短的任务,而且它的运行时间要小于当前正在运行的任务的剩余时间,那么这个新
任务就会抢占CPU去运行。这种方法也称为SRTF(ShortestRemainingTimeFirst,最短剩余时间优先算法)不可抢占的SJF算法如图8.3.5所示,由于任务T3的执行时间最短,所以首先被调度运行,其次是T1和T2。图8.3.5SJF算法示
意图4.时间片轮转算法(RoundRobin,RR)RR算法如图8.3.6所示。在RR(RoundRobin,时间片轮转算法)中,把系统当中的所有就绪任务按照先来先服务的原则进行排列,然后,在每次调度的时候,处理
器分派给队列当中的第一个任务一小段CPU执行时间(timeslice,时间片)。当这个时间片结束的时候,如果任务还没有执行完的话,将会发生时钟中断,调度器将会暂停当前任务的执行,并把这个任务送到就绪队列的末尾,然后再执行当前的队列的第一个任务。如
果一个任务在分配给它的时间片结束前就已经运行结束了或者是被阻塞了,那么它就会立即让出CPU给其他的任务。采用RR算法,各个就绪任务平均地分配CPU的使用时间,例如有n个就绪任务,那么每个任务将得到1/n的CPU时间。采用RR
算法时,时间片q既不能太大,也不能太小。q太大,每个任务都在一个时间片内完成,这就失去了RR算法的意义。如果q太小,每个任务都需要更多的时间片才能运行完,增加了在任务之间的切换次数,增大了系统的管理开销,降低了CPU的使用效率。图
8.3.6RR算法示意图5.优先级算法(priority)在优先级调度算法(priority)中,给每一个任务都设置一个优先级,然后在任务调度的时候,在所有处于就绪状态的任务中选择优先级最高的那个任务去运行。例如,在短作业优先算法中,以时间为优先级,运行时间越短,优先级越高。优先级
算法可以分为可抢占和不可抢占两种方式。在可抢占方式中,当一个任务正在运行的时候,如果这时来了一个新的任务,其优先级更高,则立即抢占CPU去运行这个新任务。而不可抢占方式则是需要等当前任务运行完后再决定。可以采用静态方式和动态方式确定任务的优先级。静态优先级方式根据任务的类型或重要性,在创
建任务的时候就确定任务的优先级,并且一直保持不变直到任务结束。动态优先级方式在创建任务的时候确定任务的优先级,但是该优先级可以在任务的运行过程中动态改变,以便获得更好的调度性能。动态优先级方式可以克服在静态优先级方式中高优
先级的任务一直占用着CPU,而那些低优先级的任务可能会长时间地得不到CPU的情况。在优先级算法中,对于优先级相同的两个任务,通常是把任务按照不同的优先级进行分组,然后在不同组的任务之间使用优先级算法,而在同一组的各个任务之间使用时间片轮转法。8.3.5实
时系统调度许多嵌入式操作系统都是实时操作系统(RTOS),实时系统的调度追求的是实时性,RTOS调度器要让每个任务都在其最终时间期限(deadline)之前完成,而各任务之间的公平性并不是最重要的指标。RTOS调度器多采用基于优先级的可抢占调度算法。
1.RTOS任务模型RTOS任务模型如图8.3.7所示,在RTOS任务模型中,每一个任务用一个三元组来表示(执行时间、周期、时间期限)。其中:执行时间(executiontime)E(i)是指对于第i个任务,当它所需要的资源都己具备时,它的执行所需要的最
长时间。周期(period)P(i)是指第i个任务的连续两次运行之间的最小时间间隔。时间期限(deadline)是指D(i)第i个任务所允许的最大响应时间(从任务启动到运行结束所需的时间)。一般来说,一个任务的周期时间同时也是它的时间期限,因为该任务必须在它的下一个周期开始
之前,完成此次运行。启动时间t(i)是指第i个任务的第i次执行的开始时间。图8.3.7RTOS任务模型2.单调速率调度算法(RateMonotonicScheduling,RMS)RMS(RateMo
notonicScheduling,单调速率调度算法)是一种静态优先级调度算法。RMS算法假设:所有的任务都是周期性任务;任务的时间期限等于它的周期;任务在每个周期内的执行时间是一个常量;任务之间不进行通信
,也不需要同步;任务可以在任何位置被抢占,不存在临界区的问题。RMS算法的基本思路是任务的优先级与它的周期表现为单调函数的关系,任务的周期越短,优先级越高;任务的周期越长,优先级越低。RMS算法是一种最优调度算法。如果存在一种基于静态优先级的调度顺序,使得每个任务都能在其期
限时间内完成,那么RMS算法总能找到这样的一种可行的调度方案。在任务比较多的情况下,RMS可调度的CPU使用率上限为ln2=0.69,CPU使用率如此低,对于大多数系统来说是不可接受的。另外,在一个实际的系统中
,任务之间通常都需要进行通信和同步。3.最早期限优先算法(EarliestDeadlineFirst,EDF)EDF(EarliestDeadlineFirst,最早期限优先)调度算法是一种动态优先级调度算法。EDF算法的基本思路是:
根据任务的截止时间来确定其优先级,对于时间期限最近的任务,分配最高的优先级。当有一个新的任务处于就绪状态时,各个任务的优先级就有可能要进行调整。EDF算法假设条件除了它不要求系统中的任务都必须是周期任务外,其他的假设条件与RMS相同。EDF算法可调度上限为100%。对于
给定的一组任务,只要它们的CPU使用率小于或等于1,EDF就能找到合适的调度顺序,使得每个任务都能在自己的时间期限内完成。8.4嵌入式系统的存储管理8.4.1嵌入式存储管理方式的特点嵌入式系统的存储管理方式与系统的实际应用领域及硬件环境密切相关,不同的嵌入式系统
采用不同的存储管理方式,需要考虑硬件条件、实时性要求、系统规模、可靠性要求等因素。系统的实时性要求直接影响到存储管理的实现方式,为了确保系统的实时性,快速和确定是内存管理的基本要求,即在存储管理方面的开销不能太大,对于每一项工作都要有明确的实时约束,即必须在某个限
定的时刻之前完成。在实时系统中,存储管理方法就比较简单,甚至不提供存储管理功能。而对一些实时性要求不高,可靠性要求比较高、比较复杂的应用系统,需要实现对操作系统或任务的保护,在存储管理方式上就相对较为复杂。在嵌入式微处理器中,MMU(MemoryManagementUnit,存储管
理单元)提供了一种内存保护的硬件机制。内存保护用来防止地址越界和防止操作越权。采用内存保护机制的每个应用程序都有自己独立的地址空间,当一个应用程序要访问某个内存单元时,由硬件检查该地址是否在限定的地址空间内,如果不是的话就要进行地址越界处理;二是防对于允许多个应用程序共享的某块存
储区域,每个应用程序都有自己的访问权限,如果违反了权限规定,则要进行操作越权处理。操作系统通常利用MMU来实现系统内核与应用程序的隔离,以及应用程序与应用程序之间的隔离。防止应用程序去破坏操作系统和其他应用程序的代码和数据,防止应用程序对硬件的直接访问。MMU通常只在一些对安全性和
可靠性的要求比较高、系统比较复杂的嵌入式系统中存在。8.4.2存储管理的实模式与保护模式实模式和保护模式是嵌入式操作系统中常见的两个存储管理方式。1.实模式存储管理在实模式存储管理方式中,系统不使
用MMU;不划分“系统空间”和“用户空间”,整个系统只有一个地址空间,即物理内存地址空间;应用程序和系统程序都能直接对所有的内存单元进行随意访问,无须进行地址映射;操作系统的内核与外围应用程序在编译连接后,
两者通常被集成在同一个系统文件中;系统中的“任务”或“进程”均是内核线程,只有运行上下文和栈是独享的,其他资源都是共享的。在实模式存储管理方式中,系统的内存地址空间一般可以分为text、data、bss、堆、栈五个部
分。其中:.text:(代码段)用来存放操作系统和应用程序的所有代码。.data:(数据段)用来存放操作系统和应用程序当中所有带有初始值的全局变量。.bss:用来存放操作系统和应用程序当中所有未带初始值的全局变量。堆为动态分配的内存空间,在系统运行时,可以通过类似于malloc/free之类的
函数来申请或释放一段连续的内存空间。栈用来保存运行上下文以及函数调用时的局部变量和运行参数。对于实时系统来说,实模式方案简单、存储管理的开销确定,比较适合于规模较小、简单和实时性要求较高的系统。其缺点
是没有存储保护、安全性差,在应用程序中出现的任何一个小错误或蓄意攻击都有可能导致整个系统的崩溃。2.保护模式存储管理在保护模式存储管理方式中,微处理器必须具有MMU硬件并启用它。在保护模式存储管理方式中,系统内核和用户程序有各自独立的地址空间,操作系统和MMU共同完成逻辑地址到物理地址
的映射;每个应用程序只能访问自己的地址空间,对于共享的内存区域,也必须按照规定的权限规则来访问,具有存储保护功能。保护模式存储管理方式的安全性和可靠性较好,适合于规模较大、较复杂和实时性要求不太高的
系统。8.4.3分区存储管理分区存储管理适合在多道程序操作系统中应用。分区存储管理把整个内存划分为系统区和用户区两大区域,然后再把用户区划分为若干个分区,可以同时有多个任务在系统中运行,每个任务都有各自的地址空间。分区存储管理又可以分为固定分区和可变分区两类。1.固定分区存储管理
采用固定分区存储管理方法时,各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改了。为了满足不同程序的存储需要,各个分区的大小可以是相等的,也可以是不相等的。固定分区存储管理方法的优点是易于实现,系统的开
销比较小,空闲空间的管理、内存的分配和回收算法都非常简单。其缺点是内存的利用率不高,在任务所占用的分区内部未被利用的空间的碎片(内碎片)会造成很大的浪费;分区的总数是固定的,限制了并行执行的程序个数,N个分区最多
只能有N个任务在同时运行。2.可变分区存储管理采用可变分区存储管理方法时,各分区不是预先划分好的固定区域,而是系统动态创建的。在系统生成后,操作系统会占用内存的一部分空间,通常放在内存地址的最低端,其余的空间则成为一个完整的大空闲区。在装入一个程序时,
系统将根据它的需求和内存空间的使用情况,从这个空闲区当中划出一块来,分配给它,当程序运行结束后会释放所占用的存储区域。系统通过对内存的分配和回收,将一个完整的空闲区划分成若干个占用区和空闲区。与固定分区相比,可变分区存储管理的分区的个数、位置
和大小都是随着任务的进出而动态变化的,非常灵活。每个分区都是按需分配的,分区的大小正好等于任务的大小。这样就避免了在固定分区当中由于分区的大小不当所造成的内碎片,从而提高了内存的利用效率。但可变分区存储管理也可能会
存在外碎片。所谓的外碎片,就是在各个占用的分区之间,难以利用的一些空闲分区。外碎片通常是一些比较小的空闲分区。在具体实现可变分区存储管理技术的时候,需要考虑内存管理的数据结构、内存的分配算法以及内存的回收算法三个方面的问题。在内存管理的数据结构上
,系统会维护一个分区链表,来跟踪记录每一个内存分区的情况,包括该分区的状态(已分配或空闲)、起始地址、长度等信息。在内存的分配算法上,当一个新任务来到时,需要为它寻找一个空闲分区,其大小必须大于或等于该任务的要求。若是大于要求,则将该分区分割成两个小分区,其中一个分区为要求的大小并
标记为“占用”,另一个分区为余下部分并标记为“空闲”。选择分区的先后次序一般是从内存低端到高端。通常的分区分配算法有:最先匹配法(first-fit)、下次匹配法(next-fit)、最佳匹配法(best-fit)和最坏匹配法(worst-fit)。在内存的回收算法上,当一个任务运行结
束,并释放它所占用的分区后,如果该分区的左右邻居也是空闲分区,则需要将它们合并为一个大的空闲分区。与此相对应,在分区链表上,也要将相应的链接节点进行合并,并对其内容进行更新。8.4.4地址映射1.物理地址和逻辑地址地址映射涉及到物
理地址和逻辑地址两个基本概念。(1)物理地址(physicaladdress)物理地址也叫内存地址、绝对地址或实地址。将系统内存分割成很多个大小相等的存储单元,如字节或字,每个单元给它一个编号,这个编号就称为物理地址。操作时只有通过物理地址,才能对内存单元进行直
接访问。物理地址的集合就称为物理地址空间,或者内存地址空间。物理地址是一个一维的线性空间,例如,一个内存的大小为256MB,那么它的内存地址空间是从0x0到0x0FFFFFFF。(2)逻辑地址(logicaladdress)逻辑地址也叫相对地址
或虚地址。用户的程序经过汇编或编译后形成目标代码,而这些目标代码通常采用的就是相对地址的形式,其首地址为0,其余指令中的地址都是相对于这个首地址来编址的。显然,逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。因此,为了保证CPU在执行指令时可以正确地访问存储单元,系统在
装入一个用户程序后,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这个过程就称为地址映射。只有把程序当中的逻辑地址转换为物理地址,才能正常运行。2.地址映射方式地址映射是由存储管理
单元MMU来完成的。当一条指令在CPU当中执行时,在需要访问内存时,CPU就发送一个逻辑地址给MMU,MMU负责把这个逻辑地址转换为相应的物理地址,并根据这个物理地址去访问内存。地址映射主要有静态地址映射和动态地址映射两种方式。(1)
静态地址映射用户程序在装入之前,代码内部使用的是逻辑地址。采用静态地址映射方式时,当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。在具体实现时,在每一个可执行文件中,要列出各个需要重定位的地址单元的位置,然后由一个加载程序来完成装入及地址转换的过程,
将所有的逻辑地址都转换成了物理地址。程序一旦装入到内存以后,就不能再移动了。(2)动态地址映射采用动态地址映射方式时,当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地
址转换。地址转换一般是由硬件的地址映射机制来完成的,通常的做法是设置一个基地址寄存器(或者叫重定位寄存器),当一个任务被调度运行时,就把它所在分区的起始地址装入到这个寄存器中。然后,在程序的运行过程中,当需要访问某个内存
单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器当中的内容,从而得到实际的物理地址,并按照这个物理地址去执行。8.4.5页式存储管理与分区存储管理方式不同,页式存储管理方式打破存储分配的连续性,一个程序的逻辑地址空间可以
分布在若干个离散的内存块上,以达到充分利用内存,提高内存利用率的目的。在页式存储管理方式中,一方面,把物理内存划分为许多个固定大小的内存块,称为物理页面(physicalpage),或页框(pageframe)。另一方面,把逻辑地址空间也划分为大小相同的块,称为逻辑页面(logicalpag
e)或简称为页面(page)。页面的大小为2n,一般在512个字节到8KB之间。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域中,而是以页面为单位来进行分配的。对于一个大小为N个页面的程序,需要有N个空闲的物理页面,这些物理页面可以是不连续的。在实现页式存储管理时,
需要解决数据结构、内存的分配与回收、地址映射等问题。1.数据结构在页式存储管理中,最主要的数据结构有页表(pagetable)和物理页面表两个。页表给出了任务的逻辑页面号与内存中的物理页面号之间的对应关系。物理页面表用来描述内存空间当中,各个物理页面的使
用分配状况。物理页面表可以采用位示图或空闲页面链表等方法来实现。2.内存的分配与回收当一个任务到来时,需要考虑如何给它分配内存空间?当一个任务运行结束后,需要考虑如何来回收它所占用的内存空间?内存的分配与回收算法与物理页面表的实现方法是密切相关的。当
一个任务到来时,首先需要计算它所需要的页面数N,查询是否还有N个空闲的物理页面;如果有足够的空闲物理页面,则需要申请一个页表,其长度为N,并把页表的起始地址填入到该任务的任务控制块TCB当中;然后分配N个空闲
的物理页面并编号,把它们的编号填入到页表中,建立逻辑页面与物理页面之间的对应关系,并对刚刚被占用的那些物理页面进行标记。当一个任务运行结束,释放了它所占用的内存空间后,需要对这些物理页面进行回收。3.地址映射在页式存储管理方式中,当一个任务被加载到内存后,连续的逻辑地址空间被划分
为一个个的逻辑页面,这些逻辑页面被装入到不同的物理页面当中。在这种情况下,为了保证程序能够正确地运行,需要把程序中使用的逻辑地址转换为内存访问时的物理地址,完成地址映射。地址映射是以页面为单位来进行处理的。在进行地址映射时,首先分析逻辑地址,对
于给定的一个逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址;然后进行页表查找,根据逻辑页面号,从页表中找到它所对应的物理页面号;最后进行物理地址合成,根据物理页面号及页内偏移地址,确定最终的
物理地址。应注意的是,采用页式存储管理方式,程序必须全部装入内存,才能够运行。如果一个程序的规模大于当前的空闲空间的总和,那么它就无法运行。操作系统必须为每一个任务都维护一张页表,开销比较大,当简单的页表结构不能满足应用要求时,必须设计出更为复杂的页表结构,
如多级页表结构、哈希页表结构、反置页表等。8.4.6虚拟页式存储管理在操作系统的支持下,MMU还可以提供虚拟存储功能,即使一个任务所需要的内存空间超过了系统所能提供的内存空间,也能够正常运行。虚拟页式存储管理就是在页式存储管理的基础上,增加了请求调页和页面置换的功能。在虚
拟页式存储管理方式中,当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装入部分的页面,就可以启动这个程序去运行。在运行过程中,如果发现要执行的指令或者要访问的数据不在内存当中,就向系统发出缺页中断请求,然后系统在处理这个中断请求时,就会将保存在外存中的相应页面调入
内存,从而使该程序能够继续运行。系统在处理缺页中断时,需要调入新的页面。如果此时内存已满,就要采用某种页面置换算法,从内存中选择某一个页面,把它置换出去。常用的页面置换算法包括:最优页面置换算法(OPT
imal,OPT)、最近最久未使用算法(LeastRecentlyUsed,LRU)、最不常用算法(LeastFrequentlyUsed,LFU)、先进先出算法(FirstInFirstOut,FIFO)和时钟页面置换算法(Cloc
k)。采用虚拟页式存储管理方式,对于每一个页表项来说,除了需要逻辑页面号和与之相对应的物理页面号信息外,还需要增加包括驻留位、保护位、修改位和访问位等信息。8.5输入/输出(I/O)设备管理8.5.1I/O编址在嵌入式系统中
,存在着键盘、触摸屏、液晶显示器、A/D转换器、D/A转换器、控制电机等各种类型的输入/输出(I/O)设备。一个I/O单元通常是由I/O设备本身和设备控制器两个部分组成。I/O设备负责与人、控制对象等打交道。而设备
控制器负责完成I/O设备与主机之间的连接和通信。在每一个设备控制器当中,都会有控制寄存器、状态寄存器和数据寄存器等一些寄存器,用来与CPU进行通信。通过往这些寄存器当中写入不同的值,操作系统就可以命令I/O设备去执行数据发送与接收数据、打开与关闭等各种操作。另外,操作系统也可以通过
读取这些寄存器的内容,来了解这个I/O设备的当前状态。被CPU访问的设备控制器寄存器主要采用I/O独立编址、内存映像编址和混合编址三种编址形式。1.I/O独立编址在I/O独立编址方式中,给设备控制器中的每一个寄存器,分配一个唯一的I/O端口地址,然后采用专门的I/O指令来对这
些端口进行操作。这些端口地址所构成的地址空间是完全独立的,与内存的地址空间没有任何关系,I/O设备不会去占用内存的地址空间。而且在编写程序时,它们的指令形式是不一样的,很容易区分内存访问和I/O端口访问。2.内存映像编址在内存映
像编址方式中,把设备控制器当中的每一个寄存器都映射为一个内存单元,这些内存单元专门用于I/O操作,而不能作为普通的内存单元来使用。端口地址空间与内存地址空间是统一编址的,端口地址空间是内存地址空间的一部分。编程非常
方便,无须专门的I/O指令。3.混合编址混合编址就是把I/O独立编址和内存映像编址两种编址方法混合在一起。对于设备控制器中的寄存器,采用I/O独立编址的方法,每一个寄存器都有一个独立的I/O端口地址;而对于I/O
设备的数据缓冲区,则采用内存映像编址的方法,把I/O设备的数据缓冲区的地址与内存地址统一进行编址,I/O设备的数据缓冲区的地址空间是内存地址空间的一部分。8.5.2I/O控制方式I/O设备的控制方式主要有程序循环检测、中断驱动和直接内存访问三种形式。
1.程序循环检测方式采用程序循环检测方式的I/O设备驱动程序,在进行I/O操作之前,CPU要循环地去检测该I/O设备是否已经就绪。如果是,CPU就向I/O设备控制器发出一条命令,启动这一次的I/O操作。然后,在这个操作的进行过程中,CPU也要
循环地去检测I/O设备的当前状态,看它是否己经完成。在I/O操作的整个过程中,控制I/O设备的所有工作都是由CPU来完成的,一直占用着CPU,非常浪费CPU的时间。程序循环检测方式也称为繁忙等待方式或轮询方式。2.中断驱动方式采用中断驱动方式时,当一个用户任务需要进行I/O操作
时,CPU会去调用一个对应的系统函数,由这个系统函数来启动I/O操作,然后CPU执行调度其他的任务。当所需的I/O操作完成时,相应的I/O设备就会向CPU发出一个中断,如果还有数据需要处理,就再次启动I/O操作。在中断驱
动方式下,数据的每一次读写还是通过CPU来完成,只不过当I/O设备在进行数据处理时,CPU不必在那里等待,而是可以去执行其他任务。3.直接内存访问方式(DMA)在中断驱动的控制方式下,每一次数据读写还是通过CPU来完成,而且每一次处理的数据量很少,频繁的中
断处理需要额外的系统开销,所以也会浪费一些CPU时间。为减少中断的次数,减少中断处理的开销,可以采用直接内存访问(DirectMemoryAccess,DMA)的控制方式。在DMA控制方式中,采用DMA控制器来代替CPU,完成I/O设备与内存之间的数据传送,从而空
出更多的CPU时间,去运行其他的任务。8.5.3I/O软件为了管理好嵌入式系统中的各式各样的I/O设备,在I/O软件上通常采用分层的体系结构,一般来说,可以分中断处理程序、I/O设备驱动程序、设备独立的I/O软件和用户空间的I
/O软件四个层次。其中,低层软件是面向I/O硬件的,与I/O硬件特性密切相关,它把I/O硬件同上层的软件有效隔离开来。而较高层的软件是面向用户的,为用户提供一个友好、清晰、统一的编程接口。1.中断处理程
序中断处理程序与I/O设备驱动程序密切配合,用来完成特定的I/O操作。当一个用户程序需要某种I/O服务时,它会去调用相应的系统函数,而这个函数又会去调用相应的I/O设备驱动程序。然后,在I/O设备驱动程序中启动I/O操作,并且被阻塞起来,直到这个I/O操作完成后,将产生一个中断,并跳转到
相应的中断处理程序。之后在中断处理程序中,将会唤醒被阻塞的I/O设备驱动程序。在中断处理过程中,需要执行保存CPU的运行上下文、为中断服务子程序设置一个运行环境、向中断控制器发出应答信号、执行相应的中断服务子程序等操作,需要一定的时间开销。2.I/O设备驱动程序I/O设备驱动程序是直接
对I/O设备进行控制的软件模块,接收并且去执行来自于上层I/O软件的请求,如读操作、写操作、设备的初始化操作等。上层的I/O软件通过这些抽象的函数接口与I/O设备驱动程序打交道,硬件设备的具体细节被封装在I/O设备驱动程序里面。I/O设备驱动程序与
具体的设备类型密切相关。每一个I/O设备都需要相应的I/O设备驱动程序,而每一个设备驱动程序一般也只能处理一种类型的设备,因为对于不同类型的设备,它们的控制方式是不同的。如果硬件设备发生了变化,只需要更新相应的设备驱动程序即可,不会影响到上层软件对它的使用。3.设备独立的I/O软件设备独
立的I/O软件位于在设备驱动程序的上面,是系统内核的一部分,实现所有设备都需要的一些通用的I/O功能,并向用户级的软件提供一个统一的访问接口。设备独立的I/O软件主要完成设备驱动程序的管理、与设备驱动程序的统一接口、设备命
名、设备保护、缓冲技术、出错报告以及独占设备的分配和释放等功能。I/O系统通常会提供一个统一的调用接口,包含了一些常用的设备操作,如设备初始化、打开设备、关闭设备、读操作、写操作、设备控制等。在I/O设备的命名规则上,可以采用统一命名的方式,然后由设备独立的I/O
软件来负责把设备的符号名映射到相应的设备驱动程序。设备驱动程序的管理通过驱动程序地址表来实现。驱动程序地址表中存放了各个设备驱动程序的入口地址,可以通过此表来实现设备驱动的动态安装与卸载。在实现数据的I/O操作时,为了缓解CPU与外部设备之间速度不匹配的矛盾,提高资源的利
用率,可以在内存当中开辟一个存储空间,作为缓冲区,即采用缓冲技术。当读取I/O设备数据时,不用去访问I/O外设,直接到缓冲区中去查找。同样,在往I/O设备中写入数据时,也是先写到缓冲区中。这样,I/O外设需要用到这些数据时,
可以直接从缓冲区中去取。缓冲技术可以分为单缓冲、双缓冲、多缓冲和环形缓冲等形式。4.用户空间的I/O软件大部分的I/O软件通常都包含在操作系统中,是操作系统的一部分,但也有一小部分的I/O软件,如与
用户程序进行链接的库函数()和完全运行在用户空间当中的程序,它们运行在系统内核之外,称之为用户空间的I/O软件。与用户程序进行链接的库函数在运行时,例如在C语言中与I/O有关的各种库函数,通常是把传给它们的参数再往下传递给相
应的系统函数,然后由后者来完成实际的I/O操作。Spooling(simultaneousperipheraloperationsonline,外围设备联机操作)技术是在多道系统中,一种处理独占设备的方法。它可以把一个独占的设备转变为具有共享特
征的虚拟设备,能够提供高速的虚拟I/O服务,实现对独占设备的共享,从而提高设备的利用率。在多道系统当中,对于一个独占的设备,专门利用Spooling程序来增强该设备的I/O功能。Spooling程序负责与这个独占的I
/O设备进行数据交换,完成实际的I/O操作。同时,应用程序在进行I/O操作时,只同这个Spooling程序交换数据,与Spooling程序当中的缓冲区打交道,从中读出数据或往里写入数据,而不直接对实际
的设备进行I/O操作,即实现虚拟的I/O操作。第8章思考题与习题1.嵌入式软件有哪些特点?可以分为哪几类?2.试分析无操作系统的嵌入式软件和有操作系统的嵌入式软件的同异。3.简述BootLoader的功能。4.简述嵌入式中间件的功能。5.简述嵌入式操作系统(EOS)的概念。6.嵌
入式操作系统(EOS)可以分为哪几类?7.简述VxWorks的功能与特点。8.简述嵌入式Linux的功能与特点。9.简述WindowsCE的功能与特点。10.简述µC/OS-II的功能与特点。11.简述PalmOS的功能与特点。12.试分析
单道程序设计和多道程序设计的功能与特点。13.简述进程、线程和任务基本概念。14.简述任务的创建与终止过程。15.试分析可抢占调度和不可抢占调度的功能与特点。16.试分析FCFS、SJF、RR算法和优先级算法的功能与特点。17.试RMS和EDF的功能与特点
。18.简述嵌入式存储管理方式的特点。19.简述实模式和保护模式的区别。20.简述固定分区存储管理和可变分区存储管理的特点。21.什么是物理地址和逻辑地址?什么是地址映射?22.页式存储管理方式与分区存储管理方式有什么不同?23.虚拟页式存储管理与页式存储管理
有什么不同?24.查阅有关资料,了解OPT、LRU、LFU、FIFO等常用的页面置换算法。25.I/O设备有几种编址形式?各有什么特点。26.程序循环检测、中断驱动和直接内存访问三种I/O设备的控制方式有什么不
同?27.简述I/O软件的体系结构。28.简述中断处理程序、I/O设备驱动程序、设备独立的I/O软件和用户空间的I/O软件的功能。