嵌入式软件
1.什么是嵌入式软件[1]
嵌入式软件是嵌入在硬件中的操作系统和开发工具软件,它在产业中的关联关系体现为:芯片设计制造,嵌入式系统软件,嵌入式电子设备开发、制造。
2.嵌入式软件的特点[1]
(1)嵌入式软件具有独特的实用性。嵌入式软件是为嵌入式系统服务的,这就要求它与外部硬件和设备联系紧密。嵌入式系统以应用为中心,嵌入式软件是根据应用需求定向开发,因此每种嵌入式软件都有自己独特的应用性和实用价值。
(2)嵌入式软件应有灵活的适用性。嵌入式软件通常可以认为是一种模块化软件,它能非常方便灵活的运用到各种嵌入式系统中,而不能破坏或更改原有的系统特性和功能。使用灵活,配置优化,升级更换灵活方便。
(3)嵌入式软件具有较高的安全性。为单一嵌入式设备开发病毒和木马比较得不偿失,开发难度也较大。
(4)嵌入式软件具有可靠的小巧性。嵌入式软件嵌入在ROM、RAM和/或FI。ASH存储器中,而不是存贮于磁盘等载体中。要求软件小巧,占用资源少,软件代码紧凑,可靠。
3.嵌入式软件的分类[2]
按软件实现功能划分,嵌入式软件通常可以分为以下3大类。
1.嵌入式应用软件
这类软件是专门针对特定应用领域的计算机软件。嵌入式应用软件和普通应用软件有一定的区别,它不仅要求其准确性、安全性和稳定性等方面能够满足实际应用的需要,还要尽可能地对其进行优化,以减少对系统资源的消耗,降低硬件成本。
2.嵌入式系统软件
控制和管理嵌入式系统资源,为嵌入式应用软件提供各种软件支持,如设备驱动程序、嵌入式操作系统、嵌入式中间件(协议层软件)等。
3.嵌入式支撑软件
帮助和支持软件开发的工具软件,如嵌入式移动数据库、嵌入式Web、SNMP代理、系统分析设计工具、在线仿真工具、交叉编译器、源程序模拟器和工程管理工具等。
需要明确的是,系统软件和应用软件都是运行在嵌入式硬件设备上的,即最终运行
在目标平台上,而支撑软件大部分都是运行在开发平台(通常是运行Windows或者Linux操作系统的PC)上,为开发人员提供各种应用开发库、板级支持包(Board Support Packet,BSP)、标准的软件构件以及开发、调试的帮助软件。
4.嵌入式软件的体系结构[3]
1.无操作系统的情形
早期的嵌入式系统硬件配置比较低,主要应用在控制领域,基本不需要系统软件的支持。所以早期嵌入式软件的设计以应用为核心,应用软件直接建立在硬件上,规模也很小,没有专门的操作系统,基本上属于硬件的附属品。无操作系统嵌入式软件的具体实现方式主要有两种:循环轮换和前后台系统。
1)循环轮换
循环轮换方式的基本思路是:把系统的功能分解为若干个不同的任务,然后把它们包含在一个永不结束的循环语句当中,按照顺序逐一执行。当执行完一轮循环后,又回到循环体的开头重新执行。
循环轮换方式的优点是简单、直观、开销小、可预测。软件的开发就是一个典型的基于过程的程序设计问题,可以按照自顶向下、逐步求精的方式,将系统要完成的功能逐级划分成若干个小的功能模块,像搭积木一样搭起来。由于整个系统只有一条执行流程和一个地址空间,不需要任务之间的调度和切换,因此系统的管理开销很少。而且由于程序的代码固定,函数之间的调用关系也是明确的,故整个系统的执行过程可预测,这对于一些实时控制系统来说非常重要。
循环轮换方式的缺点是过于简单,所有的代码都必须按部就班地顺序执行,无法处理异步事件,缺乏并行处理的能力。而在现实世界当中,事件都是异步并行出现的,而且有些事件比较紧急,当它们发生时,必须马上进行处理,不能等到下一轮循环。另外,这种方案没有硬件上的时间控制机制,无法实现定时功能。
2)前后台系统
前后台系统就是在循环轮换方式的基础上,增加了中断处理功能。中断服务程序构成前台程序,负责处理异步事件,称为事件处理级程序。后台程序一般是一个无限的循环,负责掌管整个嵌入式系统软、硬件资源的分配、管理以及任务调度,是一个系统管理调度程序,称为任务级程序。在系统运行时,后台程序会检查每个任务是否具备运行条件,通过一定的调度算法来完成相应的操作。而对于实时性要求特别严格的操作通常由中断来完成。为了提高系统性能,大多数中断服务程序只做一些最基本的操作,其余的事情会延迟到后台程序去完成,这样就不会因为在中断服务程序中耽误太长时间而影响到后续和其他中断。实际上,前后台系统的实时性比预计要差。这是因为前后台系统认为所有任务具有相同的优先级别,即是平等的,而且任务的执行又是通过先进先出的队列排队,因而对那些实时性要求很高的任务不能立刻进行处理。
2.有操作系统的情形
利用操作系统,应用程序的开发不是直接面对嵌入式硬件设备,而是在操作系统的基础上编写,易于实现功能复杂、系统庞大的应用。
这种方式可以提高系统的可靠性,当应用程序产生异常、出错,甚至死循环时,在嵌人式操作系统的管理下,只会引起系统中的某一个进程被破坏,可通过系统的监控进程对其进行修复。在嵌入式操作系统环境下,开发应用程序具有很大的灵活性,操作系统本身可以裁减外设,相关应用也可以配置,软件可以在不同的应用环境、处理器芯片之间移植。同时,一个复杂的应用程序可分解为多个任务模块,每个任务模块的调试、修改几乎不影响其他模块,任务模块可复用,大大提高了系统的开发效率。
图1说明了嵌入式软件的体系结构。由图可见,嵌入式硬件之上依次为设备驱动层、操作系统层、中间件层和应用软件层。设备驱动层负责与硬件直接打交道,实现对A/D转换、计数器、程控信号发生器等硬件的操作,并为上层软件提供所需的驱动支持。操作系统层包括基本部分和扩展部分。前者是操作系统的核心,负责整个系统的任务调度、存储管理、时钟管理和中断管理等功能,这一部分是基础和必备的。后者是系统为用户提供的一些扩展功能,包括网络、文件系统、图形用户界面GUI、数据库等,这一部分的内容可以根据系统的需要来进行裁减。中间件层为应用软件层提供一些对操作系统的便捷服务和广泛使用的库函数,如常用的数据运算函数、数据格式的变换函数以及数据表格图线的绘制函数等。应用软件层则是实现具体应用功能的用户程序,根据不同的测量任务,应用程序以合适的形式表示出测量的结果,如类似示波器的波形显示或以频域谱线的形式显示FFT分析的结果等。5.嵌入式软件的开发[4]
嵌入式软件开发的过程主要包括三个步骤:生成、调试和固化运行。
1.嵌入式软件的生成
嵌入式软件的生成主要是在宿主机上进行,利用各种工具完成对应用程序的编辑、交叉编译和链接工作,生成可供调试或固化的目标程序。主要包括三个过程(如图1所示):·源代码程序的编写;
·编译成各个目标模块;
·链接成可供下载调试或固化的目标程序。
2.嵌入式软件的调试
嵌入式软件的调试是通过交叉调试器来完成的,调试完成后还需进行必要的测试工作。交叉调试器是指调试程序和被调试程序运行在不同机器上的调试器,调试器通过某种方式能控制目标机上被调试程序的运行方式,通过调试器能查看和修改目标机上的内存、寄存器以及被调试程序中的变量等。主要的交叉调试方式有以下几种。
(1)Crash and Burn
Crash and Burn是最早的嵌入式应用软件调试方法,也是最简单的。这种方式主要靠程序员的主观判断。图3是这种方式的示意图。(2)ROM Monitor
ROM Monitor是被固化且运行在目标机上的一段程序,负责监控目标机上被调试程序的运行,与宿主机端的调试器一起完成对应用程序的调试。调试器与ROM Monitor之间的通信遵循远程调试协议。这种调试方式如图4所示。这种方式的主要优点是:
·简单、方便;
·可扩展性强,可支持许多高级调试功能;
·成本低廉,不需专门的调试硬件支持;
·几乎所有的交叉调试器都支持这种方式。
缺点是:
·Debug Monitor需要用Crashand Burn方法开发;
·当ROM Monitor占用CPU时,应用程序不响应外部的中断,因此不便调试有时间特性的程序;
·ROM Monitor要占用目标机一定数量的资源,如CPU、RAM、ROM和通信设备等资源;
·调试环境不同于实际目标环境。
(3)ROM Emulator
ROM Emulator是一种用于替代目标机上的ROM芯片的设备,即ROM仿真器。利用这种设备,目标机可以没有ROM芯片,但目标机的CPU可以读取ROM Emulator设备上ROM芯片的内容:ROM Emulator设备上的ROM芯片的地址可以实时地映射到目标机的ROM地址空间,从而仿真(Emulation)目标机的ROM。
ROM Emulator的调试方式是一种不完全的调试方式:ROM Emulator设备只是为目标机提供ROM芯片及在Target和Host间建立一条高速的通信通道,因此它经常和前面两种调试方式结合起来形成一种完备的调试方式。ROM Emulator的典型应用就是和ROM Monitor的调试方式相结合。
这种调试方式的优点是:保证调试版本与最终发布版本一致。缺点是:目标机必须能支持外部ROM存储空间,而且由于其通常要和ROM Monitor配合使用,因此它拥有ROM Monitor的缺点。
(4)ICE
ICE(In—Circuit Emulator)是一种用于替代目标机上CPU的设备,即在线仿真器。它比一般的CPU有更多的引出线,能够将内部的信号输出到被控制的目标机。ICE上的Memory也可以被映射到用户的程序空间,这样即使在目标机不存在的情形下也可以进行代码的调试。
连接ICE和目标机时,一般是将目标机的CPU取下,而将ICE的CPU引出线接到目标机的CPU插槽。用ICE进行调试时,在Host端运行的调试器通过ICE来控制目标机上运行的程序。
这种方式能够同时支持软件断点和硬件断点的设置,设置各种复杂的断点和触发器,实时跟踪目标程序的运行,并可实现选择性的跟踪。因而,特别适用于调试设备驱动程序、实时的应用系统,适合对硬件进行功能和性能的测试。主要缺点是价格太昂贵,不利于团队开发,所仿CPU有限。
(5)OCD
OCD(On Chip Debugging)是CPU芯片提供的一种调试功能(片上调试),可以认为是一种廉价的ICE功能:OCD的价格只有ICE的20%,但提供了ICE80%的功能。OCD调试结构如图5所示。这种调试方式的优点是:
·不占用目标机的资源;
·调试环境和最终的程序运行环境基本一致;
·支持软硬断点、Trace功能;
·精确计量程序的执行时间;
·提供时序分析功能。
缺点是:
·调试的实时性不如ICE;
·不支持非干扰调试查询;
·CPU必需具有0CD功能。
OCD的实现方式主要有BDM(Background Debugging Mode)、JTAG(Joint Test Access Group)、ONCE(On Chip Emulation)等几种。其中,JTAG是主流方式。
3.嵌入式软件的固化
固化运行是先用一定的工具将程序固化到目标机上,然后启动目标机,在没有任何工具干预的情况下程序能自动地启动运行。根据目标程序的不同,固化的方式可能不一样。比如,Bootloader的固化一般采用JTAG接口,而内核、根文件系统和应用程序适用于速度更快的网口。