目录
考点1 嵌入式软件的特点
考点2 嵌入式系统的软件结构
考点3 硬件抽象层与板级支持包
考点4 引导加载程序
考点5 嵌入式系统的设备驱动程序
考点6 实时系统与实时操作系统
考点7 嵌入式操作系统概述
考点8 Linux 内核
考点9 嵌入式 Linux 操作系统
考点10 Android 操作系统
考点11 iOS 操作系统
考点12 μC/OS 操作系统概述
考点13 μC/OS-II的任务及其管理
考点14 μC/OS-II的系统服务
考点15 μC/OS-II应用程序设计
考点16 μC/OS-III操作系统的改进与提高
23考纲
考点1 嵌入式软件的特点
(1)软件与硬件一体化
(2)软件效率要求高,实时性要求高
(3)软件可裁剪
(4)软件安全性和可靠性要求高
(5)软件开发难度大
(6)软件需求多样化
(7)软件产业高度分散
(8)软件具有较长的生命周期
考点2 嵌入式系统的软件结构
(1)简单的轮询结构
①轮询结构的软件结构
最简单的软件结构是轮询(Round-Robin)结构,应用程序重复循环检査每个外部输入条件,一旦有需要处理的任务,则进行相应的处理。
②特点
优点是程序结构简单,便于编程。没有中断机制,不会出现程序随机切换带来的潜在问题。
③适用情况
适用于系统的任务数量较少、任务处理简单且实时性要求不高的场景。
(2)带中断的轮询结构
①介绍
这种结构在简单的轮询结构的“主循环”基础上增加中断服务程序(ISR),中断服务程序处理特别紧急的服务请求,然后没置状态标志;循环主程序轮询这些状态标志,并进行后续的处理。
②结构
a.简介
这种结构也被称为中断驱动结构或前后台结构。后台是一个循环执行的轮询程序,前台则由若干中断服务程序组成。当有外部事件(例如温度传感器报警)发生时,外部事件提出中断请求,暂停后台运行的主循环,进行前台处理,处理完成后又回到后台继续运行主循环。
b.紧急事件的及时中断
如果所有的外部事件处理操作都是由中断服务程序完成的,那么后台程序除了初始化操作外并不做任何事情。这是一种极端的情况。一般情况下,中断服务程序只进行紧急事件的处理,对于非紧急的处理操作,通过设置状态标志由后台循环程序处理。这样可以保证紧急事件能够及时得到中断服务。
④带中断轮询结构的特点
与简单的轮询结构相比,中断驱动结构提高了系统对紧急事件的响应速度,可以并发处理不同的异步事件,因而在一些小型的简单嵌入式系统中应用广泛。由于中断的引入,使得系统软件复杂度明显提高,必须谨慎处理中断嵌套、中断服务程序与主程序的同步协调等问题。
(3)监控式操作系统+应用软件的结构
①嵌入式操作系统的特点
复杂的嵌入式系统要求嵌入式软件必须以多任务方式运行。为了合理地调度多任务和利用系统资源,通常要选配(Embedded Operating System,EOS),这样才能保证程序执行的实时性、可靠性和可维护性,并减少开发时间,降低系统的复杂性,保障软件质量。
②嵌入式操作系统的功能
对于中端嵌入式系统,小型的监控式嵌入式操作系统就可以满足需求。这类嵌入式操作系统通常只包含内核(kernel),仅实现任务调度、任务间通信和中断管理等最基本功能,以多个并发的任务(task)取代“主循环”,其结构如图所示。操作系统内核负责多任务处理,执行任务创建与初始化、任务调度、存储管理、时钟管理和中断管理等。
③多任务系统的特点
实际上是由多个任务、多个中断服务程序和嵌入式操作系统组成的有机整体。操作系统通过任务调度和任务切换保证任务的并行运行,各任务之间以及任务与中断服务程序之间的通信、同步和互斥也需要操作系统的支持。
④监控式操作系统+应用软件的结构的优点
引入操作系统增加了系统的开销。但嵌入式操作系统结构允许多个任务在一个CPU上并行运行,将复杂的系统分解成相对独立的多个任务,从而降低了用户开发嵌入式软件的复杂度,并有效保证系统的实时性和可维护性。
(4)通用嵌入式操作系统+应用软件的结构
①高端嵌入式系统的软件层次结构
a.三层结构
如图所示高端嵌入式系统(如基于 Android或iOS的智能手机系统)实例。其中,嵌入式系统软件控制和管理系统中的资源,为嵌入式应用提供支持,通常又可分为硬件抽象层(驱动层)、操作系统层和中间件层。
b.中间件
中间件(middleware)软件是指除了操作系统内核、设备驱动程序和应用软件之外的系统软件。中间件是具有标准程序接口和协议的通用服务。应用程序共享这些服务,既可减轻开发难度并减少工作量,又获得了相对稳定的应用软件开发和运行环境,当底层的软、硬件变化时仍能保证应用软件的稳定。通用的中间件有Java 虚拟机中间件、数据库访问中间件、图形和图像处理中间件等,面向特定应用领域的有数字电视中间件、嵌入式 RFID中间件等。
②支撑软件
由于嵌入式系统通常是在开发主机上进行交叉开发的,所以在开发主机和嵌入式目标机上还运行着大量的支撑软件。支撑软件指辅助嵌入式系统设计、开发及测试的工具软件,包括系统分析设计工具、在线仿真工具、交叉编译器、源程序模拟器和配置管理工具等。大部分支撑软件都运行在开发平台上。在调试阶段,嵌入式系统目标平台上也会运行一些开发工具的代理程序(agent)。
考点3 硬件抽象层与板级支持包
(1)硬件抽象层和板级支持包的概念
①硬件抽象层(HardwareAbstractLayer,HAL)
a.概念
HAL是在操作系统层与硬件之间设置的独立的接口软件层,是所有直接依赖于硬件的软件,包括引导程序、硬件配置程序和硬件访问代码等。
b.引入的目的
引入HAL的目的是对硬件进行抽象,即将控制所有硬件电路的软件代码封装起来,通过硬件抽象层应用编程接口(HALAPI)向操作系统以及应用程序提供服务,使上层软件开发入员无须关心底层硬件的具体细节和差异,并且支持上层软件在不同体系结构和硬件平台之间的移植。
②板级支持包(Board Support Package,BSP)
a.BSP的特点
板级支持包屏蔽了其所支持的嵌入式操作系统与底层硬件平台之间的相关性,使嵌入式操作系统能够通用于BSP所支持的不同硬件平台,实现嵌入式操作系统的可移植性和跨平台性。BSP的特点是与硬件和操作系统都关系紧密,既有硬件相关性,又有操作系统相关性。BSP规范是 OS相关的,支持不同 OS的BSP的组织结构、向上层提供的功能以及服务接口定义都不相同;而 BSP 代码则必须针对特定硬件专门编写。
b.BSP的功能
BSP在系统复位之后负责系统软硬件环境的初始化,其功能可以分为三部分:
第一,系统复位时的硬件初始化
包括处理器芯片的初始化和电路板的初始化。通常在系统复位时只需对操作系统运行所必需的硬件进行初始化操作,并不需要对系统中的所有硬件都进行初始化。由于在BSP运行之前,操作系统及其附带的调试工具还无法运行,因此 BSP的开发是嵌入式软件开发的难点之一。
第二,为操作系统提供硬件相关的驱动程序支持
BSP 中包含硬件相关的设备驱动程序,这些驱动程序为操作系统和/或应用程序访问硬件提供支持,对系统硬件进行管理,并实现数据的输入输出操作。但是,除了与在引导和加载操作系统过程中所需的硬件环境相关的设备驱动程序之外,BSP包含的其他设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP将其与操作系统中的通用设备驱动程序关联起来,并在随后操作系统运行之后由操作系统和/或应用程序调用,实现对硬件设备的管理。
第三,引导加载操作系统
在初始化必要的硬件环境之后,BSP还需要进行系统级的初始化。这包括设置软件的基本数据结构和参数操作系统自身工作环境的初始化、定制操作系统的功能等,为操作系统的正常运行做好准备。BSP 随后会加载操作系统,将嵌入式系统的控制权转交给操作系统。操作系统继续完成余下的初始化操作。最后,操作系统为软件系统提供多任务的运行环境,创建应用程序的运行实例,并将控制权交给应用程序。
(2)HAL和BSP实例
①Nios II HAL
a.NiosIIHAL的介绍
NiosⅡ是 Altera 公司推出的 32 位哈佛结构用户可配置的通用RISC软核处理器,用于支持在 FPGA 器件上实现可编程片上系统(SOPC)。其最大优势是模块化的硬件结构,以及由此带来的灵活性和可裁剪性。
b.Nios II系统的软件结构
在NiosⅡ系统硬件之上就是硬件抽象层HAL。应用程序可以直接运行在 HAL 之上,也可以运行在 μC/OS-Ⅱ等嵌入式操作系统之上。
HAL系统库是NiosⅡ处理器系统的轻量级运行环境,提供了简单的设备驱动程序接口和HALAPI(应用程序接口)。
c.NiosIIHAL的特点
由于 SOPC 系统的软件和硬件都是借助集成的 SoPC开发平台统一配置开发的,所以软硬件开发工具之间的紧密集成使得特定硬件系统的 HAL可以由开发工具自动生成。当硬件开发工具产生了硬件系统配置之后,NiosⅡ软件开发工具可以生成与硬件配置相匹配的定制的 HAL 系统库。如果底层硬件做了改动,则 HAL 设备驱动配置会自动更新。应用程序和底层硬件的通信依靠统一的接口函数,底层硬件的改动对应用程序的代码没有影响。
d.HAL系统库提供的服务
第一,ANSIC标准库
HAL系统库集成了适用于嵌入式环境的开源 NewLib ANSI C标准库,向用户提供熟知的标准库函数支持。
第二,外设驱动
HAL,为每一个设备实例化一个驱动程序。应用程序使用设备驱动程序接口同底层硬件进行通信第
三,HALAPI
NiosⅡ上的应用软件可以通过 HAL接口函数直接访问外设、处理中断,或调用 HAL,提供的 alarm 等其他支持,从而将硬件细节抽象出来。
第四,系统初始化
在应用程序执行之前完成处理器和运行库环境的初始化任务。
第五,设备初始化
在应用程序运行之前完成每个设备的实例化和初始化。
在开发应用软件时,可以通过 HALAPI访问硬件资源,也可以调用ANSIC标准库实现相应的功能。而 ANSIC标准库中的函数也会调用 HALAPI。因此,用户程序可以通过printf()、fopen()、fwrite()等C标准库函数访问外设和文件,而无须直接调用 HALAPI。
②Windows Embedded Compact 7(WEC7)BSP
a.简介
Windows Embedded Compact7(WEC7)是微软公司 WindowsEmbedded CE(WinCE)的后续产品,是专门为小型网络设备设计的安全、组件化的实时操作系统。
b.软件结构
WEC7由三层构成。如图所示,最顶层是应用(application)和服务(service),这两个组件与下一层的操作系统内核(kernel)层交。在硬件和内核层之间的就是BSP。
c.BSP的组成
WEC7的BSP由引导加载程序(BootLoader)、OEM适配层(OAL)、设备驱动程序、配置文件和内核无关的传输层(KITL)组成。
第一,OAL层的功能是将与处理器体系结构无关的内核适配到特定处理器或硬件平台上,它包含支持定时器、存储管理、Cache 管理等硬件相关操作的代码,也为电源管理器提供支持,并实现中断服务程序。第二,KITL层是用于开发的宿主机(host)与运行 WEC7操作系统的设备之间的通信通道,它由 OAL调用用于系统调试时的信息传输。配置文件则用于创建操作系统的运行映像。
(3)BSP的开发和移植
①BSP 开发的特点
BSP既要与特定电路板相匹配,又必须按照操作系统所要求的接口方式为其提供服务。BSP是操作系统正常运行的前提,BSP程序的效率和稳定性直接影响整个系统的性能及稳定性。
②BSP 的调试步骤
a.最小系统的调试
最小系统通常包括处理器、RAM、bootROM 等最基本的系统部件,以及串口、网口等输入/输出端口。要借助在线仿真器或片上仿真器等调试设备辅助调试操作或者使用 LED 显示灯亮灭、串口显示等方法间接跟踪程序的执行流程。
b.外围设备驱动程序的调试
最小系统之外其他部件可以在此阶段进行调试。操作系统启动后,各种操作系统提供的调试工具都能使用的因此外围设备驱动程序的调试与应用程序调试的方式类似,可以借助网口或串口把目标机(嵌入式系统)与宿主机(调试主机)相连,进行交叉调试。
考点4 引导加载程序
(1)引导加载程序的概念和功能
(引导加载程序的介绍
引导加载程序(引导程序)bootoader是底层软件的一部分。嵌入式系统上电复位后首先运行引导加载程序,它负责系统的上电自检、硬件初始化、建立存储空间映射、配置系统参数、建立上层软件的运行环境,并加载和启动操作系统。
bootloader 依赖于具体的硬件结构。支持不同硬件结构的 bootloader程序有不同的版本。bootloader 移植是在特定硬件系统上进行操作系统移植的关键步骤。
②bootROM
与 bootloader 相关的一个术语是 bootROM(引导只读存储器)。一般而言,bootROM 是指用来存储 bootloade程序的非易失存储器,当前使用最多的类型是NORFlash ROM。在大多数嵌入式系统中,bootROM 内不仅存储bootoader 程序,还存储操作系统映像、应用程序代码和用户配置数据等信息,即使系统断电,信息也不会丢失。
③bootloader 程序的功能
不同的 bootloader 程序功能虽有差别,但都需要支持核心的操作系统引导(boot)和加载(load)功能。复杂的 bootloader 程序还支持简单的用户命令交互、设置操作系统启动参数、fash ROM 编程下载、读写内存、系统自检、硬件调试等监控程序(monitor)功能。
(2)嵌入式操作系统的加载方式
①在 ROM 中直接运行操作系统代码
传统的嵌入式系统较少配置外存储器,而是将操作系统和应用程序的映像预先烧录在ROM存储器中(通常是 NOR Fash ROM)。ROM存储器可以随机读出,不论是在 ROM 中在线执行代码,还是从 ROM 中读出信息,都不需要额外的驱动程序。嵌入式处理器复位后,执行 bootoader 代码,完成必要的硬件初始化等操作后,直接跳转到ROM存储器中操作系统入口函数处继续执行。
②在 RAM 中运行操作系统代码
a.执行过程
操作系统的映像和应用程序映像同样已经预先烧录到ROM中。不同的是,bootloader 代码在完成必要的硬件初始化等操作后,需把存放在 ROM 存储器中的操作系统和应用程序映像拷贝到 RAM 存储器中,然后跳转到RAM存储器中操作系统入口函数处继续执行。
b.执行条件
这种方式需要在嵌入式系统中配置较大的 RAM 存储器。在有的系统中,烧录到ROM 中的操作系统和应用程序代码是经过压缩的,因而在 bootloader 运行时需要把这些代码解压缩后再写入到 RAM 中。ROM 存储空间需求的降低是以增加解压缩时间为代价的。
c.优点
第一,由于 RAM 的访问速度通常要比 ROM 快很多,因而在这种方式中操作系统和应用程序的代码取指令的速度提高了。
第二,又因为 RAM 存储单元中的信息可以很方便地改写,故可以实现程序代码的动态修改,有利于采用更灵活的程序结构,方便程序调试。
③从外存储器加载操作系统代码运行
a.运行过程
在这种方式中,操作系统映像和应用程序映像预先存放在基于外存储器的文件系统中。为了加载操作系统bootloader 中必须要有访问外存储器所需的驱动程序。处理器复位后,执行bootROM 中存放的 bootloader 代码完成必要的硬件初始化等操作后,通过外存驱动程序读取外存储器中存放的操作系统和应用程序映像,并将其复制到RAM中,然后跳转到操作系统入口运行。
b.优点
由于外存容量较大,因而这种方式可以方便地在外存中存放不同版本的操作系统和应用程序映像,根据需要选择不同配置的软件运行。操作系统和应用程序的在线升级也更方便。
④从通信端口加载操作系统代码运行
可以从串口、以太网接口等通信端口加载操作系统和应用程序。与从外存加载相似,这种加载方式需要在bootoader中增加通信端口驱动程序,往往还要有相应的通信协议软件以支持通信端口上的数据传输。在这种方式下,嵌入式系统不能独立工作,需要有服务器提供相应的支持。
⑤四种加载方式的工作模式
a.启动加载模式
前面三种加载方式属于启动加载(bootoading)模式,这是嵌入式系统正常工作时使用的启动方式,bootloader从非易失存储介质中引导和加载操作系统代码。
b.下载模式
第四种加载方式则属于下载(downloading)模式,这是在调试或维护更新阶段使用的系统启动方式。在下载模式下,bootoader通过通信端口从调试主机(或服务器)上下载操作系统映像,暂存到 RAM 中,然后将其烧录到 fash ROM 等非易失性存储器中。工作于下载模式的 bootoader 通常会通过显示界面(例如串口通信界面)向用户提供简单的命令行交互机制。
c.两种模式的混合
一些功能强大的 bootloader 能同时文持这两种工作模式。典型的做法是:在进入启动加载模式之前延迟数秒钟并通过终端界面给出提示,如果用户按任意键则切换到下载模式,否则继续进行正常的启动加载。
(3)引导加载程序的执行过程
①bootloader 的第一阶段(stage1)
a.第一阶段的目的
第一阶段的目的是让嵌入式系统能正常运行起来,并为第二阶段以及随后操作系统内核的运行准备好基本的硬件环境。与处理器体系结构相关的硬件初始化和板级初始化等操作通常都在第一阶段完成。有些系统把这部分程序称为引导程序(bootstrap)或OEM启动代码。
b.第一阶段的代码特点及功能
第一阶段的代码通常用汇编语言实现,一方面可以提高代码的时空效率,另一方面可以更方便地实现对硬件的操作。一般而言,第一阶段的代码包含最基本的系统引导初始化功能。根据系统功能不同可能包括以下操作:
第一,关闭中断。在 bootloader 执行的全过程中一般不应响应任何中断请求,故可通过设置处理器内部的状态条件寄存器中的中断使能位屏蔽所有的中断请求。
第二,处理器内部的基本寄存器设置、系统基本参数设置、时钟初始化。
第三,存储器初始化。包括存储器控制器的设置、存储器自检、初始化 Cache 和存储器管理部件、关闭看门狗定时器等。
第四,初始化相关的硬件设备等。
第一阶段的代码通常还需要为高级语言程序的运行建立环境,第一阶段的功能完成后,程序将跳转到第二阶段的C程序入口点继续执行。
②bootloader 的第二阶段(stage 2)
a.第二阶段的功能
第二阶段的代码通常用C语言实现,以便实现操作系统加载的功能。具体包括建立系统配置信息交互通道和映像下载通道、校验内核映像、解压缩内核映像、复制内核映像到 RAM、为内核执行提供合适的上下文环境等。
b.第二阶段步骤
第一,进一步完成系统初始化任务。包括处理器初始化、板级初始化、中断初始化等。
第二,初始化本阶段要使用到的硬件设备。
第三,如果在RAM 中运行操作系统内核,则需将内核代码和根文件系统映像从ROM存储器复制到RAM存储器。
第四,向操作系统内核传递启动参数。例如,将系统内存的具体安排、终端串口的波特率、数据位位数等参数以特定的方式传递给操作系统内核。
第五,调用内核代码。
(4)U-Boot 支持的主要功能
③U-Boot 移植
步骤:
a.从 U-Boot 源码发布平台获得官方发布的最新版本 U-Boot 源码并解压缩。
b.分析并修改与处理器和/或开发板相关的源代码。
第一,选择 U-Boot 发布包中已经支持的平台中与新平台最接近的一种作为参考。
第二,分析新开发的嵌入式硬件平台与参考平台的差别,如引导方式、引导 ROM 的类型、容量、地址安排RAM 类型、容量、地址等。
第三,修改源代码中处理器相关和/或开发板相关的部分,使之与新硬件平台相适应。
c.建立交叉调试环境,对修改后的源代码进行调试,确保其能够正确实现引导加载功能。
考点5 嵌入式系统的设备驱动程序
(1)设备驱动程序的概念
①设备驱动程序的介绍
设备驱动程序(device driver)是指直接与硬件相互作用并控制硬件的软件。从驱动程序调用者的角度看,驱动程序是对硬件操作的抽象,以实现高层软件对硬件的访问。应用软件工程师调用驱动程序实现数据的 IO 时,不必关心 IO 设备的中断、I/O 寄存器、输入输出控制方式等硬件细节,从而实现对硬件的透明访问。
②设备驱动程序的特性
a.只能被高层软件调用而无法自行运行:
b.对上层软件屏蔽硬件细节,对下层硬件直接进行操作。
③驱动程序的形式
驱动程序通常以一组函数的形式出现。这组函数封装了对硬件(包括虚拟硬件)的操作,按照硬件的具体工作方式读写设备接口内的寄存器,完成设备轮询、中断处理、DMA操作等;同时向高层软件提供一致和熟悉的接口。
④设备驱动程序的功能
a.设备初始化
初始化操作在系统上电或复位时初始化硬件
b:设备打开(激活)和关闭
打开(激活)设备操作使设备处于工作状态。在多任务系统中,如果设备是共享资源,则当设备打开时系统要对其进行保护,锁定其访问权并禁止其他任务对设备进行操作,直到设备资源被释放。关闭设备操作则释放设备资源,使硬件转入禁止工作状态并解锁硬件。
c.设备读取和写入(即数据收发)
设备读取操作指从设备接收数据并提交给高层软件,设备写入操作则把数据发送给设备。数据收发可以采用查询、中断或 DMA方式。
d.设备状态查询和设备控制操作
在设备使用过程中,可能需要查询设备的当前工作状态,并根据操作需求对设备进行控制。不同类型设备的功能和复杂度差别很大。简单设备(例如LED显示器)的驱动程序可能并不需要实现上述所有功能,一些特殊设备的驱动程序可能还有一些额外的功能。
(2)设备驱动程序的实现方式
①小型的嵌入式操作系统中的实现方式
一些小型的嵌入式操作系统(如uCOS-Ⅱ)往往只包括操作系统内核,不包括设备驱动程序,而且编写设备驱动程序也没有定义统一的框架。。
②大型的嵌入式操作系统中的实现方式
在 WinCE、Linux 和 Vxworks 等大型嵌入式操作系统中,往往自带一些标准设备的驱动程序,并且定义了统一的设备驱动程序框架。
(3)Unix操作系统中的实现方式
Linux 等类 Unix 操作系统还会把 IO设备抽象成设备文件。在应用程序看来,IO设备只是一个文件,应用程序可以像处理普通文件一样对设备进行操作。
(4)驱动程序的分层方式
为了便于在不同处理器之间移植,某些操作系统会按照分层方式设计驱动程序。体系结构相关的驱动程序是硬件抽象层的一部分,用于配置处理器的运行参数、访问与处理器相关的资源、管理处理器的片内硬件;通用设备驱动程序与处理器体系结构无关,并通过体系结构相关的驱动程序实现与硬件的交互,在移植到不同体系结构的处理器时不需要修改。
驱动程序通常总是位于软件的最下层,不过不同嵌入式操作系统中驱动程序所处的层次位置并不相同。有些系统中设备驱动程序与操作系统内核都处在操作系统层中,有些系统把设备驱动程序放在操作系统层之下单独构成一层,还有一些系统设备驱动层是板级支持包的一部分。
⑤驱动程序与操作系统的关系
就软件而言,对硬件设备的访问需通过对设备接口内的寄存器的读写来实现,因而驱动程序必须访问 IO 端口所对应的物理地址空间。由于虚地址映射和操作系统的存储保护机制的限制,很多操作系统不允许运行在用户态的应用程序直接访问物理端口,因而要求驱动程序必须在内核态(内核模式)运行,用户的应用程序必须通过驱动程序才能访问硬件。
(3)VxWorks的IO系统与设备驱动程序
①VxWorks操作系统的介绍
VxWorks操作系统由高性能实时内核Wind、文件系统、I0系统、网络协议栈和板级支持包(包括Bootloader)组成。BSP、网络驱动程序和 USB 驱动程序等构成硬件抽象层等)。
②VxWorks 的 IO 系统结构
IO系统是 VxWorks内核的一部分,它为应用程序操作硬件设备提供了标准接口,即把应用程序的 IO 请求通过 I/O函数传递给设备驱动程序。
③VxWorks将 IO 设备的分类
VxWorks将IO设备分为字符设备、块设备、网络设备和其他非标准设备。
a.字符设备即以字节流方式进行数据交互的设备,以文件的形式直接挂接在IO系统中;
b.硬盘和闪存等以“块”为单位存取数据的设备则称为块设备,驱动程序通过文件系统与IO 系统交互;
c.应用程序访问网络设备需通过 TCP/IP 协议栈和MUX接口实现;
d.应用程序也可以直接调用非标准设备的驱动程序。
I/0 系统通过7个基本的I/O操作函数访问硬件设备:创建文件create()、打开文件open()、读取文件read()、写入文件write()、关闭文件cose()、移除文件remove()和其他控制命令ioctl()。每个IO操作函数在设备驱动程序中都有对应的实现函数。
4)VxWorks的设备驱动程序
a.初始化部分
初始化硬件并分配设备所需的资源。
b:函数功能部分
完成系统指定的功能,也即7个标准IO函数的具体实现。
c.中断服务程序
系统通过中断服务程序实现与外部事件的交互。
考点6 实时系统与实时操作系统
(1)实时系统
①实时系统的概念
实时系统(Real-TimeSystem)是必须在有限和确定的时间内对外部事件作出响应的信息系统。
②实时系统的评判
a.评判的关键
评判实时系统的关键并不是系统对外部事件的处理速度,而是处理事件的时间的可预见性和确定性。即无论系统面对最小负载还是最大负载,实时系统都必须确定地保证满足时间要求。
b.与非实时系统的比较
与非实时的通用计算机系统追求系统的平均响应时间短和用户使用的方便性不同,实时系统主要考虑的是在最坏情况下的系统行为的可预见性是否有保证。
c.时限
时限(deadline,最后期限)是实时系统追求的最重要指标,分为相对时限和绝对时限:
第一,相对时限是指事件提出请求后,系统作出响应所允许的最大时间长度;
第二,绝对时限是指不管请求何时提出,相应任务必须完成的截止时刻。
③实时系统的类型
a.硬实时任务
硬实时任务(hard real-time task,有时也称强实时任务):对硬实时任务,必须在给定的时限内完成,超过时限将会导致任务失败或引起致命的错误。通常工业控制和军工系统中的许多任务属于这种类型,绝对不允许出现意外。
b:软实时任务
软实时任务(sot real-time task,有时也称弱实时任务):软实时任务仍然要求系统的响应越快越好,但是偶尔超出时限并不会造成任务失败或导致任务出现致命错误,而是造成任务的服务质量下降,超时的响应仍然有一定的意义。一些消费类电子产品和数据采集系统中的任务属于这种类型。
c:准实时任务
准实时任务(firm real-timetask):准实时任务通常允许偶尔错过最后期限,但若超过时限,所进行的操作或者计算结果没有任何意义。
④嵌入式系统与实时系统的关系
嵌入式系统与实时系统既有区别又相互联系。嵌入式系统并不都是实时系统。而实时系统也不都是嵌入式系统,通用计算机系统经过特殊配置后也可以完成实时控制功能。因此可以说实时嵌入式系统是嵌入式系统与实时系统的交集。
⑤实时系统的关键特性
a.时间约束性
保证在规定的时限内完成相应任务是实时系统设计的关键。外部数据的获取、处理和数据的输出都必须在截止时间之前完成。
b.可预测性
实时系统能够对实时任务的完成时间进行判断,确定是否能够满足时限要求。这里,可预测性既包括硬件延迟的可预测性,也包括软件执行时间的可预测性。
c.可靠性
在非实时系统中,偶发故障可以通过重新启动系统来解决。但实时系统性能的损失或降低可能产生灾难性的后果,而很多实时系统的运行环境又非常恶劣。因此,可靠性在实时系统中比非实时系统中更重要。在一些重要的实时应用中,需要采用资源冗余配置或采用容错设计等方式提高系统的可靠性,使系统在最坏情况下都能正常工作。
d.交互性
实时系统运行的外部环境是实时系统不可缺少的组成部分。实时系统必须在规定的时间内对外部请求作出反应,反应的结果通常也会作用于外部物理环境。所以,实时系统必须与外部环境实现良好的协同与交互。
(2)实时操作系统
①实时操作系统的概念
能够满足实时系统需求的操作系统就是实时操作系统。也就是说,实时操作系统是不以在给定时间内完成更多的任务为目标,而是以响应外部事件尽可能快且响应时间具有确定性为目标的操作系统。
②实时操作系统最关键的特性
实时操作系统最关键的特性就是完成每次任务所需时间的一致性。如果一个实时操作系统能够完全满足确定性的时限要求,则称为硬实时操作系统,否则称为软实时操作系统。
③抖动(jitter)
实时操作系统完成每次任务所需时间的偏差称为抖动(jitter)。硬实时操作系统的抖动比软实时操作系统小。
④操作系统时间确定性的保证机制
操作系统的时间确定性首先取决于它响应中断的速度,其次取决于系统是否具有足够的处理能力在规定时限内处理完成所有的事件请求。
a.事件驱动
实时操作系统都是事件驱动的,能在限定的时间内对外部事件作出响应外部事件可分为两类:
第一,周期性发生的事件(同步事件),系统可以预见下一次事件发生的时刻;
第二,非周期性发生的异步事件,事件发生的时间不可预测。
b.多级中断嵌套处理
一个实时系统需要处理众多外部事件,但处理的紧迫程度并不相同。有的事件必须立即作出反应,有的事件则可以稍后再处理。因此,需要建立多级中断嵌套处理机制,以确保对紧迫程度较高的外部事件及时进行响应和处理。
c.细粒度的任务优先级控制
在实时系统中,由于不同任务的紧迫程度不同,用户必须根据任务对实时性要求的高低确定各任务的相对优先级。最高优先级的任务一旦就绪,就能立即得到处理器的使用权。高优先级任务在执行中不会被低于其优先级的其他任务打断或抢占资源;同等优先级的任务则可建立任务队列,按照先到先服务的规则获得资源或执行。
d.实时抢占式调度
仅仅提供任务的优先级控制还不够,任务调度策略是影响系统实时性能的重要因素。实时调度的目标是在正常情况下尽可能满足所有任务的时限,而在峰值负荷条件下至少保证强实时任务的时限。使用抢占式内核使得任务级响应时间得以最优化。
第一,实时调度机制首先要选择调度方式简单、反应速度快的实时调度算法,保证按照优先级抢占式调度实时任务,也即实时操作系统必须允许高优先级任务一旦准备好运行,马上抢占低优先级任务的执行,而相同优先级的多个任务则可采用时间片轮转调度机制。
第二,实时调度机制还需要建立更多“安全切换”时间点,保证及时调度实时任务。
(3)实时操作系统的实时性指标
①响应时间(response time)
评价实时系统的实时性最重要的指标是响应时间,即系统从事件请求开始到任务完成的时间间隔。由于每个任务的实时性不同,因而并不存在绝对的时间尺度标准。为了更好地支持实时任务,实时操作系统必须能以最短的时间切换到处理该事件的任务代码。与任务切换和中断延迟时间有关的参数是衡量实时操作系统性能的最重要指标。
②中新延迟时间(interrupt latency)
中断延迟时间是指从接收到可屏蔽中断请求信号到操作系统作出响应并转入中断服务程序所需要的最长时间。中断延迟时间包括两部分:
a.最长关中断时间。是指系统因执行临界区代码等原因不允许响应中断请求的时间;
b.从硬件开始响应中断到开始执行中断服务程序第一条指令之间的时间。
由处理器特性和中断机制决定,通常时间较短。而尽可能减小系统的最长关中断时间,则可以更快地对外部事件作出响应,从而有效提高系统的整体实时性能。
③任务切换时间(task switching time)
a.概念
操作系统在两个独立且具有相同优先级的就绪态任务之间切换所需要的时间。
b.组成
任务切换时间包括保存当前运行任务上下文的时间、调度程序选中新任务的时间和恢复新任务上下文的时间。
c.取决因素
任务切换时间主要取决于保存任务上下文所用的数据结构以及操作系统采用的调度算法。相同优先级的任务般采用时间片轮转方式进行任务调度。
④任务抢占时间(task preemption time)
任务抢占时间即系统将控制权从低优先级的任转移到高优先级任务所花费的时间。为了对任务进行抢占,系统必须首先识别引起高优先级任务就绪的事件,并比较两个任务的优先级,最后进行任务切换。任务抢占时间通常比任务切换时间更长,因为在调度过程中首先要确认唤醒任务的事件,并评估正在运行的任务和请求运行的任务的优先级高低,然后才决定是否进行任务切换。
考点7 嵌入式操作系统概述
(1)嵌入式操作系统的特点和分类
①嵌入式操作系统的特点
嵌入式操作系统除具备任务调度、同步机制、内存管理、中断处理、文件处理等基本功能外,在下列方面具有较为突出的特点:
a.代码固化存储,时空效率高
嵌入式系统通常不配备像硬盘那样大容量的存储介质,故操作系统和应用软件的代码被固化在嵌入式系统的固态存储器中。因此,嵌入式操作系统必须结构紧凑,代码占用存储空间小,执行效率高。
b.可裁剪性
支持开放性和可伸缩性的体系结构,满足嵌入式系统的特定需求。
c.实时性
大多数嵌入式系统都是实时系统,而且多是强实时、多任务系统。
d.强稳定性,弱交互性
许多嵌入式系统需要在用户不干预的情况下连续长时间运行,这就要求嵌入式操作系统具有较强的稳定性。般而言,嵌入式操作系统的用户界面比较简单,与用户的交互性较弱。
e.硬件适应性
一种嵌入式操作系统通常可以运行在不同体系结构的多种硬件平台上。嵌入式操作系统的开发者通常把与硬件平台相关的部分以抽象接口的形式保留出来,由系统开发人员自行开发,以确保操作系统的可移植性。
②嵌入式操作系统的常用分类
a.按实时性分类
第一,硬实时操作系统
主要用于通信、军事、航天、控制等领域,与人的交互性要求相对较弱,可靠性和实时性要求高,运行环境复杂多变。VxWorks、RTEMS、ONX、μC/OS-Ⅱ、Nucleus 等都属于硬实时操作系统。
第二,软实时操作系统或非实时操作系统
主要用于类 PC手持设备、家用电器、个人通信终端等消费类电子产品,如智能移动电话、机顶盒、MP3/MP4播放器、家庭媒体网关等。此类产品主要面向大众消费者,因而实时性要求一般不太强,但交互性要求较强。WinCE 和多种嵌入式Linux都属于软实时操作系统。
b.按开发方式分类
第一,专门为嵌入式环境开发的嵌入式操作系统
针对嵌入式系统的特点进行了精巧的设计,实时性强,可靠性高,系统性能卓越。多应用在对系统可靠性和实时性等要求很高的军用产品、通信系统和工业控制等领域中。
第二,从通用计算机操作系统移植而来的嵌入式操作系统
在原有基础上进行了内核的精简和改造,并提供相应的成套开发工具,非常适合在类 PC嵌入式系统和消费类电子产品上使用。 代码的容量往往较大,实时性相对不够高。Windows产品和许多嵌入式 Linux 产品都属于这种类型。
c.按商业模式分类
第一,免费的嵌入式操作系统
由软件的设计者、合作伙伴和众多的软件爱好者共同维护,并在一定的规则下授权他人免费使用的嵌入式操作系统。软件技术公开,研究者众多,更新速度快,开发资源丰富,但稳定性和技术支持一般较差。RTEMS、eCOS、FreeRTOS等都是免费的嵌入式操作系统。
第二,商业嵌入式操作系统
由特定厂商以盈利为目的开发和销售的嵌入式操作系统。这类系统稳定性强,可靠性高,有完善的技术支持和售后服务,但产品价格昂贵。
(2)嵌入式操作系统的内核结构
①内核的概念和作用
与通用机操作系统一样,嵌入式操作系统也都有一个内核(kemnel)。操作系统是由内核、用户界面、中间件实用程序等组件组成的,其中内核起着最重要的作用。内核是操作系统中的一组核心程序模块,其作用是管理系统资源、支持多任务并发执行,通常驻留在内核空间,运行于核心态,具有访问硬件设备和所有主存空间的权限,是系统中仅有的能够执行特权指令的程序。运行在用户态的应用程序可以通过系统调用进入核心态,完成操作后再返回用户态。
②单内核(宏内核)结构
a.单内核的概念
有些操作系统把内核的各个功能模块(如进程管理、文件系统、设备管理、网络通信等)整合在一起,模块间的交互通过直接调用其他模块中的函数来实现,执行效率高,性能好。这类操作系统内核称为单内核(monolithic-kernel)或宏内核(macro-kernel)。
b.单内核的结构种类
第一,整体结构
整体结构把内核分为若干模块,各模块协作完成某项功能。模块间可自由调用,所有模块连接成一个内核。这种结构的最大缺点就是模块之间相互关联,耦合度很高,结构不清晰,牵一发而动全身,维护和升级困难。
第二,分层结构
分层结构的单内核操作系统将所有模块划分为若干层次,下层模块封装内部细节,上层模块调用下层模块提供的接口。嵌入式 Linux 等类 Unix 系统都属于分层结构的操作系统。与整体结构相比,分层结构的功能按模块化组织,使操作系统结构清晰,接口简单,系统的正确性容易得到保证,也有利于开发和维护。缺点是每一层都要向上层提供通信机制,影响系统的效率。
c.单内核操作系统的特点
无论采用哪一种结构,单内核操作系统的优点是性能较好,系统的各个组件之间可以相互调用,功能切换和通信开销比较小。其缺点是即使不使用的功能组件和设备驱动程序也常驻在内存中,占用资源较多,维护工作量大。
d.常见的单内核结构的操作系统
单内核结构的操作系统有:传统的Unix、BSDUnix、Linux,MS-DOS,Windows9x(Windows95/98/Me)Windows CE和Android 操作系统也都属于单内核结构。
③微内核结构
a.微内核的概念
操作系统仅将必需的基本功能(如任务调度、任务间通信、低级存储管理、中断处理等)放入内核,它们运行在核心态;其他功能都在内核之外,由在用户态运行的服务来完成,这种做法使内核的结构很小,所以称为微内核(micro-kermel)结构。
b.微内核结构的操作系统的组成
一是运行在核心态的内核,只完成很少的一些核心任务;
二是运行在用户态的若干进程,每个进程完成一组系统服务,称为“服务进程”。
c.微内核结构的操作系统的优点
第一,内核精巧,结构紧凑,占用内存少,适合资源相对紧张的嵌入式系统。
第二,开发和维护方便,系统可以动态更新服务模块。
第三,接口一致。微内核提供了一致性接口,所有的服务都通过消息传递方式调用,用户态任务不需要区分是内核级服务还是用户级服务。
第四,可扩展性与可配置性强,很适合嵌入式系统的可裁剪要求。
第五,可靠性高,各个服务进程在用户态运行,有自己的内存空间,以消息方式通信,一个服务进程出错不会影响到整个内核,从而增强了系统的健壮性。
第六,支持分布式系统。服务器可以在不同的处理机上运行,适合多处理机系统或分布式处理系统。
d.微内核结构的缺点
主要体现在效率较低、性能相对较差,因为通信和上下文切换的开销大大增加。
e.常见的采用微内核结构的操作系统
采用纯粹微内核结构的操作系统有 AIX、Mach、Minix、Vxworks、ONX等。
④混合内核结构
有些当前流行的操作系统采用混合内核。它们实质上仍是微内核结构,只不过让原本运行在用户空间的服务程序运行在内核空间。可以提高内核的运行效率。通用计算机上使用的大多数现代操作系统都采用这种结构。目前,嵌入式操作系统主要采用分层和模块化相结合的宏内核结构,或微内核结构。分层和模块化相结合的结构将操作系统分为应用软件层、中间件层、操作系统层和硬件抽象层,每层再划分功能模块,移植工作集中在硬件抽象层,功能的伸缩则集中在层内各模块上,从而确保具有良好的可移植性和可伸缩性。而采用微内核结构,则可利用其可伸缩的特点适应硬件的发展,便于扩展。
(3)常用嵌入式操作系统简介
①风河系统公司的 VxWorks
VxWorks 以其可靠性高、实时性强的内核以及友好的开发环境著称,被广泛地应用在通信、军事、航空、航天等高新技术及实时性要求极高的领域中,如卫星通信、弹道制导、飞机导航等。
VxWorks操作系统支持 PowerPC、68K、CPU32、i960、x86、MIPS 等多种嵌入式处理器体系结构。VxWorks采用微内核结构,内核仅提供多任务环境、任务间通信和同步功能,能够有效保证较短的任务间切换时间和较小的中断延迟。较好的可剪裁能力,应用程序的动态连接和动态下载,较好的兼容性,高可靠性、高可用性和高安全性,这些特点的组合使得这款实时操作系统及其开发环境在嵌入式系统中占据了一定的市场优势。
②ONX软件系统公司的ONX
QNX是一款商业分布式、可扩充的实时操作系统,应用范围极广,包含汽车领域、网络通信、核电站和无人驾驶坦克的控制系统以及 RIM 公司的BlackBery PlayBook平板计算机等。
QNX是非常成功的微内核操作系统,提供小巧且运行速度极快的微内核以及一些可选的配合进程。其内核仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,所有其他服务通过协作用户进程实现,故可以灵活实现系统的可伸缩和动态配置。ONX同时支持进程和线程两种任务实现方式,保证了基于 ONX的应用系统稳定、可靠、强壮。
③Mentor Graphics/ATI 公司的 Nucleus PLUS
为实时嵌入式应用而设计的抢占式多任务商业操作系统内核,也称为Nucleus RTOS。
特点一,NucleusPLUS 采用组件方式,操作系统以一组C函数库的形式出现,并提供种类丰富的功能模块。
二,Nucleus PLUS本身只是一个实时内核,用户需要再购买网络组件、GUI组件、文件系统组件和设备驱动等模块才能构成功能完整的嵌入式软件系统。
三,NucleusPLUS的微内核非常小巧,又便于移植,并能够支持大多数类型的处理器。
四,NucleusPLUS95%的代码是用ANSIC写成的,其最著名的特性就是提供注释严格的C源代码给每一个用户,并且在最终产品量产时也不必支付版税。
④微软公司的嵌入式 Windows 操作系统家族
微软的嵌入式操作系统家族产品众多,其主流产品基本上可以划分为嵌入式操作系统(EOS)和设备平台(device platforms)两类。其中 EOS 又可以划分为两个主线: Windows Embedded Compact(WEC)系列和 WindowsEmbedded 系列,针对既非小型设备又非资源受限设备的嵌入式环境。
⑤RTEMS 操作系统
RTEMS即实时多处理器系统,是GPL开源的无版税嵌入式实时操作系统。RTEMS属于微内核抢占式实时系统,非常稳定且运行速度快,占用系统资源少,支持多处理器,提供完整的TCP/P协议栈以及FTP、WebSerVer、NFS服务。RTEMS在通信、航空航天、工业控制、军事等领域有着非常广泛的应用。
⑥TinyOS 无线传感器网络操作系统
TinyOs 是美国加州大学伯克利分校开发的开源嵌入式操作系统,专门为硬件资源极为有限的无线传感器网络应用而量身定制。TinyOS 操作系统基于组件架构,包括网络协议、分布式服务器和传感器驱动组件,以及一些可以在收集数据时使用的应用工具。
TinyOS 拥有两级调度和轻量级线程技术,TinyOS采用事件驱动的工作模式,用事件触发唤醒传感器工作,因而实现了非常优良的电源效能。
⑦eCOS
eCOS即嵌入式可配置操作系统,是一个小型的开源免费嵌入式操作系统,主要应用对象包括低成本和便携式的消费电子、电信、车载设备和手持设备等。
eCOS的主要技术创新是其功能强大的组件管理和配置系统,可以在源码级实现对系统的配置和裁剪,定制运行组件,最小版本只有几百个字节,并提供Linux 兼容的API。
⑧FreeRTOS
FreeRTOS是一个轻量级的开源迷你实时操作系统内核。FreeRTOS操作系统完全免费且源码公开,具备可移植、可裁减、调度策略灵活等特点。由于其内核小巧,占用存储空间少,因而可以方便地移植到各种单片机上运行。
考点8 Linux 内核
Unix 与Linux
①Unix系统的特点
Unix支持多用户和多任务,网络和数据库功能强大,支持多种处理器架构。依靠其可靠性高和可伸缩性突出等优势,Unix 在巨型计算机、服务器和工作站等多种硬件平台上均处于操作系统领域的主流地位。
②类 Unix 系统
Unix作为主流的操作系统,多年来不断演化,派生出许多相似或同源的操作系统,逐渐形成了一个产品大家族。基于 Unix 直接演化而来的商业版 Unix,如 Solaris、UnixWare、AIX、HP-UX 等。还有一些与 Unix有一定关系的派生操作系统,则被统称为类 Unix(Unix-like)系统。这些类 Unix 系统中,有些是基于 Unix 代码衍生而来的如FreeBSD和 OpenBSD 等;没有直接派生关系,但技术上与 Unix 相似,包括 Linux、ONX、VxWorks 以及安卓和 ios 等。
③Linux 系统的由来
类 Unix 系统中最著名的就是 Linux,起源于芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)。
④Linux 和 Unix 的关系
Linux 和 Unix 的关系非常紧密。虽然 Linux 并没有使用任何版本 Unix 的源码,而是完全重新编写的,但 Linux成功地模仿了 Unix 系统,具有 Unix 操作系统的全部功能。Unix 技术成熟,可靠性高,是大型主机和服务器上运行关键业务的核心软件。Linux 从这个成熟的操作系统发展而来,Unix 的可靠性、稳定性、可伸缩性、开放性以及强大的数据库与网络通信支持能力也在Linux 身上体现出来,许多 Unix上的应用程序可以很方便地移植到Linux平台上运行。
(2)Linux与自由软件
①自由软件的概念
a.自由软件赋予使用者的四种自由
Linux是一种自由软件(free software)。自由软件是相对于私有软件(proprietary software)而言的。按照自由软件基金会的定义,自由软件是可以不受限制地自由使用、复制、研究、修改和分发的软件。自由软件赋予软件使用者四种自由:
第一,不论何种目的使用软件的自由;
第二,研究软件如何运作并修改软件以满足自身需求的自由:
第三,重新发布软件的自由;
第四,改善和再利用软件的自由;
b:开源软件
由于取得软件源码是获得上述自由的前提,因而自由软件必定是开源软件(OpenSource Software,OsS)。开源软件是指在软件发行时附上源代码的计算机软件,软件的版权所有者在软件协议的规定之下授权用户更改、再发布或衍生其他软件。
②自由软件授权协议
自由软件根据选定的“自由软件授权(license)”协议发布,主要的授权协议有GNU通用公共授权协议 GPI和伯克利系统发布版本 BSD(Berkeley System Distribution)授权协议两种。包括 Linux 在内的超过 70%的自由软件和开源软件使用 GPL 授权。
③GNU
a.名称
GNU 的名称来自“GNU'sNot Unix”的递归定义,用于展示“自由软件的幽默”。GNU 既是一个软件开发项目“GNU Proiect”的名称,也是由该项目推动的类Unix操作系统的名称。
b.项目目标
该项目的目标在于创建一个完全兼容于Unix的自由软件环境。
c.发布软件的要求
按GPL授权协议发布软件的主要要求是:
第一,软件必须开源;
第二,对软件进行的任何改动也必须按 GPL发布;
第三,发布者不能对软件使用者提出任何非GPL的限制要求;
第四,GPL软件的使用者享有与初始发布者同样的复制、修改和发布软件的权力。简单而言,自由软件一旦按 GPL授权发布,它将永远具有 GPL授权,任何人不能用附加的授权夺取用户重发布和修改程序的自由;而且基于公平互惠的原则,如果GPL软件的使用者修改了软件源码也必须公开其修改的成果。这就是 GPL“自由、分享、互惠”的精神。
(3)Linux内核
除 Linux内核之外,一个典型的Linux 发行版还包括系统安装工具、实用程序、命令行程序 shell、图形用户界面、常用的应用软件以及其他的一些自由软件等。
考点9 嵌入式 Linux 操作系统
(1)Linux内核的结构与组成
①Linux 的设计特点
a.Linux 采用了与 Unix 相同的单内核结构。不过,Linux 将微内核的许多优点引入到 Linux 的单内核设计中,并且尽力避免微内核结构的缺陷。
b.Linux 采用模块化设计,将接口与其实现分离开来,保证一个模块可以在不影响其他模块的情况下进行修改。Linux 还支持动态装载内核模块,允许根据特定设备的需要或用户的指令动态地加载或卸载部分内核代码。
c.Linux还支持内核线程。为了让内核能并行执行多个流,防止在处理异步事件时可能的阻塞,Linux 使用内核线程将内核分成几个功能模块。内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程。
②Linux操作系统的组织结构
从图中可以看出,Linux 操作系统可以分为两个层次:上层(应用程序及工具软件,以及GNUC运行库GLIBC)运行在用户空间;下层即Linux内核,运行在内核空间。
③Linux的内核空间的划分
a. 最上层是系统调用接口,是内核与应用程序进行交互的唯一接口,应用程序/GLIBC通过系统调用访问内核中的特定函数,以实现特定的服务。
b.最下层是BSP,这部分代码用于支持特定体系结构的处理器和特定的硬件平台,例如引导加载程序,以及与 DMA、MMU 设置、中断处理相关的代码等。
c.中间层是内核的核心部分,是inux所支持的所有处理器体系结构通用的代码。它的主要功能是管理系统资源、确保系统安全和隔离保护各个用户等。Linux 采用的宏内核结构是一个整体结构,内核内部包含了若干相互关联的组成部件。
④Linux 的内核空间的中间层组成部件
a.初始化(init)组件
在 bootloader将 Linux内核映像加载到 RAM 中之后,Linux内核启动并运行初始化组件。内核的入口函数名为start_kernel,负责完成与硬件平台相关的剩余初始化及内核组件的初始化,并解析和处理 bootloader 传递给内核的启动参数。此后,初始化组件打开初始终端并启动init进程,该进程是系统内所有进程的根进程。
b.进程调度器
进程调度是内核的核心功能。Linux将内核中运行的任务称为内核线程,而将用户空间中运行的任务称为进程(但 Linux 原则上并不区分进程和线程)。Linux内核负责创建和终止进程,并在进程间进行通信和同步。
c.内存管理器
负责多个进程安全地共享主存空间。Linux支持虚拟存储器,由内存管理器完成物理地址与虚拟地址之间的映射、分页机制以及磁盘和内存之间的数据交换。内核维护自身的虚地址空间,而用户空间的每个进程则拥有自己独立的虚地址空间。
d.虚拟文件系统
Linux 在传统的逻辑文件系统之上增加了一个虚拟文件系统(VirtulFileSystem,VFS),虚拟文件系统在系统调用接口和内核所支持的文件系统之间提供了一个交换层,从而向上层软件提供了不同逻辑文件系统的统一接口。
VFS向上提供通用 API,可实现文件打开、关闭、读和写等探作的抽象接口。VFS下方则是逻辑文件系统层,用于实现上层函数的功能。逻辑文件系统层之下是缓冲区缓存这一层包装了对物理设备的访问并向上提供一组统一的通用函数。缓冲区缓存之下是设备驱动程序,用于访问特定的物理设备。
e.网络接口
Linux 网络接口组件向上层屏蔽网络实现的细节,支持不同的网络协议和不同的物理传输介质。在底层,网络设备驱动程序负责与硬件设备交互。在驱动程序之上则是分层结构的网络协议栈,例如在网络层支持IP协议,在传输层支持TCP协议,在 TCP之上提供套接字(socket)支持,并通过系统调用接口调用 socket API。
f.进程间通信(IPC)
Linux 支持多种进程间通信机制,例如管道和命名管道、信号、消息队列、共享内存、信号量、socket 等。
g.可加载模块(Loadable Modules)
Linux 在整体宏内核结构的基础上提供了动态改变内核组成的机制,使内核占用的存储空间尽量减少,并在必要时动态加载相应的模块,以便增加新设备驱动或扩展内核的功能。
h.设备驱动程序
设备驱动程序运行在内核空间,可以直接对硬件进行操作,并提供一系列抽象接口,以屏蔽硬件的具体细节。Linux 提供了大量的设备驱动程序,其代码占内核代码总量的将近一半。门类齐全的驱动程序成为 Linux 相对于其他操作系统的优势之一。
⑤Linux 内核中各组件的关系
在 Linux 操作系统中,当应用程序发出输入输出请求时,系统把请求处理的权限交给文件系统,文件系统通过驱动程序提供的接口将操作下放到驱动程序,驱动程序完成对设备的实际操作。驱动程序可以被直接编译到内核中并在内核启动时加载到内存,亦可以模块形式存储在文件系统中并在需要时被动态加载和卸载。
(2)Linux的实时化技术
①内核补丁方式
a.内核补丁方式介绍
内核补丁方式并不改变 Linux的 API接口,而是在通用 Linux内核上打上实时扩展补丁。内核补丁方式保留了全部的 Linux 应用编程模式,实时任务和普通的应用采用同样的编程方式并使用同样的 API,只是实时任务需要明确指定自己的优先级与调度策略。内核补丁方式最著名的实例就是 MontaVista Linux。
b.内核补丁方式的缺点
内核补丁方式的不足之处在于满足硬实时性要求仍有一定困难,因为即使中断关闭和任务不可抢占的时间大大缩短,但仍然存在。
②双内核方式
a.双内核方式的结构
双内核方法在系统中增加微内核形态的第二个内核,并作为硬件与通用Linux内核间的抽象接口。实时任务直接在实时微内核上运行,而非实时的通用Linux内核在后台运行全部非实时任务,而它本身又是实时微内核的一个低优先级任务,与实时任务一起调度。微内核的主要任务是中断管理,通过截获中断的方式确保非实时内核无法抢占微内核的运行。RTLinux 实时操作系统就采用双内核方式。
b.双内核方式的优点
双内核方式的优点是微内核可以提供硬实时支持。其缺点是微内核与标准Linux内核共存,实时任务需要按照微内核提供的另一套 API进行设计,且实时任务和非实时任务独立也令任务调试更加困难。
③超微内核方式
a.超微内核的结构
在实时内核和非实时内核之外增加了一个功能进一步缩减的超微内核(nano-kermel)。超微内核是一个专门负责处理中断的底层小程序。与其说超微内核是内核,不如说是一个硬件抽象层,它将硬件虚拟化,为运行于更高层次的多个操作系统提供了硬件资源共享机制,使单一硬件可以同时运行多个并发操作系统,这与操作系统虚拟化技术非常相似。超微内核可以为高层的操作系统提供优先级排队机制,从而支持实时性任务。硬件抽象层的存在使得实时内核和非实时内核之间由紧耦合关系变为松耦合关系,这对系统的稳定性以及代码维护都非常有利。
b.超微内核的示例
操作系统自适应域环境 ADEOS(Adaptive Domain Environment for Operating Systems)是一个超微内核的实例,它是在已有操作系统下插入的一个软件层,支持多个操作系统的并发运行,每个操作系统都在独立的域内运行,每个域可以有独立的地址空间和类似于进程、虚拟内存等的软件抽象层,而且这些资源也可以由不同的域共享。
(3)嵌入式Linux操作系统的构建
①基于通用 Linux内核构建嵌入式 Linux
这种方式在下载通用 Linux 内核(也称标准 Linux 内核)源码的基础上进行内核的配置、裁剪和编译等工作,生成“DIY 内核”。
优点是成本低、内核版本更新及时。
缺点是定制和裁剪工作量较大,且实时性相对较差。
②基于嵌入式 Linux 发行版构建嵌入式 Linux
a.基于嵌入式 Linux 发行版改造方式
优点一,轻量化,也即让Linux的存储空间占用更小,更容易嵌入到尺寸受限和功能、性能要求更高的硬件平台中;
优点二,实时性增强,也即采用实时补丁和增加实时内核等方式对非实时Linux内核进行改造,使其适应实时性需求。
b.基于嵌入式 Linux 发行版构建嵌入式 Linux 方法的优缺点
优点是内核的实时性高、定制和裁剪工作量小、针对性强、有专门团队的技术支持等,可以让用户集中精力开发应用软件和特定硬件接口的设备驱动程序。
缺点是版本更新不一定及时,成本较高。
③常见的嵌入式 Linux操作系统
a. uClinux
uClinux专门针对没有或者不使用储存管理部件(MMU)的处理器,并且针对嵌入式系统做了许多代码和运行时小型化的工作,适用于内存容量很小的嵌入式系统。
uClinux 沿袭了主流 Linux的的绝大部分特性,与标准 Linux 的架构完全一致,最大区别就在于内存管理采用实存储管理策略取代虚拟内存管理技术,各个进程实际上共享一个运行空间,开发人员可以访问任意的地址空间。
b.Monta Vista Linux
MontaVistaLinux 采用抢占优先级内核技术,结合 MontaVista 自身的硬实时技术,具有更短的抢占延迟,性能远远高于通用 Linux 内核。广泛应用由于在操作系统大小、系统实时性、交叉开发工具、高可用性和动态电源管理等方面的优势,Monta Vista Linux成为高稳定性、高实时性的商业嵌入式操作系统,广泛应用于手机、汽车、电信、网络设备及消费电子产品,以及航空航天和军事领域。
c.RTLinux
RTLinux 没有重写Linux 的内核,而是利用内核的模块机制,采用双内核方式增强实时性。这样对inux内核的改动非常小,并且充分利用了普通Linux内核的资源,可以直接运行软件。
d. RTAI
是对 Linux内核的硬实时扩展。RTAI 提供标准的 Linux 内核服务,但通过修改中断处理和调度策略为 Linux 增加了实时特性。其核心组成部件就是中断调度器,用于截获外设中断,并在必要时提交给Linux。RTAI并不改动 Linux 内核,而是通过硬件抽象层 ADEOS 截取 Linux 内核的基本功能。
e.Xenomai
Xenomai 是一个超微内核机制的 Linux内核实时开发框架。
f. Wind River Linux
作为硬实时操作系统 VxWorks开发商的风河系统公司自 2005 年开始发布应用于软实时环境的 Wind RiverLinux 商业发行版。2013年,风河推出了最新版的 Wind River Linux6,支持 ARM、Intel、MIPS 以及 Power 架构。Wind River Linux6基于最新版的通用 Linux 内核,使用 Yocto项目的资源开发而成。
考点10 Android 操作系统
(1)Android 系统的特点
①Android系统最大的优势在于其开放性
Android 是一个对第三方软件完全开放的平台,开发者拥有很大的自由度。。
②对移动设备用户来说,Android平台提供的网络、绘图、3D 处理能力可以带来更好的用户体验。用户借助免费的谷歌账户可以在运行 Android 的不同品牌设备之间无缝切换。
③对移动设备制造商来说,Android是一个免费的和开放的操作系统平台,设备制造商可以在这个平台上随意增添特有的装置或功能,且无须为售出的每台设备支付版税。
④对移动设备的应用开发者来说,Android 平台上的应用程序可以兼容于运行 Android 的各种型号的设备,而无须针对不同机型开发各种特定版本的程序。
(2)Android系统的组成与结构
Android 系统采用堆层式软件架构,分为四层,从低层到高层分别是Linux内核(LinuxKemel)、系统运行库(Runtime Libraries)、应用程序框架(Application Framework)和应用程序(Applications)。其中,系统运行库层由 Android 运行环境(AndroidRuntime)和组件库(Libraries)两部分组成。
①Linux 内核层
Android 的核心系统服务依赖于Linux 内核。内核提供内存管理、进程管理、网络协议栈、安全机制和驱动程序模型(显示屏驱动、键盘驱动、相机驱动、WiF驱动、闪存驱动、音频驱动、Binder(IPC)驱动及电源管理等)。
②组件库
常用的功能组件库有:
a.系统C库
标准C系统库(1ibc)的BSD衍生版本,适用于基于inux的嵌入式设备
b.媒体框架
支持播放和录制常用格式的音频和视频及静态图像文件的媒体库,例如 MPEG4、H.264、MP3、AAC、AMR.JPG 和 PNG 。
c.Surface Manager显示管理库
管理访问显示子系统并无缝整合多个应用程序的二维和三维图形层。
d.SGL库
基于2D的图形图像处理引擎
e.FreeType 库
位图及矢量字体支持.
f. SOLite 库
强大而轻量级的关系数据库引擎。
g. WebKit
新式的 Web浏览器引擎,支持当前非常流行的 HTML5。
h.OpenGLES
3D库OpenGLESAPIS的实现。使用硬件3D加速或高度优化的3D软件光栅。i.OpenSSL库强大的安全套接字加密库。
③Android 运行环境
Android 运行环境由 Dalvik 虚拟机和核心库组成。
a.Android 包含一个核心库的集合,提供了Java编程语言核心库的大多数功能。
b.Dalvik 是谷歌等厂商合作开发的用于 Android平台的Java虚拟机,允许在有限的内存中同时运行多个虚拟机实例。Dalvik虚拟机依赖于Linux内核提供线程分配和内存管理等基本功能。Java应用程序经过编译并通过SDK中的工具转化成 Dalvik 可执行程序格式(.dex)后才能在 Dalvik虚拟机上执行。.dex 格式是专为 Dalvik 设计的一种压缩格式,适合于内存和处理器速度有限的系统。每一个Android应用程序都有一个 Dalvik 虚拟机实例为其服务,并作为一个独立的 Linux 进程运行。
④应用程序框架层
应用框架层是用 Java 语言开发的,是核心应用所使用的 API框架,开发者使用框架层提供的 API可以方便地访问硬件设备、获取位置信息、向状态栏添加通知消息、设置闹铃等,简化了 Android 应用程序的开发设计。应用程序框架层包括:
a.活动管理器(Activity Manager)
管理各个应用程序的生命周期并提供常用的导航回退功能。
b.窗口管理器(Window Manager)
管理所有的窗口程序。
c.内容提供器(ContentProvider)
管理不同应用程序之间的数据访问和共享,
d.视图系统(ViewSystem)
构建应用程序的基本组件,包括列表、网格、文本框、按钮,甚至可嵌入的 Web 浏览器等
e.通告管理器(Notification Manager)
帮助应用程序在状态栏显示自定义的提示信息。
f.包管理器(Package Manager)
管理所有安装在 Android 系统中的应用程序
g.电话管理器(Telephone Manager)
管理所有的移动设备功能。
h.资源管理器(Resource Manager)
提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等。
i.位置管理器(Location Manager)
提供位置服务。
j.XMPP服务(XMPP Service)
提供 Gtalk 服务。
⑤应用程序层
应用程序层是和用户交互的层次,包含应用程序员通过AndroidSDK开发的软件。Android本身提供了桌面(home)、联系人、电话、浏览器、电子邮件、短信、日历、地图等核心应用程序。开发者也可以利用Java 语言使用应用框架提供的 API自行开发应用程序。
⑥硬件抽象层
与Linux 的 HAL,的位置相似,Android 的HAL,也是位于操作系统和驱动程序之上、运行在用户空间的服务程序。对硬件的支持被分成两部分:硬件抽象层运行在用户空间,而inux内核驱动程序运行在内核空间。但Linux 的 HAL,并不提供对硬件的实际操作,对硬件的操作仍然由运行在 Linux内核空间的驱动程序完成。HAL对 Linux内核驱动程序进行封装,为上层应用提供统一的査询硬件设备的接口,屏蔽低层的实现细节。
(3)Android 的各层次结构的使用语言
在 Android 的层次结构中,最底层的 Linux 内核及驱动程序运行在内核空间,而 HAL 及其以上的代码都运行在用户空间。一般而言,Linux内核层用C语言实现,HAL和系统运行库层用C和/C++语言实现,而应用程序框架层和应用程序层主要用Java 语言实现。
(4)Android 应用开发
Android 应用开发的环境
Android 在 Linux 内核的基础上提供了各种函数库和完整的应用程序框架,并在 Linux 内核之上配置了谷歌的应用程序运行环境 Dalvik 虚拟机。
②开发 Android 应用程序的步骤
a.配置开发环境
包括下载 Android SDK、为 Eclipse 安装 ADT插件,并使用 SDK Manager 下载最新的 SDK 工具和平台。
b.创建 Android 应用的开发工程
可以使用安装了 ADT插件的 Eclipse集成开发环境创建工程,也可以借助 SDK 工具从命令行创建新工程
c.运行应用程序
Android 应用程序可以在真实的 Android 设备上运行,也可以在,Android 模拟器上安装和运行应用。
考点11 iOS 操作系统
(1)iOS操作系统概述
①起源及发展
苹果 iOS 是苹果公司开发的操作系统,原名为iPhone OS,于2007年发布第一版,用于 iPhone 智能手机。随后,该系统陆续应用于iPod touch 移动互联网终端、iPad平板电脑及 AppleTV高清电视机顶盒等设备,并于2010 年改名为 iOS。
②特点
a.ios 平台的许多开发工具和开发技术源自苹果公司为 Mac 系列桌面和便携计算机产品开发的 MacOsX操作系统。iOS与 MacOs X一样,iOS也属于类 Unix 的商业操作系统。iOS 系统由苹果公司独家拥有,并且不支持非苹果公司的硬件装置。
b.iOS系统的用户体验和易用性非常优秀。
c.iOS是根据移动设备的特点而设计的,iOS管理设备硬件并为设备的本地应用程序提供基本技术支撑。根据设备的功能,i0S操作系统配置不同的系统应用程序,为用户提供标准系统服务。
(2)iOS系统的组成与结构
ios的系统架构分为四个层次:核心操作系统层(CoreOSlayer)、核心服务层(Core Services layer)、媒体层(Medialayer)和触控界面层(Cocoa Touch layer,Cocoa 是苹果公司为 MacOSX所创建的面向对象编程环境)。如图4-19所示 iOS 系统的层次结构。
①核心操作系统层
核心操作系统层位于iOS系统架构的最底层,是用FreeBSD和 Mach 所改写的 Darwin,是开源、符合POSIX标准的类 Unix 内核。这一层包含硬件驱动、内存管理、进程管理、线程管理、文件系统、网络支持(BSDSocket)、电源管理、标准输入输出以及其他操作系统任务。所有这些功能都通过C语言AP/提供调用接口。
核心操作系统层可以直接与硬件设备进行交互,驱动程序提供了硬件和系统框架之间的接口。出于安全考虑,只有有限的系统框架类能访问内核和驱动。
②核心服务层
第二层是核心服务层,该层为所有的应用程序提供基础系统服务。应用程序未必直接使用这些服务,但很多系统部件依赖这些服务。核心服务层包括以下组件:
a.地址簿框架(Address Book Framework)
使用该框架能访问和修改存储在用户联系人数据库里的记录。
b.基础框架(Foundation Framework)与核心基础框架(Core Foundation Framework)
向应用提供基本数据管理和服务功能,如集合数据类型、字符串管理、日期和时间管理、原始数据块管理、首选项管理、URL和 Stream 操作、线程和运行循环、端口和 Socket 通信等。基础框架是 Objective-C 的语言的API接口集,核心基础框架则是C语言的API接口集。
c.CFNetwork框架(CFNetworkFramework)
一组高性能的C语言接口集,提供网络协议的面向对象抽象。使用CFNetwork框架可以操作协议栈并访问低层结构。
d.核心位置框架(Core Location Framework)
利用 GPS、蜂窝基站或 WFi信号测量用户的当前位置。
e.安全框架(securityFramework)
用来处理认证、密码管理等安全需求,提供管理证书、公钥/私钥对和信任策略等接口,保应用数据的安全性。
f. SQLite
轻量级的数据库,用于创建本地数据库文件并管理这些文件中的记录。
g.XML 支持
基础框架架提供 NSXMLParser 类,用于解析 XML文档元素。ibXML2库提供操作 XML,内容的功能,可以快速解析和编辑 XM数据,并转换 XML 内容到 HTML。
③媒体层
媒体层提供对图片、音乐、影片等多媒体支持。通过媒体层可以在应用程序中使用各种媒体文件,进行音频与视频录放、实行 2D和 3D 图形绘制,并制作基本动画效果。
a.图形技术
创建应用程序最简单、有效的方法是使用事先渲染过的图片,搭配标准视图以及UIKit框架的控件,然后把绘制任务交给系统来执行。如果需要 UIKit 所不具有的功能,则可使用核心图形框架、核心动画框架、OpenGLES框架等。
b.音频技术
帮助用户提供丰富多彩的音响体验,如播放或录制高质量的音频、触发设备的震动功能等。④触控界面层
触控界面层包含创建应用程序所需的关键框架,其中大部分与用户界面相关。该层负责用户在iOS设备上的触摸交互操作、实现应用程序可视界面,及与高级系统服务交互等功能。在开发应用程序的时候,应尽可能使用该层的框架。
触控界面层提供的高级特性包括:
a.多任务
允许应用程序驻留后台转入挂起状态或在后台运行。
b:数据保护
和敏感用户数据打交道的应用程序可以使用设备内建加密功能对数据进行保护,如文件加密存储等。
c.苹果推送通知服务
不管应用程序是否运行,苹果推送通知服务可用于通知用户某个应用程序具有新信息。
d.本地通知
当有重要的事件发生时,后台应用程序可以利用本地通知获得用户关注。在发送通知的时候,应用程序也无须处于运行状态。
f.手势识别器
手势识别器是一个绑定到视图的对象,用于检测常见的手势类型。
g.文件共享支持
允许应用程序通过 iTunes 向用户呈现应用程序或 Documents 目录的内容。
h:点对点服务
可以使用点对点连接启动与某个邻近设备的通信会话。
i.标准系统视图控制器
触控界面层许多框架含有展现标准系统界面的视图控制器,在应用程序中使用这些视图控制器可以让程序和系统具有一致的用户体验。
j.外部设备支持
当连接了外部设备后,应用程序可以使用其显示屏显示内容。
(3)iOS应用开发
①IOS 应用开发环境 XCode
苹果公司向开发人员提供集成开发环境 Xcode用于开发 MacOS X和iOS应用程序。Xcode 负责管理应用程序的工程,实现程序代码的编辑、编译、运行和调试。Xcode集成了 GCC编译器和 GDB 调试器等许多工具,并支持 C、C++、objective-C、Objective-C++等语言。
②Objective-C 语言
本地应用程序使用 iOS 系统框架和 Objective-C语言构建,并且直接运行于iOS 设备。Objective-C是一种简洁、面向对象的程序设计语言,所有iOS应用程序都由该语言驱动。0bjective-C语言为iOS 提供了集合、文件管理、网络操作等支持。
③iOS 应用程序的组成
在iOS系统中,应用程序由用户代码和苹果公司提供的框架(Framework)组成。框架包含方法资源库,是帮助应用程序完成各种特定功能的软件库。应用程序通过框架的应用编程接口(API)调用这些功能,API指定可用的类、数据结构和协议。使用框架既省时省力,又可确保代码高效、安全。而系统框架则是访问底层硬件的唯一途径。
④框架适用原则
在开发应用程序时,应该尽可能使用高层框架,只有在高层框架无法解决时,才能使用其下层的技术。高层框架为底层构造提供面向对象的抽象。这些抽象可以减少需编写的代码量,并对诸如 socket 和线程等底层复杂功能进行封装,从而让编写代码变得更加容易。顶层框架已经涵盖了绝大多数需要的功能。如果高层框架没有为底层框架的某些功能提供接口,开发者可以直接使用底层框架。
考点12 μC/OS 操作系统概述
(1)μC/OS-Ⅱ的特点
①μC/OS-Ⅱ的介绍
μC/OS-Ⅱ是专门为嵌入式应用设计的实时多任务操作系统内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
μC/OS-Ⅱ只是实时操作系统内核,仅仅包含了任务调度、任务管理、时间管理、内存管理和任务间通信与同步等基本功能,没有提供输入输出管理、文件系统、网络协议栈等额外的服务。
②μC/OS-Ⅱ的主要特点
a.公开源码的高质量实时内核
Micrium 公司的所有产品(除工具外)都提供源代码,而且源代码清晰易读、结构合理、注释详尽、组织有序,符合严格的编写规范。用户可以清楚地了解操作系统的设计细节,并通过修改源码构造出符合应用需求的操作系统环境。
b.可移植
μC/OS-Ⅱ的绝大部分代码是用ANSIC语言编写的,只包含一小部分汇编代码用于支持特定的微处理器架构。只要微处理器支持堆栈指针,且有CPU内部寄存器入栈、出栈指令,μC/OS-Ⅱ即可被移植到该微处理器上。此外,C语言编译器应当或者支持内嵌汇编(inlineasembly),或者支持语言扩展功能,能够在C语言中完成关中断和开中断。μC/OS-Ⅱ可以在绝大多数8位至 64位微处理器、微控制器和数字信号处理器(DSP)上运行。
c.可裁剪、可固化
为了降低 μC/OS-Ⅱ占用的 RAM 和 ROM 存储空间大小,可以根据应用程序的需要通过条件编译裁剪 uCIOS.Ⅱ的系统服务。借助相应的工具链,可以将内核嵌入到应用产品中。
d.时间确定性
绝大多数μC/OS-Ⅱ的函数调用与服务的执行时间都是确定的,其服务的执行时间与系统中运行的任务个数无关。
e.多任务
uCIOS-Ⅱ可以管理64个任务(版本 2.82以后扩充至 255个任务),其中8个保留给系统,其余用于用户任务分配给不同任务的优先级不能相同,因此μC/OS-Ⅱ不支持时间片轮转(round-robin)调度机制。
f.抢占式内核
μC/OS-Ⅱ是抢占式实时内核,在任意时刻都可能发生任务调度,在任务调度时总是选择当前就绪态任务中优先级最高的任务运行。因此,μC/OS-Ⅱ可以支持强实时应用,其性能可以与许多高端商业 RTOS产品媲美,某些性能指标甚至更高。
g.多种系统服务
μC/OS-Ⅱ提供很多实时内核所需的系统服务,例如任务管理、时间管理、信号量、事件标志组、互斥信号量、消息队列、内存分区管理等。
(3)μC/OS-Ⅱ系统的组成与源代码结构
①μC/OS-Ⅱ内核的结构μC/OS-Ⅱ内核负责管理用户任务,并为任务提供资源共享等服务机制。μC/OS-Ⅱ内核大致可以划分为任务调度、任务管理、时间管理、任务间同步与通信以及内存管理、系统管理等模块。系统管理又包括系统初始化系统启动、中断管理、时钟中断及事件处理等部分。μC/OS-Ⅱ系统的组成与结构如图4-20所示。
②μC/OS-Ⅱ的源代码组成:
a.系统核心(OSCore.c)
μC/OS-Ⅱ内核的核心代码。
b.任务管理(OSTask.c)
包含与任务管理相关的函数,如任务创建、任务删除、任务挂起及任务恢复等。
c.时钟管理(OSTime.c)
包含时间延迟、时钟设置及时钟恢复等与时钟相关的函数。
d.任务同步与任务间通信(OSMbox.c、OSQ.c、0SSem.c、OSMutex.c、OSFlag.c)
包含与信号量、事件标志、互斥信号量、消息队列等相关的函数。
e.内存管理(OSMem.c)
用于内存分区管理,包含创建内存分区、申请或释放内存分区、获取分区信息等函数。
f.处理器相关代码
μC/OS-Ⅱ移植时针对特定处理器体系结构的代码。
考点13 μC/OS-II的任务及其管理
(1)μC/OS-Ⅱ的任务构成
①μC/OS-Ⅱ任务的介绍
在COS-Ⅱ中,任务是操作系统的基本调度单位,由操作系统内核管理,任务之间使用系统服务进行同步与通信。基于 uC/0OS-Ⅱ的应用程序通常运行多个用户任务。
②μC/OS-Ⅱ的任务的构成
a.任务的程序代码
任务代码实际上是一个没有返回值的C函数。任务函数有一个入口参数,通常定义成一个 void 类型的指针,允许用户程序传递任何类型的参数给任务,任务的返回值必须是void类型,但任务永远不会返回。
b.任务堆栈
每个任务都有自己独立的栈空间,用于保存任务的工作环境。用户在创建任务时必须知道处理器是采用向上生长的堆栈(栈顶在低地址)还是向下生长的堆栈(栈顶在高地址)。每个任务的空间大小不同。
c.任务控制块(Task Control Block,TCB)
用于保存任务状态和属性的数据结构,在任务创建时被初始化。多个任务的TCB 构成双向循环链表。
(2)μC/OS-Ⅱ的任务状态
①休眠(Dormant)态
任务代码驻留在内存中但还没有交给内核调度的状态。调用创建任务函数可以把任务提交给内核管理。
②就绪(Ready)态
任务已经具备运行条件但因优先级比正在运行的任务低而暂时不能运行的状态。
③运行(Running)态任务
已经获得处理器使用权而正在运行的状态。任何时刻系统中只有一个任务处于运行状态。
④等待(Waiting)态
也称挂起(Pending)态,正在运行的任务因等待某一事件发生而将处理器的使用权出让给其他任务而将自身挂起的状态。等待的事件可以是外设的IO操作、事件信号量、共享资源被释放、超时时间到达等。
⑤被中断(Interrupted)态
因处理器执行中断服务程序而被暂停运行的任务状态。
(3)μC/OS-Ⅱ的任务调度
①μC/OS-Ⅱ任务优先级介绍
μC/OS-Ⅱ可以管理 64个任务(版本 2.82 以后扩充至 255 个任务),每个任务都被赋予一个不同于其他任务的优先级,共64个优先级别。0是最高优先级别,而最低优先级别则由头文件SCFG.H中设置的常量OS_LOWEST_PRIO定义。μC/OS-Ⅱ的任务分为用户任务和系统任务。系统保留了4个最高优先级的任务(0~3)和4个最低优先级的任务,故用户任务最多可以有56个。由于每个任务都具有唯一的优先级,故可用任务优先级作为任务的标识。
②μC/OS-Ⅱ为应用程序服务的系统任务:
a.空闲任务(idle task)
每个应用系统必须使用空闲任务,系统总是把最低优先级固定赋给空闲任务,该任务在没有其他任务处于就绪态时运行。用户可以在空闲任务的代码中加入用户代码,但不能调用有可能使该任务被挂起的函数,因为该任务在不运行时必须处于就绪态。空闲任务也不能被应用程序删除。空闲任务本身的代码始终连续运行,因此空闲任务与常规用户任务的结构不同。但只要有其他任务就绪,空闲任务的处理器时间就会被抢占。
b:统计任务
可选的统计任务每秒钟运行一次,用于计算当前的处理器利用率,即应用程序使用处理器时间的百分比。统计任务的优先级为OS LOWEST PRIO-1。
③μC/OS-Ⅱ任务调度方式
μC/OS-Ⅱ采用基于优先级的调度算法,任务调度时,内核总是选择当前所有就绪任务中最高优先级的任务转入运行态。
a.任务级的任务调度
任务级的任务调度一般发生在当前运行态任务因等待某一事件而被阻塞或被挂起时,或是有更高优先级的任务处于就绪状态时。发生任务级的任务调度时,内核通过系统函数OSTASKSW()进行任务级的任务切换,保存当前任务的上下文(程序计数器PC、通用寄存器和处理器的状态寄存器),并恢复新任务的上下文。
b.中断级的任务调度
对正常运行的主程序而言,中断是一种随机的程序切换手段。系统正常运行时,中断使能一般是打开的,当外部事件或系统异常发生时,系统响应中断,当前运行的任务将转入被中断态,处理器的使用权则被转交给中断服务程序。而中断有可能会触发一个或多个事件,从而使处于等待态的一个或多个任务转入就绪态。
(4)μC/OS-Ⅱ的中断处理
①μC/OS-Ⅱ系统的中断服务程序的执行步骤
a.保存全部CPU寄存器:
b.调用OSIntEnter()或OSIntNesting 直接加1;
c.执行用户中断服务代码(调用中断处理函数):
d.调用 OSIntExit():
e.恢复所有CPU寄存器:
f.执行中断返回指令。
②OSIntNesting
μC/OS-Ⅱ通过全局变量 OSIntNesting 标识当前是否处于中断状态以及中断嵌套的层数,中断嵌套层数可多达 256层。
③用户中断服务代码
完成寄存器保护和变量 OSImntNesting加1操作后,即可执行用户中断服务代码了。代码的功能取决于中断源的处理要求,但在中断处理中不允许进行任务管理、事件管理及任务调度等操作。用户中断服务代码所做的工作应尽可能少,非紧急的工作尽量交给任务完成。中断服务程序可以借助邮箱、队列、信号量等机制激活某个任务完成相应的工作。如果用户允许中断嵌套,则可重新开中断,在此之前一般要先清除中断源。
④OSIntExit()函数
在中断返回之前,必须调用退出中断函数 void OSIntExit(void)。OSIntExit()将变量 OSIntNesting 记录的中断嵌套层数计数器减 1,当计数器减为零时,说明所有嵌套的中断服务都已经完成。此时 μC/OS-Ⅱ将判断是否有优先级更高的任务被中断服务程序唤醒。如果有优先级更高的任务转入就绪态,则进行中断级的任务切换,恢复新任务上下文。OSIntExit()函数返回后,将恢复已保存的 CPU 寄存器的值,并执行中断返回指令。
考点14 μC/OS-II的系统服务
(1)μC/OS-Ⅱ的任务管理服务
μC/OS-Ⅱ通过一组系统函数进行任务管理,并以优先级(INT8U prio)作为任务的标识。
①任务创建
任务可以在调用OSStar()开始任务调度之前创建,也可以在其他任务的运行过程中被创建,但不能由中断服务程序创建。在开始任务调度前,用户必须至少创建一个用户任务。
函数 OSTaskCreate()和 OSTaskCreateExt()都可以创建任务。
②任务删除
删除任务的操作将使任务转入休眠状态,不再被内核调度。函数OSTaskDel()既可以删除任务自身,也可以删除其他任务。
③任务挂起和任务恢复任务
可以挂起自己或者挂起其他任务。调用OSTaskSuspend()函数可以挂起一个任务,而被挂起的任务只能等待其他任务调用 OSTaskResume()函数才能实现任务恢复。如果任务在被挂起时正在等待延时,则挂起探作将被取消。
(2)μC/OS-Ⅱ的时钟节拍与时间管理服务
①时钟节拍
操作系统内核需要周期性的信号源用于时间延时和超时,即时钟节拍(clocktick)。时钟节拍的频率越高,系统的额外负荷就越重,但应用程序的精度也越高。定时器硬件在每个时钟节拍产生一个硬件中断请求,内核在中断服务程序中更新 32位的 tick 计数器,并调用系统服务函数 OSTimeTick()检查等待超时或等待事件的任务是否超时。
②)时钟节拍相关的函数接口
用户必须在调用 OSStar()启动多任务调度以后再开启时钟节拍器,且在调用OSStart()之后做的第一件事就是初始化定时器中断。
(3)μC/OS-Ⅱ的任务间通信与同步服务
①任务间通信与同步服务的说明
a.任务和中断服务程序之间传递的这些不同类型的信号被统称为事件(event),μC/OS-Ⅱ利用事件控制块ECB(EventControlBlock)作为这些交互机制的载体。
b.任务或者中断服务程序可以通过ECB向其他任务发出信号。任务也可以在ECB上等待其他任务或中断服务程序向其发送信号,但中断服务程序不能等待信号。等待信号的任务可以指定一个最长的等待时间。当任务因等待信号而被挂起时,当前优先级最高的就绪态任务将立即得到处理器的控制权。该事件发生后,被挂起的任务将转入就绪态。
c.多个任务可以同时等待同一事件的发生。当该事件发生后,所有等待该事件的任务中优先级最高的任务将获得该信号并转入就绪状态。
②任务间通信与同步服务的方式
a.信号量
μC/OS-Ⅱ中的信号量由两部分组成:一个16位无符号整数,表示信号量的计数值;一个等待该信号量的任务的列表。
第一,创建信号量
第二,删除信号量
第三,释放信号量
第四,等待信号量
第五,无等待地请求信号量
b.互斥信号量
互斥信号量 mutex是二值信号量,只供任务使用,通常用于实现对共享资源的独占访问。μC/OS-Ⅱ的互斥信号量支持信号量的所有功能,使用方法也与信号量相似,但互斥信号量还可以解决优先级反转问题。故互斥信号量由三部分组成:一个标志位,表示互斥信号量的当前值,只能是0或1:一个等待该互斥信号量的任务的列表:一个保留的空闲优先级值。
第一,创建 mutex
第二,删除 mutex
第三,释放 mutex
第四,等待 mutex
第五,无等待地请求 mutex
第六,查询 mutex 状态
c.事件标志组
事件标志组由两部分组成:一个保存各个事件状态的标志位组,可以配置为8位、16位或32位,每一位代表一个事件;一个等待这些事件标志的任务的列表。事件标志组可以用于多事件同步,即任务等待多个事件中的某一个发生或多个事件全部发生,从而在多个任务或中断服务程序之间实现同步。
第一,创建事件标志组
第二,删除事件标志组
第三,释放事件标志组
第四,等待事件标志组
第五,无等待地请求事件标志组
第六,查询事件标志组状态
d.消息邮箱
消息邮箱可以让一个任务或中断服务程序向另一个任务发送一个指针型的变量,该指针通常指向一个包含特定消息的数据结构。
第一,创建消息邮箱
第二,删除消息邮箱
第三,释放消息邮箱(消息邮箱发送)
第四,等待消息邮箱
第五,无等待地请求消息邮箱
e.消息队列
消息队列同样允许一个任务或中断服务程序向另一个任务发送一个指针型的变量。但一个邮箱只能传递一则消息,而消息队列则可以接收多条消息。故可以将消息队列看作多个邮箱组成的数组,这些邮箱共用一个等待任务列表。
第一,创建消息队列
第二,删除消息队列
第三,释放消息队列1(消息队列发送)
第四,释放消息队列2(消息队列发送)
第五,等待消息队列
第六,无等待地请求消息队列
第七,查询消息队列状态
考点15 μC/OS-II应用程序设计
(1)μC/OS-Ⅱ的初始化与main()函数结构
在基于μC/OS-Ⅱ的多任务系统中,引导加载程序执行完毕则调用主函数main()。
①主函数 main()实现的功能主要包括:硬件初始化,调用 OSnit()初始化 μC/OS-Ⅱ内核,创建任务,创建任务间通信或同步的内核对象,应用程序相关的初始化操作,调用OSStart()启动多任务调度等。
②主函数 main()的一般结构如下:
void main()
{
HW_Init( ); /*硬件初始化*/
OSInit( ); /*初始化μC/OS-Ⅱ内核*/
......
OSTaskCreate( Task1 ,......); /*创建用户任务1*/
OSTaskCreate( Task2 ,......); /*创建用户任务2*
......
OSStart( ); /*启动多任务调度*/
}
(2)μC/OS-Ⅱ用户任务的三种结构
任务可以是一个无限的循环,也可以在任务完成后自我删除
①单次执行的任务
a.孤立性
这类任务在创建后处于就绪态并可以被执行,执行完相应的功能后则自我删除。单次执行的任务通常是孤立的任务,不与其他任务进行通信,只使用共享资源来获取信息和输出信息,但可以被中断服务程序中断。
b:操作步骤
单次执行的任务通常执行三步操作:任务准备工作,任务实体,自我删除函数调用。
c.注意事项
只有不需要与其他任务进行通信的“孤立任务”才适合采用此种结构,并且执行任务自我删除操作必须非常谨慎,避免出现后遗症。如果任务使用了共享资源,必须在自我删除之前释放该资源。如果与其他任务或中断服务程序有关联关系,则任务必须在自我删除之前解除这种关联关系(删除关联任务和任务间通信机制)。
②周期执行的任务
周期执行的任务一般采用循环结构,并在每次完成具体功能后调用系统延时函数OSTimeDly()或OsTimeDIyHMM()等待下一个执行周期,并将处理器时间让给其他任务。但延时函数可能存在一个时钟节拍的延时误差;如果需要精确定时,应采用硬件定时器并在定时器中断服务程序中完成周期性任务。
③事件触发执行的任务
这类任务的实体代码只有在某种事件发生后才执行。在相关事件发生之前,任务被挂起。事件触发执行的任务一般也采用循环结构,相关事件发生一次,任务实体代码执行一次。
考点16 μC/OS-III操作系统的改进与提高
(1)μC/OS-II和 μC/OS-Ⅱ的比较
拉伯罗斯于 2010年推出了 μC/OS-Ш,μC/OS-Ⅲ是一个全新的 RTOS 内核。μC/OS-Ⅱ是定位于8位和 16位以及低端 32 位处理器的 RTOS内核,这类处理器通常没有设置专门为优先级调度设计的优化指令,且内存资源相对紧张:而 uC/OS-Ш尽管在16位甚至8位处理器上可以运行良好,但其初衷则是主要针对高端 32 位处理器。这类处理器带有支持优先级调度的指令,且内存资源更丰富。在功能上,uC/OS-Ⅲ裁掉了一些μC/OS-Ⅱ中很少使用的功能,但增加了很多新的功能和服务。
(2)μC/OS-Ⅲ新增特性
①时间片轮转调度
与 μC/OS-Ⅱ中每个优先级只能有一个任务不同,μC/OS-Ⅲ允许给多个任务分配相同的优先级。如果当前最高优先级的多个任务同时处于就绪态,CIOS-Ⅲ可以采用时间片调度机制让这些相同优先级的任务轮流执行。因此 μC/OS-Ⅱ能同时支持优先级与时间片调度算法,这是uC/OS-Ш最受欢迎的功能增强。
②内核对象的数量无限制
uC/OS-Ⅲ可支持的任务、信号量、互斥信号量、事件标志、消息队列、定时器和内存分区等内核对象的数量仅受限于存储空间的容量,不受COS-Ⅲ本身的限制。对任务的优先级数也没有限制。用户在系统运行时为内核对象分配资源,而不是在编译时就消耗资源。
③任务消息和任务信号
μC/OS-Ⅲ允许中断服务程序或者任务直接向其他任务发送消息或信号,因而无须创建信号量、事件标志或消息队列等中介内核对象,以提高内核性能。
④任务级的时钟节拍处理
uC/OS-Ⅲ使用一个专门的任务管理时钟节拍(clocktick),该任务由中断服务程序触发。用任务处理延迟和超时操作可以大大降低中断延迟。uCOS-Ⅲ使用了哈希散列表机制处理时钟节拍,能够更好地支持硬实时系统。
⑤可针对处理器体系结构进行优化
uC/OS-Ⅲ使用的大多数数据类型都能根据处理器字长改变。优先级调度算法则可以采用汇编语言实现,以便充分利用位操作、前导零计数、查找第一个“1”之类的特殊指令降低算法实现的复杂度。
⑥时间戳
uC/OS-Ⅲ使用一个 16位或者 32位的时间戳计数器用于时间测量。当中断服务程序向任务发送消息时,可以自动读取并保存时间戳计数器的计数值。
⑦增强的内置性能测试功能
uC/OS-Ⅲ的内置性能测试功能比 μC/OS-Ⅱ更强大。性能测试功能能测量每一个任务的执行时间、每个任务的堆栈使用情况、任务的运行次数、CPU 利用率、中断服务程序与人物之间的响应时间等。