第二章 嵌入式系统软件
嵌入式软件基础
嵌入式软件特点
- 规模较小
- 开发难度大
- 硬件资源有限
- 嵌入式软件一般涉及到底层软件的开发,需要软、硬件基础
- 开发环境和运行环境不高
- 实时性和可靠性要求高
- 要求固化存储
嵌入式软件分类
- 系统软件:控制和管理嵌入式系统资源
- 嵌入式操作系统
- 驱动程序
- 嵌入式中间件(CORBA、Java)等
- 支撑软件:辅助软件开发的工具软件
- 系统分析设计工具
- 仿真开发工具
- 交叉开发工具
- 测试工具
- 配置管理工具
- 维护工具等
- 应用软件:定义嵌入式设备的主要功能和用途,负责与用户进行交互(面向应用领域)
- 手机软件
- 路由器软件
- 交换机软件
- 飞控软件等
嵌入式软件的体系结构
无操作系统阶段
- 硬件配置较低,系统应用主要集中在控制领域
- 嵌入式软件的设计是以应用为核心,应用软件直接建立在硬件上
- 无操作系统的嵌入式软件的两种实现方式:
- 循环轮转:把系统功能分解为若干个不同的任务,然后把它们包含在一个永不结束的循环语句中。按照顺序逐一执行。执行完一轮循环后,又回到循环体
- 前后台系统(在循环轮转的基础上增加了中断处理功能):
- 前台程序(事件处理级):中断服务程序,负责处理异步事件
- 后台程序(任务级):一个无限循环,负责资源分配、管理和系统调度
- 在系统运行时,后台程序会检查每个任务是否具备运行条件,对实时性要求严格的操作通常由中断完成
- 前后台系统认为所有的任务具有相同的优先级,任务的执行是通过先进先出队列排队
- 实时性较差
有操作系统阶段:
开发应用程序不再直接面对嵌入式硬件设备,而是在操作系统的基础上编写。优点有:
提高了系统的可靠性
- 提高了系统的开发效率,降低了开发成本,缩短了开发周期
- 可以按照软件工程的思想,将程序分解为多个任务模块,每个任务模块的调试、修改几乎不影响其他模块
- 商业软件提供了良好的多任务调试环境
- 提高了系统的开发效率,降低了开发成本,缩短了开发周期
有利于系统的扩展与移植
设备驱动层
也叫板级支持包BSP:包含了嵌入式系统中所有与硬件相关的代码
- 大多数的嵌入式硬件设备都需要某种类型软件的初始化和管理
- 这部分工作由设备驱动层来完成的,它负责直接与硬件打交道, 对硬件进行管理和控制,为上层软件提供所需的驱动支持,类似PC系统中的BIOS和驱动程序
板级支持包BSP(Board Support Package)
- 把嵌入式操作系统与具体的硬件平台隔离开来
- 即在BSP中,把所有与硬件相关的代码都封装起来,向上提供一个虚拟的硬件平台,操作系统就运行在这个虚拟的硬件平台上
- 操作系统使用一组定义好的编程接口来与BSP进行交互,并通过BSP来访问真正的硬件
一般BSP主要包括两个方面的内容
- 引导加载程序Boot Loader
- 设备驱动程序
引导加载程序Boot Loader是嵌入式系统加电后运行的第一段软件代码,是在操作系统内核运行之前运行的一段小程序
- 通过这段程序,可以初始化硬件设备、建立内存空间的映射图
- 将系统的软硬件环境设置到一个合适的状态,为最终调用操作系统内核做准备
Boot Loader的实现高度依赖于具体的硬件平台,主要的基本功能如下
- 片级初始化
- 板级初始化
- 加载内核
片级初始化
- 主要完成微处理器的初始化
- 包括设置微处理器的核心寄存器和控制寄存器、微处理器的核心工作模式、局部总线模式等
- 把微处理器从上电的默认状态设置成系统要求的工作状态
- 纯硬件初始化过程
板级初始化
- 设置各种硬件寄存器来完成微处理器以外的其他硬件设备的初始化
- 设置某些软件的数据结构和参数
- 同时有软件和硬件的初始化过程
加载内核
- 将操作系统和应用程序的映像从Flash存储器复制到系统内存中
- 然后跳转到系统内核的第一条指令处继续执行
设备驱动程序
- 在一个嵌入式系统中,操作系统可能有也可能无,设备驱动是必不可少的
- 设备驱动程序,是一组库函数,用来对硬件进行初始化和管理,并向上层软件提供良好的访问接口
- 大多数设备驱动程序都具备下面的基本功能:启动、关闭、停用、启用、读操作、写操作
设备驱动程序的分层结构:把设备驱动程序中的函数分为硬件接口函数和调用接口函数
- 硬件接口:直接操作和控制硬件
- 上层接口:为上层软件提供服务和函数接口。不直接和硬件打交道,会调用硬件接口中的函数
- 优点:把所有与硬件相关的细节都封装在硬件接口中,在硬件需要升级,需要更新设备驱动程序的时候,只需要改动接口中的函数即可,而上层调用接口中的函数不用做任何修改
设备驱动程序的混合结构:
- 在设备驱动程序当中,没有明确的层次关系
- 上层接口和硬件接口函数混在一起、互相调用
嵌入式中间件
- 中间件:在操作系统内核、设备驱动程序和应用软件之外的所有系统软件
- 基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在它上面的那些应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台
- 特点:
- 可以有效地实现软件的可重用,降低应用软件的复杂性,提高系统的开发效率,缩短开发周期,节约开发成本和维护费用,保证了系统的高伸缩性、易升级性、稳定性
- 但会带来额外的开销
- 种类:
- 消息中间件
- 对象中间件
- 远程过程调用
- 数据库访问中间件
- 安全中间件等
嵌入式软件的运行流程
- 主要分为五个阶段
嵌入式操作系统概述
基本概念:嵌入式操作系统(Embedded Operating System,EOS):工作在嵌入式环境中的操作系统
基本功能
- 从软件开发的角度,可以把EOS看成是一种扩展机或虚拟机。将底层的硬件细节封装起来,为运行在它上面的软件提供了一个抽象的编程接口,即操作系统对外提供的系统调用函数
- 从系统管理的角度,可以把EOS看成是系统资源的管理者,负责管理系统当中的各种软硬件资源
特有功能
- 非通用型操作系统
- 在性能和实时性方面可能有严格的限制
- 能源、成本和可靠性通常是影响设计的重要因素
- 占用资源少
- 可裁剪、可配置
不同的嵌入式操作系统,包含的组件各不相同,但所有操作系统都会有一个内核(kernel),内核是指操作系统中的一个组件,它包含了OS的主要功能,即OS的各种特性及其相互之间的依赖关系
OS的主要功能:
- 任务管理:对系统中运行的软件进行描述和管理,并完成处理器资源分配和调度
- 存储管理:提高内存的利用率,方便用户使用,提供足够的存储空间
- I/O设备管理:方便设备的使用,提高CPU和I/O设备的利用率
- 文件管理:解决文件资源存储、共享、保密和保护等问题
不同嵌入式操作系统的内核设计各不相同,不一定包含所有的4个功能模块,取决于系统设计和实际需求
嵌入式操作系统的分类
- 按系统类型来分
- 商业系统:商业化的嵌入式操作系统
- 功能强大、性能稳定、应用范围相对较广、辅助软件齐全
- 价格较贵
- 如VxWorks、Windows CE、PalmOS
- 专用系统:专业厂家为本公司产品特制的嵌入式操作系统
- 开源系统:开放源代码的嵌入式操作系统
- 免费、开源、性能优良、资源丰富、技术支持强
- 如μC/OS、Linux系统
- 商业系统:商业化的嵌入式操作系统
- 按系统对响应时间的敏感程度来分
- 硬实时系统:系统对响应时间有严格要求,若响应时间不能满足,是绝对不允许的,会引起系统的崩溃或致命的错误
- 软实时系统:系统对响应时间有要求,若响应时间不能满足,会带来额外可接受的代价
- 非实时系统:响应时间没有严格要求,如分时操作系统,基于公平性原则,各进程分享处理器,获得大致相同的运行时间
- 按软件体系结构来分
- 单体结构(μC/OS)
- 分层结构(MS-DOS)
- 微内核结构(Vxworks)
- 这三类操作系统的差异体现在
- 内核的设计:内核中包含的功能组件
- 在系统中集成的其他系统软件
- 单体结构(monolithic):是一种常见的组织结构
- 中间件和设备驱动程序通常集中在系统内核中
- 系统只有一个可执行文件,包含所有功能组件,功能模块可相互调用
- 如Linux、Jbed RTOS、μC/OS、PDOS
- 优点:性能较好、系统各模块间可相互调用、通信开销较小
- 缺点:
- 操作系统体积庞大、高度集成、相互关联
- 系统裁剪、修改和调试都较困难
- 分层结构(layered):操作系统被划分为若干个层次(0~N),各个层次之间的调用关系是单向的,即某一层次上的代码只能调用比它低层的代码
- 只有一个大的可执行文件,包含有设备驱动程序和中间件
- 系统的开发和维护较为简单
- 要替换系统中的某一层时,不会影响到其他的层次
- 但每个层次都要提供一组API接口函数,带来额外的开销
- API(APPlication Programming Interface,应用程序编程接口):
- 是一些预先定义的函数
- 目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节
- API(APPlication Programming Interface,应用程序编程接口):
- 微内核结构:也称为客户/服务(client/server)结构,在内核中,把操作系统的大部分功能都剥离出去,只保留最核心的功能单元(如进程管理、存储管理)。如:OS-9、C Executive、VxWorks和QNX等。
- 优点:
- 内核非常小
- 易于扩展、调试方便:新的功能组件可以被动态添加
- 安全性更高:大部分的系统功能被放置在内核之外
- 可移植性
- 缺点:
- 通过微内核构造和发送信息、接受应答并解码所花费的时间比进行一次系统调用的时间多
- 很大程度取决于微内核的大小和功能
- 客户单元和服务器单元的内存地址空间是相互独立,在切换时候,会增加额外开销
- 优点:
- 按系统类型来分