1、.1、嵌入式系统的定义嵌入式系统是将计算机硬件和软件结合起来构成的一个专门的装置,这个装置可以完成一些特定的功能和任务,能够在没有人工干预的情况下独立地进行实时监测和控制。一般定义“以应用为中心,以计算机技术为基础,软件、硬件可裁减,功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统本身是一个相对模糊的定义。一个手持的 MP3、MP4 和一个 PC104 小型工控机都可以认为是嵌入式系统。总之,嵌入式系统采用“量体裁衣”的方式把所需的功能嵌入到各种应用系统中。体系结构为了有效组织和管理各种不同的设备,可以采用分层的思想,把 I/O 系统从上到下分为四层,分别为 API、设备管理
2、、驱动逻辑和硬件抽象。交叉开发环境需要使用交叉编译器,进行交叉开发。交叉编译器(Cross-compiler):是一种运行在通用计算机上的、但是能够生成在另一种处理器上运行的目标代码的编译器。交叉开发:在一台通用计算机上进行软件的编辑、编译,然后下载到嵌入式系统中运行调试。(1)流水线技术计算机中一条指令的执行可分为若干个阶段,由于每个阶段的操作相对都是独立的。因此可以采用流水线的重叠技术来大大提高系统的性能。在流水线装满以后,几个指令可以并行执行。这样可充分利用现有硬件资源,提高了 CPU 的运行效率。(3)总线和总线桥总线是 CPU 与存储器和设备通信的机制,是计算机各部件之间传送数据、地
3、址和控制信息的公共通道。/嵌入式系统软件结构一般包含 4 个层面:设备驱动层、操作系统 OS、中间层、应用程序层。也有些书籍将应用程序接口 API 归属于 OS 层。由于硬件电路的可裁减性和嵌入式系统本身的特点,其软件部分也是可裁减的。驱动层程序:是嵌入式系统中不可缺少的重要部分,使用任何外部设备都需要有相应驱动层程序的支持,它为上层软件提供了设备的接口。上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。/一般而言,开机后操作系统会初始化所有外设,如存储器控制器、计时器和输入/输出设备,并安装硬件中断服务子程序,以便处理这些设备所产生的各种信号;然后安装软件中断(由软件所产
4、生的中断) ,以便处理下面将介绍的系统调用(高级应用程序为请求操作系统服务所产生的调用) 。 系统调用是应用程序请求操作系统服务的一种机制,很像高级程序语言中的程序或函数调用,当程序需要操作系统服务时,会产生一个预定义的软件中断,由操作系统提供服务。请求服务所需的参数一般由应用程序通过 CPU 的寄存器传递给操作系统。中间层为上层软件提供了设备的操作接口。上层程序只需调用驱动程序提供的接口,而不用理会设备具体的内部操作。应用层 应用层软件主要由多个相对独立的应用任务组成每个应用任务完成特定的工作,如 I/O 任务、计算的任务、通信任务等,由操作系统调度各个任务的运行。应用层2、嵌入式软件系统的
5、体系结构硬件驱动层板级初始化FLASH 驱动 RTC/定时器驱动串口驱动以太网驱动 LCD驱动键盘驱动其他驱动应用任务 1应用任务 2应用任务 n操作系统层内核TCP/IP网络系统文件系统嵌入式 GUI电源管理嵌入式 CORBA 嵌入式 JAVA 嵌入式DCOM面向应用领域的中间件中间件层嵌入式 CRBA, 嵌入式 JAVA, 嵌入式 DCOM 面向应用领域的中间件3、嵌入式软件运行流程嵌入式程序的运行流程(上图)上电复位、板级初始化阶段嵌入式系统上电复位后完成板级初始化工作。板级初始化程序具有完全的硬件特性,一般采用汇编语言实现。不同的嵌入式系统,板级初始化时要完成的工作具有一定的特殊性,但
6、以下工作一般是必须完成的:CPU 中堆栈指针寄存器的初始化。BSS 段(Block Storage Space 表示未被初始化的数据)的初始化。CPU 芯片级的初始化:中断控制器、内存等。系统引导/升级阶段根据需要分别进入系统软件引导阶段或系统升级阶段。软件可通过测试通信端口数据或判断特定开关的方式分别进入不同阶段。系统引导阶段(三种)系统引导有几种情况:(1)将系统软件从 NOR Flash 中读取出来加载到 RAM 中运行:这种方式可以解决成本及Flash 速度比 RAM 慢的问题。软件可压缩存储在 Flash 中。(2)不需将软件引导到 RAM 中而是让其直接在 NorFlash 上运行
7、,进入系统初始化阶段。(3)将软件从外存(如 NandFlash、CF 卡、MMC 等)中读取出来加载到 RAM 中运行:这种方式的成本更低上电复位板级初始化远程升级系统升级引导/升级系统本地升级系统初始化基于多任务操作系统的嵌入式软件的主要运行流程该运行流程主要分为 5 个阶段多任务应用应用初始化系统升级阶段进入系统升级阶段后系统可通过网络进行远程升级或通过串口进行本地升级。远程升级一般支持 TFTP、FTP、HTTP 等方式。本地升级可通过 Console 口使用超级终端或特定的升级软件进行。5、集成开发环境(IDE)进行嵌入式系统开发时,选择合适的开发工具可以加快进度、降低开发成本。因此
8、,含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理以及函数库的集成开发环境 IDE 是必不可少的。 嵌入式软件开发的实现是在台式计算机上使用的交叉编译程序(cross compiler) 、交叉汇编程序(cross assembler)等可以完成这些工作。然后通过 JTAG、串口或网络接口定位下载到目标机上进行交叉编译和交叉调试。真正的差异存在于嵌入式系统的验证阶段(即测试最后的可执行文件) 。下面将介绍一下常用的几种开发工具。(1)常用的几种开发工具汇编程序(assembler ) 将汇编语言指令翻译成二进制机器指令,除了将操作码、操作数转换为相应的二进制编码外,汇编程序还将符
9、号标签转换为实际地址。编译程序(complier) 将结构化程序翻译成机器(或汇编)程序。结构化程序语言具有可以大大简化编程工作的高级结构(如循环结构) ,因此每个高级结构都可以转变成几条或数十条机器语言指令。编译程序技术应用了许多程序最优化技术,可以生成很大且性能很高的代码。交叉编译程序可以在开发处理器上运行,进而生成在目标处理器上执行的代码。操作系统可以简单分为通用操作系统和实时操作系统两类。我们平时在 PC机上使用的 Windows、Dos、Linux 等操作系统都属于通用操作系统。这类操作系统的任务类型多种多样,它们一般比较强调系统的运行效率。实时操作系统就是“ 在给定的时间内提供某种
10、程度的服务,如果在规定的时间内没有得到结果,那整个的系统就是失败” 。对于实时操作系统其首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼提高计算机系统的使用效率。随着硬件实时性要求的提高,嵌入式系统的软件规模也不断扩大,逐渐形成了实时多任务操作系统(RTOS) ,并开始成为嵌入式系统的主流。这一阶段嵌入式系统的主要特点是:操作系统的实时性得到了很大改善,已经能够运行在各种不同类型的微处理器上,具有高度的模块化和扩展性。此时的嵌入式操作系统已经具备了文件和目录管理、设备管理、多任务、网络、图形用户界面(GUI)等功能,并提供了大量的应用程序接口(API) ,从而使得应用软件的开发变得更
11、加简单。(1)多任务一个任务也称作一个线程,是一个简单的运行程序。每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套 CPU 寄存器和自己的栈空间多任务运行的实现,实际上是靠 CPU(中央处理单元)在许多任务之间转换、调度。CPU 只有一个,轮番服务于一系列任务中的某一个。多任务运行使 CPU 的利用率得到最大的发挥,并使应用程序模块化。在实际应用中,多任务的最大特点是,开发人员可以将很复杂的应用程序层次化.(2)任务的事件驱动通用操作系统只注重平均性能,所有任务的平均响应时间是关键,并不关心单个任务的响应时间。而嵌入式实时系统是指在一个确定的时间内,实现系统功能并做出
12、及时响应的系统。在实时系统中主要有三个指标来衡量系统的实时性,即响应时间(Response Time) 、生存时间(Survival Time ) 、吞吐量( Throughput) 。响应时间(Response Time ):是计算机识别一个外部事件到作出响应的时间,在控制应用中它是最重要的指标,如果事件不能及时的处理,系统可能就会崩溃。生存时间(Survival Time ):是数据有效等待时间,在这段时间里数据是有效的。吞吐量(Throughput):是在一给定时间内(秒) ,系统可以处理的事件总数。例如通讯控制器用每秒钟处理的字符数来表示吞吐量,吞吐量是平均响应时间的倒数。首先介绍一下
13、任务优先级的种类,每个任务都有其优先级(priority) ,静态优先级和动态优先级。应用程序执行过程中,如果各任务优先级不变,则称之为静态优先级。在静态优先级系统中,各任务以及它们的时间约束在程序编译时是已知的。任务实时任务非实时任务事件驱动时间驱动内部事件:运算结果、设备请求等外部事件:开关量输入等绝对时间驱动相对时间驱动应用程序执行过程中,如果任务的优先级是可变的,则称之为动态优先级。(4) 非占先式调度法与占先式调度法非占先式(non-preemptive )式调度法非占先式也称作合作型多任务(cooperative multitasking) ,各个任务彼此合作共享一个CPU。中断服
14、务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃 CPU 的使用权时,那个高优先级的任务才能获得 CPU 的使用权。非占先式内核的一个特点是几乎不需要使用信号量保护共享数据。正在运行着的任务占有 CPU,而不必担心被别的任务抢占。非占先式内核的最大缺陷在于其响应高优先级的任务慢,中断优先级高的任务虽然已经进入中断就绪状态,但还不能立即运行,也许还需要等很长时间,直到当前正在运行的任务释放 CPU。内核的任务及响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到 CPU 的控制权,完全取决于当前被中断的任务什么时候释放
15、 CPU。占先式(抢先式)preemptive)当系统响应时间很重要时,要使用占先式内核。最高优先级的任务一旦就绪,总能得到CPU 的控制权。即当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的 CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了 CPU 的控制权。使用占先式内核时,应用程序应使用可重入型函数,这样在被多个任务同时调用,而不必担心会破坏数据。嵌入式操作系统的分类:主要有实时系统、分时系统(非实时系统)和顺序执行系统。其中实时系统又分为硬(强)实时和软(弱)实时系统。 (1)实时操作系统:系统内有多个程序运行,每个程序有不同的优先级,只有最高优
16、先级的任务才能占有 CPU 的控制权。(2)分时操作系统:系统内同时可以有多个程序运行,把 CPU 的时间分按顺序分成若干片,每个时间片内执行不同的程序,如 UNIX。(3)顺序执行系统:系统内只含有一个程序,独占 CPU 的运行时间,按语句顺序执行该程序,直至执行完毕,另一程序才能启动运行。如 DOS 操作系统。嵌入式微处理器采用精简指令集系统 RISC 与复杂指令集系统 CISC 的比较CISC:价格:由硬件完成部分软件功能,硬件复杂性增加,芯片成本高性能:减少代码尺寸,增加指令的执行周期数指令集:大量的混杂型指令集,有简单快速的指令,也有复杂的多周期指令,符合HLL(high level language )高级语言支持:软件完成寻址模式:复杂的寻址模式,支持内存到内存寻址控制单元:微码寄存器数目:寄存器较少RIsc:1:由软件完成部分硬件功能,软件复杂性增加,芯片成本低2:使用流水线降低指令的执行周期数,增加代码尺寸3:简单的单周期指令,在汇编指令方面有相应 CISC 微代码指令4:硬件完成5:简单的寻址模式,仅允许 LOAD 和 STORE 指令存取内存,其它所有的操作都基于寄存器到寄存器6:直接执行7:寄存器较多片内总线:或内部总线:连接 CPU 内部各主要功能部件片外总线:CPU 与存储器(RAM 和 ROM)和 I/O 接口之间进行信息交换的通道