|
从上个世纪80年代Intel制造4004开始,就开始有嵌入式应用了,后来又出现在主要应用在控制领域的单片机,嵌入式样系统的应用就更广泛了,期间出现了嵌入式操作系统,使嵌入式的应用领域更加广泛。 嵌入式系统是专用的计算机系统,内嵌到其他的系统中,用于增强系统的功能。嵌入式系统既然是计算机系统也不外乎软件和硬件两个部分,硬件部分仍包括处理器平台、内存、总线和外部设备几个部分,如果要进行硬件设计还需要组合逻辑电路、时序逻辑电路、总线电路电平转换电路和可编程逻辑器件基础等知识。 本文主要是讲解嵌入式系统中的软件部分。 无操作系统时代。嵌入式软件主要是传统的嵌入式应用,此时硬件配置较低,应用领域较窄,主要是控制领域。嵌入式软件的设计主要以应用为核心,应用软件直接建立的硬件基础上,而且是直接操控硬件,要直接操纵寄存器、内存甚至CPU,从硬件初始化、到接受数据、对数据进行处理、将处理结果输出都是由应用程序实现,此时软硬件是紧密耦合的,嵌入式应用有极强的专用性,软件相对简单。编写应用时,只能采用汇编(与处理器平台相关)或C语言,同时要求开发人员对处理器、内存和I/O有清晰的认识,但对操作系统方面的技术没有什么要求。 有操作系统时代。随着嵌入式操作系统的出现和硬件配置的提高,嵌入式软件也越来越复杂,嵌入式应用的领域越来越宽。嵌入式软件分成四个层次:BSP、操作系统、中间层和具体应用层。BSP包括了所有与硬件有关的代码,为操作系统提供了硬件平台无关性,BSP主要包括BootLoader和驱动两部分。其中BootLoader完成包括硬件初始化、中断的产生和处理、硬件时钟和计时器处理、地址映射、加载内核在内的功能,而驱动一方面要直接跟硬件打交道,直接操作和控制硬件设备,另一方面要为上层软件提供调用接口。嵌入式操作系统进行进程管理、内存管理(如果有MMU)、文件系统和设备管理等传统操作系统的功能并为应用提供开发用的API,其中设备管理部分其实与驱动的功能有重复,也就是说BSP其实与操作系统的耦合很紧密。所谓的中间层是一个可选层,实际是对于应用层功能的抽象,包括消息中间件(其作用相当于WebLogic和Texudo这样的中间件),数据库访问中间件、安全中间件或者他们的整合,比如目前的两大主流下载应用平台KJAVA和BREW。应用层也就是我们直接使用的这些包括游戏、记事本、邮箱、移动商务应用和移动行业应用在内嵌入式程序。下面分别对这四个层次进行说明: 首先是BSP层:BootLoader分成两个阶段: 第1个阶段完成包括四个步骤: 1.硬件设备初始化 2.为第二阶段准备内存 3.复制第二个阶段的代码到内存空间 4.第四设置好堆栈,并跳转到第二阶段的入口点 第2个阶段包括如下五个步骤: 1.初始化本阶段要用到的硬件设备 2.检测系统内存映射 3.将内核及根文件系统装载到内存 4.为内核设置启动参数 5.启动内核 第一个阶段直接操作硬件所以必须用汇编来编写,而且要求对硬件平台非常熟悉,第二个阶段也可以用汇编,但因为处理比较复杂,所以通常用C来实现。BootLoader开发对硬件方面知识要求较高。 大部分嵌入式操作系统提供了对很多硬件设备的支持,驱动程序的开发大部分用C语言来开发(其中有可能会用到汇编,比如操作状态寄存器),当然用汇编更没有问题,驱动开发需要用到中断,也需要直接操作硬件,还需要考虑和重入问题,对硬件和操作系统方面的要求较高。 其次是操作系统层。嵌入式操作系统都是比较成熟的操作系统,很难有机会自己去从头编写一个操作系统。当然可能会以ucOS或Liunx等为基础经过修改以形成针对特殊的软硬件环境的系统,当然开发操作系统对于要求你对于操作系统的原理有透彻的理解,同时在软件分析、设计、编码和测试方面也提出了很高的要求。 第三是中间层。中间层也都是由有实力的厂家进行的。比如KVM和BREW。该层往往也需要进行自己的任务管理、内存管理等,并提供网络通信、界面、多线程等开发接口,对一个人的操作系统功底和用C语言编程能力也提出了很高的要求。 第四是应用层。应用层开发的主流语言包括C/C++/JAVA/C#,要注意编程的时空效率。开发嵌入式应用,其实就是依托主流的开发平台、通过开发平台提供的API开发该平台下运行的应用程序。在手持移动终端领域就是Symbian/Windows Mobile/Linux/Palm OS/J2ME/BREW,所以关键是熟悉平台的特性及API,手持移动设备应用强调的往往就是界面+网络+多线程三个方面的技术,因为很多的应用的联网应用。在网络网络设备领域往往采用的是VxWorks和pSOS操作系统(很多大公司为了节约成本也在往Linux平台迁移),开发网络设备中的嵌入式软件,除了对平台的熟悉和编程语言外,还需要深厚的网络和协议功底. 所以开发嵌入式软件需要如下几个方面的技能 1.编程语言C/C++/JAVA/汇编语言 2.硬件基础 3.操作系统理论 4.应用开发平台 5.网络和协议 当然也离不开数据结构和软件工程等知识点。 同时,因为嵌入式系统是一个软硬件紧密结合的系统,所以对于高级嵌入式开发人员而言,就要求不仅能进行上述的软件开发,还应该能够进行硬件的选型,也就是使一个嵌入式系统从无到有的过程都要参与,所以需要对常用的处理器平台、存储层级及各种存储器、各种总线和接口、各种输出和输出设备等有全面的了解。
|
一共有 12 条评论
_______________________________________________________________
你这个问题不太好回答,下面是我的一些理解,希望能对你有帮助.
嵌入式软件的开发与普通软件的开发没有什么本质区别,需求分析,设计,编码和测试工作与桌面应用和服务器应用都一样.只不过因为嵌入式设备具有的如下两个特点,第一:嵌入式应用对硬件依赖很强,第二:开发环境与运行环境不同,第三:嵌入式设备往往有资源限制. 基于以上三个特点,所以在开发嵌入式应用时存在一个从模拟的运行环境到实际运行环境的移植环节,往往一个应用要移植到多个硬件平台,各硬件平台有时差异也很大,比如寄存器的定义,指令集等,在移植过程中会出现这样那样的问题,很多的问题需要经验才能快速解决.同时由于嵌入式设备的资源限制(包括计算能力,存储能力,电源供应能力等),所以在开发嵌入式软件时要考虑时间效率,空间效率,甚至能耗,所以对数据结构的选择和算法效率要求都比较高,因为现在很多的好的设计思路是空间换时间(当然也基于开发语言本身对设计的支持程度,显然越高级的语言对好的设计的支持越简单和方便),所以在嵌入式开发中往往不采用我们常见的设计模式.
以上所说是针对非操作系统之上的应用开发或基于象BREW/J2ME/ARENA等中间件的开发.
如果是基于操作系统(常见的Symbian/Linux/Windows Mobile)的开发(驱动除外),对硬件的依赖较小,但需要对所依赖的操作系统比较熟悉,对该操作系统之上的SDK(有些提供了IDE)要很熟悉.而象J2ME/BREW/ARENA这样的中间件则把抽象层次有提高了一层,让我们更多的关于于应用本身.当然,还要考虑应用运行过程中对来电/短信等事件的处理.
我有一位对嵌入式软件开发着迷的学友,他的计算机基础很好,有C、JAVA、C++的基础,有两三年的项目开发经验,正自学有关嵌入式软件知识,这样行吗?