日志文章

2006年12月04日 18:06:06

嵌入式软件及开发技术

  从上个世纪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) |  浏览(6739) |  收藏
一共有 12 条评论
12楼 [匿名]等你来 2007年09月25日 12:07:51 Says:
张老师已经不在英泰了,千万别去英泰学习。那个地方好的老师都走了,已经垮了。
11楼 [楼主]张宝林 2007年09月19日 13:07:38 Says:
答复:你好张老师,我想问一下,嵌入式移动设备的开发有哪些方法以及他们的优缺点?盼回复。谢谢
_______________________________________________________________
你这个问题不太好回答,下面是我的一些理解,希望能对你有帮助.
  嵌入式软件的开发与普通软件的开发没有什么本质区别,需求分析,设计,编码和测试工作与桌面应用和服务器应用都一样.只不过因为嵌入式设备具有的如下两个特点,第一:嵌入式应用对硬件依赖很强,第二:开发环境与运行环境不同,第三:嵌入式设备往往有资源限制.   基于以上三个特点,所以在开发嵌入式应用时存在一个从模拟的运行环境到实际运行环境的移植环节,往往一个应用要移植到多个硬件平台,各硬件平台有时差异也很大,比如寄存器的定义,指令集等,在移植过程中会出现这样那样的问题,很多的问题需要经验才能快速解决.同时由于嵌入式设备的资源限制(包括计算能力,存储能力,电源供应能力等),所以在开发嵌入式软件时要考虑时间效率,空间效率,甚至能耗,所以对数据结构的选择和算法效率要求都比较高,因为现在很多的好的设计思路是空间换时间(当然也基于开发语言本身对设计的支持程度,显然越高级的语言对好的设计的支持越简单和方便),所以在嵌入式开发中往往不采用我们常见的设计模式.
  以上所说是针对非操作系统之上的应用开发或基于象BREW/J2ME/ARENA等中间件的开发.
  如果是基于操作系统(常见的Symbian/Linux/Windows Mobile)的开发(驱动除外),对硬件的依赖较小,但需要对所依赖的操作系统比较熟悉,对该操作系统之上的SDK(有些提供了IDE)要很熟悉.而象J2ME/BREW/ARENA这样的中间件则把抽象层次有提高了一层,让我们更多的关于于应用本身.当然,还要考虑应用运行过程中对来电/短信等事件的处理.
10楼 [匿名]伊拉克 2007年09月17日 20:25:04 Says:
你好张老师,我想问一下,嵌入式移动设备的开发有哪些方法以及他们的优缺点?盼回复。谢谢
9楼 [匿名]guest 2007年02月27日 15:17:11 Says:
怎么这么久都没有更新啊
8楼 [匿名]guest 2007年02月09日 21:50:00 Says:
张老师,您是怎样做到既精通嵌入式又精通增值软件的呢?
7楼 [楼主]张宝林 2007年02月04日 11:38:20 Says:
培训老师要求严格,你应该庆幸啊.而且他们说的也并不夸张,如果仅仅做现在最流程的B/S结构的开发,尤其是前台开发,那么这些基本概念的作用确实很小,但如果做嵌入式软件开发包括服务器开发,质量如何完全看对基本概念的理解,你做的越多越深,你的感受就会越深,计算机专业的学生都学过C语言,但有几个理解堆、栈,理解指针,理解指针的指针,理解回调和函数指针,理解字节对齐 .....不一而足,都学过JAVA但有几个真正理解类加载的过程,类的内存布局,实例的内存布局,理解线程同步和线程通信..... ,都学过操作系统但有几个理解内存的管理方法,理解进程调度算法,理解死锁 ......,这些是基础,很多复杂的程序都借鉴了操作系统这些思想(可以看看TCP/IP源代码),比如很多的实时应用为保证效率,都是首先从操作系统申请一大块内存,在程序运行过程中再从这块预申请的内存中申请,应用程序自身负责对该内存区进行管理.所以,如果这些做不好,就不要奢谈设计和架构了.当然,如果这些方面你确实掌握的很好,你完全可以跳过S1去学S2甚至S3,学院也允许这么做.
6楼 [匿名]guest 2007年02月03日 13:57:00 Says:
您好张老师,俺是计算机本科毕业的,又搞了多年的软件开发,可是培训老师要求很严格,那些S1的基础课对以后学习能有多大用途,俺想把所有的时间用在学习嵌入式软件开发上,班主任说,概念不清会在以后的项目设计中谬以千里且难于与团队合作。有点太夸张拉吧!
5楼 [匿名]guest 2007年02月03日 13:45:34 Says:
感谢张老师的答复,我会尽力劝他到英泰培训
4楼 [楼主]张宝林 2007年01月31日 00:33:15 Says:
自学和参加培训是两个不同的成材途径.自学饿可解决成本,买两本书(甚至连书都不用买,直接从网上找资料)就可以了,时间也比较自由,但自学也是对你个人毅力的一个挑战,对自我约束能力的一个挑战,同时因为是自己摸索,难免会走弯路.参加培训,又是对个人经济承受能力的一个考验,时间也相对固定,但培训可以让你少走很多的弯路,尤其是当培训老师的个人经验很丰富,技术能力也很强,他们传授给你们的技巧是你从书本上和网上找不到的,更加贴近时间,同时,从授课老师那里,你也能学到他们为人和处事的方式及他们的职业风范.如果你同学确实如你所说,自学嵌入式开发中的应用开发应该没什么问题,如果再往低层做就会比较吃力了.以上仅代表我的个人看法.
3楼 [匿名]guest 2007年01月29日 17:00:04 Says:
张老师您好!
我有一位对嵌入式软件开发着迷的学友,他的计算机基础很好,有C、JAVA、C++的基础,有两三年的项目开发经验,正自学有关嵌入式软件知识,这样行吗?
2楼 [匿名]guest 2006年12月15日 13:16:37 Says:
在2G的计算机结构中的ARM指令部分会讲.
1楼 [匿名]guest 2006年12月15日 11:12:53 Says:
您好!张老师。刚看了您这篇文章,好像咱们学院的课程没有汇编语言这科,打算开么?什么时候开?
发表评论
看不清楚,换一张