大工13春《嵌入式原理与开发》第二章 嵌入式系统软件基础
大工13春《嵌入式原理与开发》第二章嵌入式系统软件基础主 题:第二章嵌入式系统软件基础(第2.2节)
学习时间:4月29日-5月5日
内 容:
第二章嵌入式系统软件基础,嵌入式软件系统简介和嵌入式操作系统概述
这周我们将学习第2章中的第2.2节,这部分重点介绍嵌入式系统的软件部分,下面整理出的理念框架供同学们学习。
2.2.1 软件系统概述
软件(software)是计算机系统中与硬件(hardware)相互依存的另一部分。
主要由:程序(program)、相关数据(data)及其说明文档(document)组成。
程序是按照事先设计的功能和性能要求执行的指令序列。
数据是程序能正常操纵信息的数据结构。
文档是与程序开发维护和使用有关的各种图文资料。
嵌入式软件系统概述
嵌入式系统软件也是嵌入式系统的核心之一,它由嵌入式操作系统及相应的各种应用软件构成。
面向嵌入式系统的软件有以下特点:
编码体积小,在嵌入式系统的有效存储空间运行;
面向应用,可裁减和移置;
实时性强,有时也称为实时多任务操作系统RTOS;
可靠性高,无需人工干预独立运行,并处理不同时间的故障。
1.嵌入式软件系统的分类
从功能来分,嵌入式软件可以分为:
1.嵌入式软件系统的分类
从运行平台来分,嵌入式软件可以分为:
运行在开发平台上的软件:
设计、开发、测试等工具。
运行在嵌入式系统上的软件:
嵌入式操作系统、应用程序、驱动程序等。
2.嵌入式软件系统的体系结构
(1)驱动层
驱动层是嵌入式系统中不可缺少的重要部分,由各设备、资源的驱动程序构成。
使用任何外部设备都需要有相应驱动程序的支持。
它为上层软件提供了设备的接口:
上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。
驱动层一般包括硬件抽象层HAL(提高系统的可移植性)、板极支持包BSP(提供访问硬件设备寄存器的函数包)和设备驱动程序。
驱动程序
处理器内集成的资源的驱动程序:
目前操作系统内核所需的硬件支持一般都已集成在嵌入式微处理器中了,因此操作系统厂商提供的内核驱动一般不用修改。
与特殊应用相关的驱动程序:
由于扩展处理器之外的资源的方法不为一,特别是非标准的资源,这些驱动的设计和开发由应用决定。
(2)操作系统OS层
在设计较复杂的程序时,可能就需要一个操作系统(OS)来管理和控制内存、多任务、周边资源等。
在设计一个简单的应用程序时,可以不使用操作系统。仅有应用程序和设备驱动程序。
比如一个指纹识别系统只是完成简单的指纹录入和指纹识别,它在指纹识别的过程中需要高速的算法,所以需要32位处理器。
它的任务并不复杂,也不牵连什么复杂的协议和管理,对于这样的系统就没有安装操作系统的必要。
操作系统的特点
优点1:隐藏硬件细节,而只提供给应用程序开发人员一个个抽象的接口。
用户只需要和这些抽象接口打交道,而不用在意这些抽象的接口和函数是如何与物理资源相联系的,也不用去管那些功能是如何通过操作系统调用具体的硬件资源来完成的。
优点2:相应的应用程序具有较强的兼容性。
当硬件体系发生变化,只要在新的硬件体系下还运行着同样的操作系统,那么原来的程序还能不做修改,完成原有的功能。
操作系统OS层构成
整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多.
操作系统OS层的裁剪与优化
其中嵌入式内核是基础和必备的部分,是不可被采集的,只能进行优化。
内核通常必需的基本部件:
进程管理、进程间通信、内存管理等部分
其他部件如文件系统、驱动程序、网络协议等都可根据用户要求进行配置,并以相关的方式实现。
相关配置包括:各个部分内部资源的裁剪、更新,各部分根据实际应用需求可以完全被裁减掉。
进程调度与资源管理
系统中最重要的资源是中央处理单元(CPU),是由很多正在执行的程序所共用。
操作系统负责确定可在CPU上执行的程序及其执行时间的长短,此功能称为进程调度。
调度的方法由操作系统所定的优先策略决定。
另一个很重要的资源是存储器,包括存储空间,这些也由在CPU上执行的应用程序共享。
因此,同样需要操作系统确定上述资源在多程序并发执行时,使用的共享、互斥 。
系统调用
系统调用是应用程序请求操作系统服务的一种机制。
当程序需要操作系统服务时,会产生一个预定义的软件中断,由操作系统提供服务。
请求服务所需的参数一般由应用程序通过CPU的寄存器传递给操作系统。
操作系统的应用程序接口API
基于API的调用:
在系统中有很多可通过硬件或外部设备去执行的功能,这些功能的执行可通过操作系统或硬件预留的标准指令调用。
操作系统的应用程序接口API
基于API进行开发,软件人员在编制应用程序时:
不需要为各种通过硬件或外设执行的功能而重新编制程序;
只需按系统或某些硬件事先提供的API函数调用即可完成功能的执行。
操作系统包含标准API函数,提供了大量的常用模块。
可加快用户应用程序的开发;
统一应用程序的开发标准;
也为操作系统版本的升级带来了方便。
操作系统小结
操作系统实现:
为应用程序管理提供运行环境;
管理系统资源;
提供各种硬件中断服务所需的软件;
以及驱动系统中存在的外设驱动程序。
3)中间件层(Middleware )
处于操作系统和应用程序之间的软件:
屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性。
中间件=平台+通信
目前在一些复杂的嵌入式系统中也开始采用中间件技术,主要包括嵌入式CORBA、嵌入式Java、嵌入式DCOM和面向应用领域的中间件软件。
(4)嵌入式应用程序
应用层
应用层软件主要由多个相对独立的应用程序(任务)组成
每个应用任务完成特定的工作,如I/O任务、计算的任务、通信任务等,由操作系统调度各个任务的运行。
用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户应用功能开发。在用户的应用程序中,也可创建用户自己的任务。
引导程序(Boot Loader)介绍
Boot Loader是系统加电后首先运行的一段代码。
功能:
将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好正确的环境。
对于不使用操作系统的嵌入式系统而言,应用程序的运行同样也需要依赖它。
主要任务:
对目标机系统的硬件进行初始化、建立内存空间的映射图的程序,还要将系统的操作系统和应用程序从FLASH存储器加载到SDRAM存储器中,使系统的软硬件为运行程序做好准备。
引导程序(Boot Loader)介绍
Boot Loader是系统加电后首先运行的一段代码。
功能:
将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好正确的环境。
对于不使用操作系统的嵌入式系统而言,应用程序的运行同样也需要依赖它。
主要任务:
对目标机系统的硬件进行初始化、建立内存空间的映射图的程序,还要将系统的操作系统和应用程序从FLASH存储器加载到SDRAM存储器中,使系统的软硬件为运行程序做好准备。
Boot Loader特点
每种嵌入式微处理器体系结构都有不同的Boot Loader。
即使是基于相同嵌入式微处理器构建不同嵌入式目标板也要修改Boot Loader的源程序。
Boot Loader只有几十KB的大小,其作用相当于普通PC机的BIOS。
Boot Loader的组成原理
由于有些嵌入式系统中Boot Loader分为阶段1和阶段2两部分。
依赖于CPU的体系结构的代码,如设备初始化代码等,通常都放在阶段1中,通常用汇编语言来实现,以达到短小精悍的目的。
而阶段2通常用C语言来实现,这样可以实现一些复杂的功能,而且代码会具有更好的可读性和移植性。
阶段1完成的功能
1)基本的硬件初始化,包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、关闭CPU内部指令/数据Cache。
2)为加载阶段2准备RAM空间,由于阶段2通常是C语言执行代码,因此在考虑空间大小时还要把堆栈空间也考虑进来。一般而言1M的RAM已经足够了。
阶段1完成的功能
3)拷贝阶段2到RAM中,拷贝时要确定阶段2的可执行映象在固态存储设备的存放起始地址和终止地址。还有RAM空间的起始地址。
4)设置堆栈指针SP,一般安排在所预留1M RAM空间的最顶端(堆栈向下生长)
5)跳转到阶段2的C入口点。
Boot Loader阶段2其主要步骤
1)初始化本阶段要使用到的硬件设备。
2)检测系统内核映射。
3)加载内核映象和根文件系统映象,包括规划内存占用的布局和从Flash将系统下载到RAM空间中。
4)设置内核的启动参数。
5)跳转到内核映像入口并执行内核程序。
6)系统的软件设置,更新系统(system.bin)
下载模式
目标机中的Boot Loader 通过串口或网络连接等通信手段从宿主机上下载文件,如操作系统的内核映像和根文件的映像等。
这种模式通常在第1次安装操作系统内核和根文件系统时被使用,另外系统更新时也会使用这种方式。
工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。
启动加载模式
Boot Loader 从目标机的固体存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
最终从用户使用的角度看,Boot Loader 的作用就是用来加载操作系统。
启动加载模式
Boot Loader 从目标机的固体存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
最终从用户使用的角度看,Boot Loader 的作用就是用来加载操作系统。
集成开发环境(IDE)
集成开发环境IDE主要包含:编辑程序、编译程序、汇编程序、链接程序、调试程序、工程管理以及函数库的。
进行嵌入式系统开发时,选择合适的开发工具可以加快进度、降低开发成本。
ARM的集成开发环境ADS/SDT
ADS由ARM公司推出的编译器。
以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。
目前常用版本:
SDT 2.5(ARM Software Development Toolkit)
ADS 1.1/1.2(ARM Developer Suite)
RealView MDK
ARM 将Keil 公司收购之后,正式推出了针对ARM 微控制器的开发工具RealView Microcont roller Development Kit ( 简称Real View MDK 或者MDK) 。
它将ARM 开发工具RealView Development Suite (简称RVDS) 的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM 微控制器开发工具。
GNU ARM开发工具
GNU是“GNU‘s Not Unix”的递归缩写。在1983年9月27日由Richard Stallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。
GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统。
基于ARM平台的GNU编译工具有主要包含:
GNU的汇编器AS
交叉汇编器GCC
连接器LD
3.嵌入式软件运行流程 上电复位、板级初始化阶段
嵌入式系统上电复位后完成板级初始化工作。
板级初始化程序具有完全的硬件特性,一般采用汇编语言实现。
不同的嵌入式系统,板级初始化时要完成的工作具有一定的特殊性,但以下工作一般是必须完成的:
CPU中堆栈指针寄存器的初始化。
BSS段(Block Storage Space表示未被初始化的数据)的初始化。
CPU芯片级的初始化:中断控制器、内存等。
系统引导/升级阶段
根据需要分别进入系统软件引导阶段或系统升级阶段。
软件可通过测试通信端口数据或判断特定开关的方式分别进入不同阶段。
系统引导阶段
系统引导有几种情况:
将系统软件从NOR Flash中读取出来加载到RAM中运行:这种方式可以解决成本及Flash速度比RAM慢的问题。软件可压缩存储在Flash中。
不需将软件引导到RAM中而是让其直接在NorFlash上运行,进入系统初始化阶段。
将软件从外存(如NandFlash、CF卡、MMC等)中读取出来加载到RAM中运行:这种方式的成本更低。
系统升级阶段
进入系统升级阶段后系统可通过网络进行远程升级或通过串口进行本地升级。
远程升级一般支持TFTP、FTP、HTTP等方式。
本地升级可通过Console口使用超级终端或特定的升级软件进行。
系统初始化阶段
在该阶段进行操作系统等系统软件各功能部分必需的初始化工作,如根据系统配置初始化数据空间、初始化系统所需的接口和外设等。
系统初始化阶段需要按特定顺序进行,如首先完成内核的初始化,然后完成网络、文件系统等的初始化,最后完成中间件等的初始化工作。
嵌入式软件运行流程
应用初始化阶段
在该阶段进行应用任务的创建,信号量、消息队列的创建和与应用相关的其它初始化工作。
多任务应用运行阶段
各种初始化工作完成后,系统进入多任务状态,操作系统按照已确定的算法进行任务的调度,各应用任务分别完成特定的功能。
测试、调试阶段
测试和调试阶段是整体设计流程的主要部分,尤其是开发将在嵌入式系统执行的程序。
在编写大型程序时存在错误和缺陷是难免的。验证程序正确性的最常用、最简单的方法是运行程序。
例如:在运行过程中应使用大量输入数据,以检查系统的行为,或检查边界情况。
测试的方法 利用指令集仿真程序调试
主要利用调试程序(debugger)帮助程序员评估并更正程序。
调试程序在宿主机处理器(PC机)上执行,并支持单步执行、设置断点等。在调试过程中,使用者可检查各存储器地址和寄存器中的值。
特点:
使用在开发计算机上执行的调试程序,其设计周期很快,但较不精确,因为它与系统中其他部分以及环境的交互有限。
利用硬件仿真器仿真
使用硬件仿真器时的调试时间要长一些,这是因为程序代码必须下载到仿真器的硬件中后才可以进行仿真调试。
但硬件仿真器可以与系统的其他部分实时交互,其测试更精确。
下载到目标处理器做现场测试
利用JTAG下载器将程序下载到目标处理器。周期是三种方法中最长的。
调试过程:
每次调试时必须将经编译和连接后的目标代码程序下载到应用系统中后,启动系统进行实际观察,如发现错误后,再返回到宿主机上重新编辑修改和编译下载。需多次反复,直到运行无误。
优点:让系统和环境可以自由交互,能提供最高的执行精确度。一般具有一定调试经验的工程师常采用此方法。
2.2.2 嵌入式实时操作系统简介
通用操作系统 :
在PC机上使用的Windows、Dos、Linux等操作系统都属于通用操作系统。一般比较强调系统的运行效率。
实时操作系统:
“在给定的时间内提供某种程度的服务,如果在规定的时间内没有得到结果,那整个的系统就是失败”。
对于实时操作系统其首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼提高计算机系统的使用效率。
1.实时多任务操作系统(RTOS)
实时操作系统的特点:多任务
中断与中断优先级
2.嵌入式操作系统体系结构
体系结构是操作系统的基础,它定义了硬件与软件的界限、内核与操作系统其它组件(文件、网络、GUI等)的组织关系、系统与应用的接口。
体系结构是确保系统的性能、可靠性、灵活性、可移植性、可扩展性的关键,就好比房子的梁架,只有梁架搭牢固了才提得上房子的质量,再做一些锦上添花的工作才有意义。
目前操作系统的体系结构可分为:单块结构、层次结构和客户/服务器(微内核)结构。
微内核结构的优点
提供一致的接口
可扩展性:扩展对新的软件/硬件支持
灵活性:可伸缩
可移植性
分布式系统支持
适用于面向对象操作系统环境
性能问题
通过微内核构造和发送信息、接受应答并解码所花费的时间比进行一次系统调用的时间多
很大程度取决于微内核的大小和功能
1)嵌入式操作系统的组成
2)嵌入式内核
(1) 内核是嵌入式操作系统的基础,也是必备的部分。
(2) 内核还提供特定的应用编程接口,但目前没有统一的标准。
嵌入式内核:任务管理
内核的核心部分,具有任务调度、创建任务、删除任务、挂起任务、解挂任务、设置任务优先级等功能。
通用计算机的操作系统追求的是最大的吞吐率,为了达到最佳整体性能,其调度原则是公平,采用Round-Robin或可变优先级调度算法,调度时机主要以时间片为主驱动。
而嵌入式操作系统多采用基于静态优先级的可抢占的调度,任务优先级是在运行前通过某种策略静态分配好的,一旦有优先级更高的任务就绪就马上进行调度。
嵌入式内核:内存管理
嵌入式操作系统的内存管理比较简单。
通常不采用虚拟存储管理,而采用静态内存分配和动态内存分配(固定大小内存分配和可变大小内存分配)相结合的管理方式。
有些内核利用MMU机制提供内存保护功能。
通用操作系统广泛使用了虚拟内存的技术,为用户提供一个功能强大的虚存管理机制。
嵌入式内核:通信、同步和互斥机制
这些机制提供任务间、任务与中断处理程序间的通信、同步和互斥功能。
一般包括信号量、消息、事件、管道、异步信号和共享内存等功能。
与通用操作系统不同的是,嵌入式操作系统需要解决在这些机制的使用中出现的优先级反转问题。
嵌入式内核:中断管理
一般具有以下功能:
安装中断服务程序
中断发生时,对中断现场进行保存,并且转到相应的服务程序上执行
中断退出前,对中断现场进行恢复
中断栈切换
中断退出时的任务调度
嵌入式内核:时间管理
提供高精度、应用可设置的系统时钟,该时钟是嵌入式系统的时基,可设置为十毫秒以下。
提供日历时间,负责与时间相关的任务管理工作如任务对资源有限等待的计时、时间片轮转调度等,提供软定时器的管理功能等。
通用操作系统的系统时钟的精度由操作系统确定,应用不可调,且一般是几十个毫秒。
嵌入式内核:任务扩展功能
任务扩展功能就是在内核中设置一些Hook的调用点,在这些调用点上内核调用应用设置的、应用自己编写的扩展处理程序,以扩展内核的有关功能。
Hook调用点有任务创建、任务切换、任务删除、出错处理等。
嵌入式TCP/IP
TCP/IP协议已经广泛地应用于嵌入式系统中
嵌入式TCP/IP网络系统提供符合TCP/IP协议标准的协议栈,提供Socket编程接口。
嵌入式TCP/IP网络系统具有以下的特点:
可剪裁:
能根据嵌入式系统的功能的要求选择所需的协议,对完整的TCP/IP协议簇进行剪裁,以满足用户的需要。
采用“零拷贝”(Zero Copy)技术,提高实时性
所谓“零拷贝”技术,是指TCP/IP协议栈没有用于各层间数据传递的缓冲区,协议栈各层间传递的都是数据指针,只有当数据最终要被驱动程序发送出去或是被应用程序取走时,才进行真正的数据搬移。
采用静态分配技术
在网络初始化时就静态分配通信缓冲区,设置了专门的发送和接收缓冲(其大小一般小于或等于物理网络上的MTU值),从而确保了每次发送或接收时处理的数据不会超过MTU值,也就避免了数据处理任务的阻塞等待。
嵌入式文件系统
通用操作系统文件系统通常具有以下功能:
提供用户对文件操作的命令
提供用户共享文件的机制
管理文件的存储介质
提供文件的存取控制机制,保障文件及文件系统的安全性
提供文件及文件系统的备份和恢复功能
提供对文件的加密和解密功能
嵌入式文件系统
嵌入式文件系统相比之下较为简单,主要具有文件的存储、检索、更新等功能,一般不提供保护和加密等安全机制。
它以系统调用和命令方式提供对文件的各种操作,主要有:
设置和修改对文件和目录的存取权限
提供建立、修改、改变、删除目录等服务
提供创建、打开、读、写、关闭、撤消文件等服务
3.实时系统的评价指标
响应时间(Response Time)
生存时间(Survival Time)
吞吐量(Throughput)
4.任务调度这是操作系统的主要职责之一,它决定该轮到哪个任务运行了。
往往调度是基于任务的优先级,根据其重要不同被赋予任务不同的优先级。 CPU总是让处在就绪态的优先级最高的任务先运行。
何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是非占先式的还是占先式的内核
(1) 任务优先级(priority)
(2) 非占先式调度法与占先式调度法
非占先式调度法的特点
(3) 非占先式内核的一个特点是几乎不需要使用信号量保护共享数据。
(4) 正在运行着的任务占有CPU,而不必担心被别的任务抢占。
缺陷:
(5) 非占先式内核的最大缺陷在于其响应高优先级的任务慢,中断优先级高的任务虽然已经进入中断就绪状态,但还不能立即运行,也许还需要等很长时间,直到当前正在运行的任务释放CPU。
(6) 内核的任务及响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于当前被中断的任务什么时候释放CPU。
占先式(抢先式)
当系统响应时间很重要时,要使用占先式内核。
最高优先级的任务一旦就绪,总能得到CPU的控制权。
即当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。
使用占先式内核时,应用程序应使用可重入型函数,这样在被多个任务同时调用,而不必担心会破坏数据。
2.2.3 常用的嵌入式操作系统概述
简单的嵌入式系统可以不使用操作系统,被称为裸机设计,如8位单片机。
复杂的系统常常使用嵌入式操作系统,这样的系统一般可以扩展程序存储器,资源相对较多,系统实现的功能比较复杂,软件开发的工作量和开发难度比较大,维护费用较高。
使用嵌入式操作系统可以有效的提高这些系统的开发效率。
1.嵌入式操作系统的演变
在嵌入式系统的发展过程中,从操作系统的角度来看,大致经历了以下几个阶段:
无操作系统阶段
简单操作系统阶段
实时操作系统阶段
面向Internet的阶段
2.uC/OS-II操作系统简介
3.Linux操作系统简介
4.Windows CE操作系统
5.VxWorks
习题
1.典型嵌入式系统软件系统的组成?
程序(program)、相关数据(data)及其说明文档(document)组成。
2,嵌入式系统的软件系统中,其操作系统的优点是什么?
优点1:隐藏硬件细节,而只提供给应用程序开发人员一个个抽象的接口。
用户只需要和这些抽象接口打交道,而不用在意这些抽象的接口和函数是如何与物理资源相联系的,也不用去管那些功能是如何通过操作系统调用具体的硬件资源来完成的。
优点2:相应的应用程序具有较强的兼容性。
当硬件体系发生变化,只要在新的硬件体系下还运行着同样的操作系统,那么原来的程序还能不做修改,完成原有的功能。
3,嵌入式操作系统的组成部分是什么?列举三个
嵌入式内核,嵌入式TCP/IP,嵌入式文件系统
4,列举几个常见的嵌入式操作系统
uC/OS-II操作系统Linux操作系统简介 Windows CE操作系统 VxWorks操作系统。
页:
[1]