
本书围绕嵌入式系统中的软件开发技术展开讨论。从最基本的原理和概念入手,介绍嵌入式系统、嵌入式操作系统的原理和概念,并在此基础之上,介绍了嵌入式软件开发人员必须要了解的知识,包括基本硬件原理、嵌入式操作系统定制和移植以及嵌入式系统集成和软件调试。
本着精简理论,注重实践的原则,本书的许多章节都附有详细的源代码及分析,并且搭建了基于模拟器的实验环境,有助于读者提高实践动手能力。
本书可以作为高校的计算机、软件工程、自动化等相关专业的嵌入式导论或入门课程的教学及教参用书,也可以供广大嵌入式系统工程师和软件开发人员或爱好者自学阅读。
科幻与现实
2004年,我在编写第一本嵌入式相关的书籍时,曾经在那本书的部分虚构了一个科幻场景,想借此来说明嵌入式技术给人们的生活带来的巨大改变。在那个场景中,主人公把自己在动物园刚刚拍摄的数码照片发送到自己家里的数码相框中与家人分享。在我的想象中,数码相框是可以以各种形式显示各种格式数码照片的设备。
在那个时候,我或多或少地还认为数码相框只可能是出现在科幻小说或者科幻电影中的道具,离“飞入寻常百姓家”的日子还比较遥远。今天,数码相框早已经不再是我想象中的科幻道具了。现在,不但在市场上已经有了各种成熟的数码相框产品,而且像iPod、智能手机一样,数码相框已经成为了潮流时尚的代表。借助数码相框,我们可以轻松地显示和分享数码照片。在我编写这段文字的时候,使用Google搜索关键字“数码相框”,可以得到1600000多条搜索结果。我相信,在读者读到这里的时候,这个数字肯定会更多。更有甚者,或许你现在抬头就可以看到书桌上或者客厅里摆放的数码相框。图01显示了飞利浦数码相框。
图01飞利浦数码相框(飞利浦,2007)
科学技术的发展让越来越多的以前只能在科幻作品中看到的道具变成了现实。
当然,数码相框只是这其中的一个典型例子。如果读者留心观察,类似的例子不胜枚举。当然,科学技术是一个很宽泛的概念,如果进一步把它细化,不难看出,在其中扮演着重要角色的是信息产业及计算机技术。虽然只有短短几十年,计算机产业的发展已经跨越了大型机时代和PC时代,进入了所谓的“后PC时代”,在“后PC时代”中,普适计算(Pervasive Computing)将会是计算的主要存在形式。普适计算描述了这样一种场景: 计算能力将无处不在,它将融入人们的生活,帮助我们轻松完成日常工作。这种计算能力是动态变化的,它能把住宅、汽车、办公室、商店和银行里的计算设备以及个人计算设备连接并协调起来,为信息、服务和应用提供接入点。可以说,普适计算概念的提出为“后PC时代”的发展指明了方向。
近年来,嵌入式技术及产品的快速成长成为了全球IT产业发展的显著特征之一。嵌入式系统以多种多样的形式,日益融入到人们的生活和工作之中。嵌入式技术、互联技术和个人计算以及高性能计算一起,构建了后PC时代中“计算无所不在”的蓝图。[44]
本书的内容
了解一本书籍的写作意图,对读者判断是否要阅读此书,或者选择精读还是泛读此书来说意义重大。众口难调,没有一本技术类书籍可以适合所有层面所有水平的读者。有选择的阅读是必要的,本书也同样有着独自的读者定位。在深入具体的章节之前,建议读者先阅读以下内容,以确定本书是否适合您。
本书的名字是“嵌入式软件开发导论”。顾名思义,从本书的名字中就可以对本书的内容和写作意图窥豹一斑。下面分析一下本书名字中的几个关键词。
1. “嵌入式”
本书讨论的主题始终是围绕嵌入式技术进行的。由于嵌入式系统的特点,它常常是与行业应用紧密绑定在一起的。嵌入式技术涉及的行业领域很广泛,它可以涵盖工业控制、通信、移动设备、航空航天、军事、智能家电、娱乐、车载导航……因此,作为嵌入式从业人员,需要掌握的知识体系也异常庞杂,这其中不仅包含计算机科学技术相关的专业知识,更重要的是一些具体特定行业所需要的专业知识。例如在通信领域从业的嵌入式工程师,就必须了解通信行业的知识; 从事导航软件设计的嵌入式工程师则可能需要对地理信息系统(Geographic Information System,GIS)和测绘相关知识了然于胸。本书不会介绍这些特定行业的专业知识,而且在必要的时候对这些内容稍加介绍。如果读者需要了解这些知识,请查阅更加专业的资料和文献。本书的关注重点是与嵌入式系统相关的,计算机科学技术领域内的知识。
即便如此,通过一本书依然不可能完全、细致地介绍所有计算机科学技术领域内所有与嵌入式系统相关的知识。本书试图按照嵌入式系统开发的流程,把涉及的相关知识的框架搭建起来。这样,读者可以对嵌入式系统开发的宏观流程及框架有深入的了解,这样对于学习具体的知识就有了提纲挈领的作用。本书会着重介绍笔者认为对开发人员最有帮助的知识,与此同时,也会列出其他相关的进一步学习的资料,供读者进一步学习相关知识使用。
2. “软件开发”
总体而言,嵌入式系统的开发涉及到硬件开发和软件开发两个环节。硬件开发主要涉及硬件选型、电路图设计、制板、调试等步骤。软件开发主要涉及编码、交叉编译、运行调试、测试等环节。对于嵌入式系统开发的完整流程而言,软硬件设计开发都必不可少。缺少了任何一者都无法构成完整的嵌入式系统。同时,嵌入式软件开发和硬件开发又紧密联系,通过编写软件可以驱使硬件更好进行工作,而硬件又为软件提供了必需的运行平台和环境。但是显而易见,软件开发和硬件开发所涉及和需要的知识面以及方法论又截然不同,也不可能详细地把两者都一一介绍。本书仅仅关注软件开发部分。
但是这并不表示嵌入式软件开发人员就不需要了解硬件的相关原理和知识。恰恰相反,嵌入式软件开发人员必须比任何软件开发人员都要更多地了解和掌握硬件的知识。这包括一些硬件方面的基本概念、工作原理、特点和局限性等等。如果嵌入式软件开发人员不了解硬件相关的知识,很多时候嵌入式软件开发根本无从下手。
对于嵌入式软件开发而言,“嵌入式”三个字归根结底只是定语。嵌入式软件开发也是计算机软件的开发,因此绝大多数软件开发的一般方法与一般原理同样适用于嵌入式软件开发。但是,与通用PC平台上的软件开发相比,嵌入式软件开发有自己的特点和方法。嵌入式软件的开发人员也通常会面对与PC软件开发人员不同的问题和挑战。
本书关注嵌入式系统开发中的软件开发部分,同时会对嵌入式软件工程师必须了解的硬件技术做简单介绍。
3. “导论”
本书并不标榜可以向所有嵌入式软件开发者提供所有需要知道的信息。本书的目标读者是嵌入式软件开发的初学者。本书旨在为希望了解和学习嵌入式软件开发技术的高等院校学生、软硬件工程师和嵌入式技术爱好者提供一本学习的教材。通过本书,读者可以了解嵌入式软件开发的基本原理、方法和知识框架。
本书的章节组织
本书正文部分一共有6章。内容是由浅入深,循序渐进的。章节之间的耦合性并不是很大,如果读者对某一部分比较熟悉,可以跳过其中的部分章节,直接阅读其他章节。
第1章: 嵌入式系统概述。这一章主要介绍了嵌入式系统最基本的一些概念和特点,基本上是对本书内容的概括。可以让不了解嵌入式系统的读者对嵌入式系统,以及嵌入式系统的构成有个最基本的了解。
第2章: 硬件技术基础。在嵌入式系统中,软件和硬件永远是不可以分家的。讨论嵌入式软件开发,就不得不对相关的硬件技术进行最基本的了解。本书只会介绍最核心的硬件体系结构和设施,例如总线、中断等。同时,本书不会单纯地以电子电气工程的观点介绍硬件,而是从软件层面着手,主要介绍与嵌入式软件开发人员相关的硬件原理和硬件知识。在介绍硬件知识的同时,我们还会向读者展示如何编写代码,来对硬件完成相应控制。
第3章: 嵌入式软件开发的概念和方法。在嵌入式系统的开发中,有许多概念、方法都与桌面版本的开发不同,有些时候,甚至需要推翻桌面开发中的一些经验。另一方面,嵌入式开发与桌面开发又具有通用性,但是要求开发人员对编译器、链接器等的底层的原理和机制做更深入的了解。因此,本章内容主要是介绍嵌入式软件开发中的最基本概念以及最基本的方法。同时,本书中还引入了一个实际的嵌入式软件开发例子,向读者介绍如何搭建开发平台,如何编写代码。
第4章: 嵌入式操作系统。在稍微复杂一点的嵌入式系统中,嵌入式操作系统是必不可少的“管家”。在嵌入式操作系统,也有许多桌面操作系统不具备的特性。例如系统定制和系统移植。本章先介绍了一些操作系统的通用特性,然后介绍了一些常见嵌入式操作系统,最后,我们以μC/OSⅡ为例,介绍了嵌入式操作系统的移植与系统定制。
第5章: 软件调试技术。软件调试是软件开发中不可缺少的环节。对于嵌入式软件开发来说,由于调试方法、调试工具都与桌面软件调试不同。因此,有必要用单独的一章来介绍嵌入式软件中调试的不同之处。
第6章: 嵌入式系统开发案例。本章以一个实际的嵌入式系统开发的例子来介绍整个嵌入式软件开发的过程。希望能够给读者以宏观的了解。
在每一章的结尾处都附有“推荐的读物和网站”,会给大家推荐一些更加深入的学习资料。毕竟本书是一本导论性质的书籍,不可能覆盖全部内容。如果读者对某一章节内容感兴趣,可以选择阅读这一章节所附带介绍的学习资料,从而把自己的知识由一个点逐渐辐射开来。
此外,在每一章的最后还附有相应的习题。这些习题中的一部分是对书籍中介绍的内容的回顾和总结。另外也有一些拓展和提高的内容。可能有些题目比较困难,读者可以根据自己的情况,选做其中的一部分。
本书的一些约定
表01列出了本书排版所使用的文字的字体以及格式的一些约定,表格中列出的约定并不适用于书中的列表或者图片。
表01本书中的排版约定
字体含义示例
宋体本书正文嵌入式软件开发有自己的特点和方法
粗体着重强调嵌入式系统的另一大特点是它的专用性
【宋体加括号】指示菜单项操作选择【文件】|【另存为】
Courier New本书中出现的代码int __cdecl MyFunction()
仿体加边框注意或提示提示: 大小写区分
关于本书实验平台
学习嵌入式软件开发,必须要动手实践,要在实际编写代码的过程中理解和体会所学的知识,同时积累工程经验,脱离了动手实践,很容易陷入“空中楼阁”的窘境。而如果要动手实践,则必然离不开硬件实验平台。
但是对于国内众多高校而言,由于开发板价格相对还比较高,嵌入式实验平台建设都不是很到位。对于希望学习嵌入式软件的个人而言,个人出资购买开发板也并非现实之举。另一方面,由于嵌入式系统的多样性,学习嵌入式系统时经常会面临两难取舍,到底以什么样的体系结构为学习平台,到底学习哪个应用领域等都是需要事先回答的问题。
为了避免书籍介绍的内容与某款特定的开发板绑定,本书采用的实验平台并非某公司的开发板,而是基于指令集模拟技术的模拟器,体系结构为ARM。在本书的附录中有对本书使用的模拟器Microsoft Device Emulator的详细介绍。任何人都可以从网上免费下载和使用该模拟器,并且该模拟器的源代码也是开放的。
使用模拟器的好处是不需要购买昂贵的开发板,即可学习和体验嵌入式软件开发的过程。但是缺点也显而易见,虽然模拟器使用软件模拟硬件的技术,并且所有模拟器都会尽可能多地让模拟器与实际的硬件相似。但是,到目前为止,还没有一款模拟器可以100%地模拟实际的硬件运行。由于软件模拟的特性,注定硬件的很多机制是软件无法模拟的。因此,使用模拟器进行学习是可以的,使用模拟器进行软件开发也可以带来很多的便利,但是我们时刻也要牢记,模拟器与真实的硬件是不同的。如果有机会,还是希望读者能够熟悉和使用真实的硬件平台。程序只有能够在真实的硬件平台上运行,才会有实际的意义,毕竟“实践是检验真理的唯一标准”。
本书中提到的代码都可以在Device Emulator上运行。但是由于篇幅问题,许多代码在成书的时候都做过简化和删减。虽然经过简化,但并不影响读者从这些代码中学到最基础的知识。笔者一直觉得初学某项技术,对其提纲挈领地掌握原理是比较重要的。对于初学者而言,如果一开始就一头扎进代码的汪洋大海中,很有可能“只见树木,不见森林”。正因如此,本书中的许多代码笔者都尽可能地使之简短、易读。当然,如果想深入地学习某些技术,庖丁解牛、知其细节还是必不可少的。
致谢
目前在中国,嵌入式软件人才的匮乏已经逐渐成为限制嵌入式产业可持续发展的瓶颈之一。作为高等院校,如何能够培养出符合社会和产业需要的实用型嵌入式软件人才是摆在高校面前的重要任务。但是目前国内大多数高校的嵌入式系统教学都处于刚刚起步的阶段,还在“摸着石头过河”。对于课程设置、培养计划、教学内容、实验等都还在探索和探讨,还没有形成比较完善的课程体系结构。因此,高校培养的人才和社会需要的人才之间的差距矛盾日益凸显。
可以执笔教育部“十一五”教材中嵌入式软件方面教材的编写,笔者甚感荣幸的同时,亦感到肩头责任之重大。诚惶诚恐之余,必不遗余力。不敢奢望此书可以成为嵌入式开发者案头必备,只希望此书可以成为指引嵌入式开发者登堂入室的一块铺路石。同时也希望以此书为改善国内的嵌入式教学,奉献自己的微薄之力。
本书的编撰总共耗时一年有余,在书籍的写作过程中,受到了同济大学软件学院老师们的热情帮助。在此对他们的工作表示感谢。
这本书的最后定稿是在甘肃省定西市完成的。同济大学与甘肃省定西市有超过十年的合作经历,数十批同济大学的教师被派往定西市,来对希望学校进行支教和做对口支援。2008年暑假,我也有幸成为其中一员,被安排到定西市做对口支援。这里自古就有“陇中苦瘠,甲于天下”的说法。在这里短短一个多月时间里,在认识干旱、贫瘠的黄土高原的同时,也体会到生活中黄土地上的农民以及孩子们贫穷但不屈服的铮铮铁骨,还有孩子们在恶劣的条件下强烈的求知欲望和学习欲望。在此,也祝福他们能够靠自己的双手摆脱贫穷,过上幸福的生活。
如果读者在阅读过程中遇到什么问题,或者是发现本书的任何错误,也欢迎与我联系。
何宗键
2008年8月4日
于 甘肃省定西市
第1章嵌入式系统概述
1.1嵌入式系统
1.1.1漫谈嵌入式系统
1.1.2嵌入式系统的定义
1.1.3嵌入式系统的特点
1.1.4嵌入式系统的发展
1.1.5嵌入式系统的应用领域
1.2嵌入式系统的构成
1.2.1硬件系统的基本结构
1.2.2软件系统的基本结构
1.3嵌入式系统开发
1.3.1嵌入式系统开发的一般环节
1.3.2嵌入式系统开发的产业链
1.4推荐读物和网站
1.5习题
第2章硬件技术基础
2.1计算机体系结构简介
2.2微处理器
2.2.1微处理器的分类
2.2.2用户可见寄存器
2.2.3指令系统与汇编语言
2.2.4RISC和CISC
2.2.5多字节存储
2.2.6常见的嵌入式微处理器
2.3存储器
2.3.1层次化存储模型
2.3.2虚拟内存机制
2.4总线
2.4.1总线概述
2.4.2常见的总线介绍
2.5输入输出模块
2.5.1概述
2.5.2访问外设方式
2.5.3轮询
2.5.4中断
2.5.5DMA
2.6需要了解的硬件设计图
2.7推荐读物和网站
2.8习题
第3章嵌入式软件开发的概念和方法
3.1软件开发流程
3.1.1编码阶段
3.1.2构建阶段
3.1.3部署阶段
3.2环境搭建
3.2.1开发机和目标机
3.2.2选择编程语言
3.2.3选择开发工具
3.2.4建立连接
3.3一个实例
3.3.1环境搭建
3.3.2硬件初始化
3.3.3从汇编语言到C语言
3.3.4实现控制台终端
3.3.5图形界面入门
3.3.6中断处理
3.3.7启用虚拟内存
3.4代码优化
3.4.1运行速度优化
3.4.2代码尺寸优化
3.4.3低功耗优化
3.4.4编译器自动优化
3.5推荐读物和网站
3.6习题
第4章嵌入式操作系统
4.1嵌入式操作系统简介
4.2嵌入式操作系统的功能
4.2.1处理机管理
4.2.2同步
4.2.3内存管理
4.2.4文件系统
4.3常见的嵌入式操作系统
4.3.1嵌入式Linux
4.3.2Windows CE
4.3.3VxWorks
4.3.4μC/OS Ⅱ
4.4嵌入式操作系统的移植
4.4.1硬件抽象层
4.4.2系统定制与裁剪
4.4.3引导程序
4.4.4操作系统移植实例
4.5推荐读物和网站
4.6习题
第5章软件调试技术
5.1软件调试概述
5.1.1软件调试的目的
5.1.2影响调试的外围因素
5.2常见的调试方法
5.2.1指令集模拟器
5.2.2驻留监控程序
5.2.3在线仿真器
5.2.4JTAG仿真器
5.2.5其他方法
5.3GDB调试器
5.3.1简介
5.3.2GDB的RSP协议
5.3.3GDB Stub的移植
5.4推荐读物和网站
5.5习题
第6章嵌入式系统开发案例
6.1案例介绍
6.2系统的设计
6.3关键算法设计
6.4系统的实现
6.5系统开发实例
6.6推荐读物和网站
6.7习题
附录ADevice Emulator
参考文献