有人说现在日常生活中使用的嵌入式系统和地球这个行星上生活的人一样多,家用电器从洗衣机到电视机,摄像机以及移动电话,现在都包含至少一个嵌入式处理器在许多汽车、医疗、航天以及军事系统中它们也是重要的组成部分 因此,对具有“嵌入式”技能的编程者的需求大增,而且许多微机开发者正转向这个领域。
许多编程者有微机上使用C、c++或Java的经验,想要应对嵌入式系统特有的挑战,就需要学习所要求的技能,本书就是为这些编程者设计的。
本书及所附光盘包括下列主要特征:
●光盘上有通用的8051微控制器芯片的Keil硬件仿真器,因此读者能够试验本书中的例程,并且创建新的程序,而不需要其他的硬件
●所有的代码都是用C语言写的,所以不要求会使用汇编语言 光盘上包括有来自Keil公司的软件——业界标准的C语言编译器,还有本书例程代码的拷贝,便于你很快入门及运行起来
●所有嵌入式系统中都需要的关键的方法技巧都详细地包含在内,包括端口管脚的控制以及开关的读取
●介绍了一个完整的嵌入式操作系统,光盘上有全部的源代码
译者序
前言
第1章 嵌入系统中的C语言编程
1.1 简介
1.2 什么是”嵌入式系统”?
1.3 应选用何种处理器?
1.4 应该使用哪种编程语言?
1.5 应选用何种操作系统?
1.6 怎样开发嵌入式软件?
1.7 结论
第2章 8051系列微控制器简介
2.1 简介
2.2 芯片命名的含义是什么?
2.3 标准8051芯片的外围接口
2.4 复位的要求
2.5 时钟频率和性能
2.6 存储器的问题
2.7 I/O管脚
2.8 定时器
2.9 中断
2.10 串行接口
2.11 能耗
2.12 结论
第3章 你好: 嵌入式世界
3.1 介绍
3.2 安装Keil软件以及装载项目
3.3 配置仿真器
3.4 创建目标程序
3.5 运行仿真
3.6 解析程序
3.7 其他: 建造硬件
3.8 结论
第4章 读取开关值
4.1 介绍
4.2 读取端口管脚的基本技巧
4.3 举例: 字节读写
4.4 举例: 位读写(简单的版本)
4.5 举例: 位读写(通用版本)
4.6 需要上拉电阻
4.7 开关跳变的处理
4.8 举例: 读开关输入(基本代码)
49 举例: 数山羊
4.10 结论
第5章 为代码添加结构
5.1 介绍
5.2 面向对象的C语言编程
5.3 项目头文件
5.4 端口头文件
5.5 举例: 重新构造例程”Hello, Embedded World”
5.6 举例: 重新构造数山羊的例程
5.7 更多例子
5.8 结论
第6章 满足实时性的限制条件
6.1 介绍
6.2 利用定时器0和定时器1来创建”硬件延时”
6.3 举例: 产生50ms的精确延时
6.4 举例: 创建可移植的硬件延时
6.5 为何不用定时器
6.6 “定时溢出”机制的需要
6.7 创建循环定时溢出
6.8 举例: 测试循环溢出
6.9 举例: 可靠性较高的开关接口
6.10 创建硬件定时溢出
6.11 举例: 测试硬件定时溢出
6.12 结论
第7章 创建嵌入式操作系统
7.1 介绍
7.2 简单嵌入式OS的基础
7.3 介绍sEOS
7.4 使用定时器0或定时器1
7.5 此方法可移植吗
7.6 其他系统架构
7.7 使用eEOS时重要的设计思路
7.8 举例: 牛奶巴斯德杀菌
7.9 结论
第8章 多状态系统和函数序列
8.1 介绍
8.2 实现多状态(时间驱动式)系统
8.3 举例: 交通灯顺序排列
8.4 举例: 电动恐龙
8.5 实现多状态(输入/时间驱动式)系统
8.6 举例: 洗衣机的控制器
8.7 结论
第9章 使用串行接口
9.1 介绍
9.2 什么是RS-232?
9.3 RS-232仍然重要吗?
9.4 基本的RS-232协议
9.5 异步数据传输以及波特率
9.6 数据流控制
9.7 软件架构
9.8 使用片上UART进行RS-232通信
9.9 存储器的要求
9.10 举例: 在PC机上显示经过的时间
9.11 串行菜单架构
9.12 举例: 数据采集
9.13 举例: 遥控机器人
9.14 结论
第10章 案例分析: 入侵者警报系统
10.1 介绍
10.2 软件架构
10.3 本例中使用的主要软件组件
10.4 运行程序
10.5 软件
10.6 结论
第11章 学习总结
11.1 介绍
11.2 我们达到目标了吗?
11.3 更深入学习的建议
11.4 《Patterns for Time-Triggered Embedded Systems》
11.5 《Embedded Operating Systems》
11.6 结论
一提到信息时代的主要特征,许多人脑中可能浮现出个人电脑、互联网、各种各样的软件、游戏以及光盘等。其实,这个时代更加无孔不入的是各种电子设备,几乎所有的电子设备都包含一个或几个嵌入式系统。虽然我们未必意识到隐藏在这些电子设备中的嵌入式系统的存在,但我们确实生活在嵌入式系统的包围之中,从我们的手表、微波炉、洗衣机等一直到最近逐渐流行起来的手机、数码相机、数码摄像机(DV)、汽车中的GPS定位系统。前不久爆发的第二次海湾战争中,给世人留下深刻印象的美军精确制导导弹、无人侦察飞机等,都是嵌入式系统的典型应用。在航天领域,美国宇航局(NASA)用于外星探测的火星探测器已经成为大型复杂且可靠的嵌入式系统的经典之作。
从专业或工程师的角度看,民用市场嵌入式系统大概分为三类应用:消费类电子设备,电信,还有微机的外设等,可谓市场广阔。嵌入式系统一般将软件系统及硬件系统合而为一, 自成一套系统,具有天然的防盗版性;且其硬件平台和软件平台五花八门,远没有像Microsoft、Intel之于个人电脑市场之垄断。所以,业界不少人对于中国嵌入式软件的发展寄予厚望。
几年前,我在学校中学习嵌入式系统相关课程如单片机时,使用的还都是汇编语言。但工作以后的实际开发中,发现嵌入式系统(尤其复杂系统)使用的更普遍的是嵌入式C语言。这是因为汇编语言可读性差,可移植性更差,对于嵌入式系统实时性、访问硬件等特性,C语言也不比汇编语言逊色多少。于是当然C语言成为嵌入式开发的首选。
本书共分11章,并包括有大量的例程,随书还附有一张光盘。
●第1章“嵌入式系统中的C语言编程”。简要介绍了嵌入式系统的编程语言、操作系统的选择,在个人电脑为嵌入式处理器芯片创建可执行代码的过程,测试嵌入式代码的过程。
●第2章“8051系列微控制器简介”。讨论一些8051系列芯片的关键特性。
●第3章“你好,嵌入式世界”。介绍安装、配置、使用Keil仿真器软件,创建目标程序、运行仿真,以及如何开发和测试简单的C语言程序。
●第4章“读取开关值”。介绍了读取端口管脚的基本技术并举例。
●第5章“为代码添加结构”。讲述如何在C语言编程中使用面向对象的编程风格。
●第6章“满足实时性的限制条件”。讲述怎样利用定时器来创建“硬件延时”,还考虑了定时溢出。
●第7章“创建嵌入式操作系统”。介绍了简单嵌入式OS的基础。并介绍了sEOS嵌入式操作系统及其使用。
●第8章“多状态系统和函数序列”。在本章中,考虑如何用C语言实现多状态(时间驱动式)以及多状态(输入/时间驱动式)的架构。
●第9章“使用串行接口”。本章中,讲述了如何利用8051的串口进行RS-232协议通信。并举例说明了8051微控制器芯片上的串行接口怎样在实际的嵌入式系统中使用,其中涉及了向(或从)PC机或类似装置进行的数据传输。
●第10章“案例分析:入侵者警报系统”。在本案例中,考虑了设计和实现小型的入侵者警报系统。该章综合使用嵌入式C语言的大多数主要特征。
●第11章“学习总结”。回顾了在这本介绍性的书籍中所讲述的内容,并且介绍还需要考虑哪些更深入的话题。
本书是嵌入式C语言开发很好的入门学习材料。尽管嵌入式系统与硬件系统密切相关,但本书力图做到与硬件无关,读者并不需要电子学方面的知识。本书尤其适合于有微机上使用C、C++或Java经验、并想要学习嵌入式系统上的软件编程的编程者。作者有针对性地对比了这两种软件编程的不同。译者认为对于有C语言基础、刚大学毕业的初学者,亦可从中有不少收获。
很高兴有机会翻译这本嵌入式C语言方面的书籍。这使我想起几年前刚从事嵌入式软件开发工作的时候,找一本类似这样的书是多么困难:讲单片机的书几乎都使用汇编语言,而C语言的书基本都限于讲微机上或工作站上的编程:公司的个别精通者又都很忙,大多时候只能靠自己摸索。但愿本书能为初学者入门提供帮助,不再重蹈我当年的覆辙。
本书翻译期间正值北京全民抗击非典的攻坚阶段,感谢我的妻子李楠,这段时间家中“后勤”及卫生保健工作全部落在她的肩上,我们才得以平安度过非常时期。为本书翻译付出努力的还有欧阳宇、英宇、李明、陈华全,在此一并感谢!由于译者水平有限,书中翻译难免有不当之处,恳请广大读者批评指正。
本书提供了对嵌入式软件的“硬件无关(hardware-free)”介绍,适合以下读者阅读
●已经知道如何为“台式”计算机系统编写软件。
●熟悉一门基于C的语言(包括Java、C++或者C)。
●想学习如何在实际的嵌入式系统中使用C。
前言的其余部分将回答读者对本书的内容可能提出的一些问题。
I 什么是嵌入式系统
本书所讨论的嵌入式系统是指:
嵌入式系统是一个应用系统,它包括至少一个可编程计算机(一般是微控制器、微处理器或者数字信号处理器芯片),并且它被个人所使用,一般情况下,这些人不知道系统是基于计算机的。
这种类型的嵌入式系统随处可见。嵌入式处理器在客车、移动电话、医疗设备、航天系统和国防系统中都有广泛的应用,甚至在日常家用电器中,比如洗碗机、电视机、洗衣机和摄像机,现在都包括了至少一个嵌入式处理器。
II 本书讨论哪种处理器?
本书集中讨论基于8051系列微控制器的嵌入式系统。8051器件的价格至少为1美元。在这个价位上,可以获得的性能为每秒约100万条指令,芯片上的RAM为256字节(不是兆字节)。8051的特性(价格、性能、可用存储空间)符合很多嵌入式系统的要求。所以,8051体系结构(最初是由Intel开发的)现在已经能够在400多种芯片上实现;这些芯片由多个不同的公司生产,包括Philips、Infineon、Atmel和Dallas。据统计,这个庞大的芯片家族的销售量占据了全部微控制器市场的大部分(约60%),在8位微控制器市场占有50%以上的份额。目前,不同版本的8051正应用于大量的嵌入式产品中,从汽车系统到儿童玩具。
低成本、大范围、易获得和应用广泛的优点使得8051芯片家族成为开发嵌入式系统的优秀平台,同样的原因也使它成为学习关于嵌入式系统的理想平台。不管你会不会依次使用8位、16位和32位嵌入式处理器,学会利用像8051这种芯片的性能和存储限制,是成本至上的嵌入式市场的一个关键需求。你不能简单地通过开发Pentium (或者类似的)处理器来获得这些技能。
III 使用什么操作系统
8051提供的256字节内存当然不足以支持任何版本的Windows、Linux或者类似的桌面操作系统。取而代之的是,我们会介绍如何创建你自己的简单“嵌入式操作系统”(详见第7章)。这种“自己动手做(DIY)”的方法在小型嵌入式应用系统中很常见,其对内存及成本之要求是个人电脑的操作系统(如Windows或Linux)或所谓的“实时操作系统”所不能满足的。而且,这些方法也广泛应用于大的嵌入式系统(如,航天系统中的应用以及汽车工业中线控系统的应用),因为一般认为通常的操作系统太不可靠了。
学会在一个“裸”处理器上开发并创建自己的操作系统是对嵌入式系统软件开发人员的关键要求。
IV 本书讨论哪种系统
本书将介绍大量的从实际嵌入式系统改写过来的实例。包括
●远端控制的机器人。
●交通灯序列控制器。
●监控液体流动速率的系统。
●家用洗衣机控制器。
●电动恐龙。
●一般用途的数据采集系统。
这些例子以及其他的例子用于阐明在嵌入式设计中广泛应用的主要软件体系结构
为匹配你自己的应用程序需求,可以对这些例子进行改写和扩展。
本书包括了一个最终的案例分析:它会将前面章节探讨的所有功能结合起来,从而
创建一个入侵报警系统。这个案例分析包含以下几个关键部分:
●一个合适的嵌入式操作系统。
●一个多状态的系统框架。
●处理来自门窗传感器的信号输入的软件。
●一个简单的“键盘”库用于处理用户输入的密码。
●控制外部端口管脚(用于激活外部铃声)的软件。
●一个用于辅助调试的“RS-232”库。
V 阅读本书需要获得电子学专业的学位吗?
请考虑以下问题:
我想要学习嵌入式软件,但我对电子学知识了解甚少,
这个问题对于微机编程人员来说是很普遍的,即使他们在中学或大学中学过一些电子学知识,可能也忘得差不多了。
如果你不了解MOSFET和BJT的区别,甚至不了解电阻和电容的区别,请不必担心。使用好本书你不必有任何电子学方面的知识。你也不需要电烙铁、电路板或任何电子器件。简言之,本书是(99%)硬件无关的。
为了给本书介绍的8051设备编写软件,我们使用业界标准的编译器(Keil)。为测试软件,我们使用硬件仿真器。编译器工具和仿真器都包含在本书附带的光盘中。使用这些工具,本书中所有的例子,都可以在标准的WindowsPC上运行、更改并再编译和测试。
这种方法使有经验的微机编程人员可快速了解嵌入式系统的主要特性,而免受“手忙脚乱”地构造硬件之苦。
VI 光盘包括哪些内容?
除了Keil编译器以及硬件仿真器(上一节已经讨论了),本书光盘还包括了所有例子和案例分析的源代码:代码用C语言编写,与Keil编译器兼容。
光盘还包括有关8051系列微控制器的有用信息,包括大量相关的芯片资料及其应用系统的材料。
VII 本书与其他8051的书有何联系?
本书对嵌入式项目中C的使用提供一个入门介绍。如果你在读完本书后,还想要学习嵌入式系统的更多知识,那么《Patterns for Time-Triggered Embedded Systems(PTTES)》“将是不错的选择。
PTTES是一本很厚的书(约有1000页),它囊括了支持基于8051系列微控制器嵌入式系统开发的“设计模式”的完整集合。该书提供了70多种有用设计模式的详细描述,并包含有如何将这些技巧应用到你的项目中的完整的指导原则:PTTES一书的光盘中包括所有这些模式的全部源代码。
该书包括:嵌入式操作系统的模式(包括单处理器和多处理器应用系统);使用开关、键盘、LED以及液晶显示屏等用户界面设计的模式;PID控制的模式:PWM的模式;模数转换和数模转换的模式;RS-232、RS-485、CAN、SPI以及12C串行网络的模式;描述复位、晶振和存储器电路的硬件模式。
VIII 源代码是免费共享的吗?
本书中包括的源代码是多年辛苦工作的成果。它不是免费的,而是有一些简单的版权限制。限制如下:
●如果你购买了本书,就有权在你的项目中使用本书及本书附带光盘中提供的源代码,希望你能这样选择。如果你采用这种方式的话,那么使用本书代码就不必付任何版税。
●如果此代码为公司内使用,则如果有10个人使用该源代码,那该公司就应该购买10本书。
●如果你是在大学或学院中教书,你可以自由将源代码分发给学生使用,而不需要授权许可,只要源代码用于教学而不是商业应用就可以。请注意如果教授该课程(无论是大学或学院的职员还是其他人)是出于“继续职业教育”的目的而进行的“短期培训课程”,则不能归为此类。如有疑问,请与我联系。
●在任何情况下,未经本人明确的书面授权,你不能出版发布本书或光盘上的源代码,无论是以何种形式以及手段。若你想出版发布源代码的部分片段,大多数情况下,我会允许授权发表的,但出版物中必须有合适的致谢。如果你想出版发布本书中的大量源代码,可能会要求你付费。欲知详情请与我联系。
IX 如何阅读本书?
这本书最好能够从头到尾地仔细阅读。
在后面的章节中,阅读时配合使用WindowsPC效果更好,因为这样你可以试验书中的例子,当然这不是必需的。
本书涉及了相当多的源代码,包括书中的例子以及在随书光盘上的源码。我个人测试过所有这些代码。尽管如此,错误在所难免。
如果你认为发现了错误,请给我发E-mail(地址在本前言的结尾处),我将尽力解答。
XI 读者如何提交评价
我在1986年开始我第一个嵌入式项目。在写本书时,我试图提供一些我当时需要但又找不到的信息。
我感谢你的评价及反馈。例如,这本书篇幅上是否应更长些?或更短些?是否还要涉及其他领域?本书应忽略什么内容?在未来的版本中,你期望书中关注另外一种系列的微控制器吗?如果是这样,那么你期望关注哪一种微处理器呢?
为确保以后的书能提供你所需要的信息,我很愿意听到你使用本书的体会(无论是好是坏)。
XII 致谢
没有其他许多人的帮助与支持,本书的出版是不可能的。
在这里我想特别感谢:
●Leicester大学电子和软件工程专业的学生们,这些年来,在我所教的嵌入式系统的入门课程中,他们对本书的材料提供了宝贵的反馈意见。
●Pearson Education的Simon Plumtree,他对我想出版这些资料的想法给予大力支持。
●Pearson的Karen Sellwood,他帮助我顺利出版此书。
●Reinhard Keil和他的同事,审阅本书的初稿,并提供了本书光盘的主要内容。
●Jim Cooling,审阅了本书初稿。
●Chris Stephens,审阅了本书初稿。
●Penelope Allport负责管理本书的出版工作。
●Sara Barnes负责文字编辑;Claire Brodmann负责版式设计;Barbara Archer负责校对:David Worthington负责制作索引。
●Barbara和Gordon Pont负责校对。
●Sarah使我坚信“没有什么能使我们分开”,此话值得再听一遍。