嵌入式系统构件
嵌入式系统构件由Jean Labrosse(写ucosII操作系统的人)编著,是嵌入式的经典著作。327嵌入式系统技木丛书嵌入式系统构件(原书第2版)美)Jean1J. Labrosse著袁勤勇黄绍金唐菁等译本书附盘可从本馆主页htp:/1i,szu.edu.cn/上由“馆臧检索”该书详細信息后下载,也可到视听部复制围m团A0989754(*机林工业出版社China MachIne press本书介绍了枸嵌入式系统的一些通用模块,如键盘扫描器、显示器接口、计量器和输人/输出。大部分代码都是用可移植的C语言編写。与第1版相比第2版对所有的代码和例子都用作者自己设计的一个实时摸作系統C/0S-Ⅱ进行了修改,并用 Borland c/C+的编译器V45L代替V3.1本书适合于计算机专业本科生研究牛、嵌人式程序员以及其他对嵌入式系統感兴趣的技术入员参考Jean J. Labrosse: Embedded Systems Buldng Blocks, Secord Edition, Copyright 1999 by Bytelimited. Licensed MaterialAll righTs ttriPublished by R&D Books, CMP Mecha, Ing. All nights reserved本书中文简体字版由CMPM公司授权机械工业出版社独家出版。未经出版者书面许可不得以任何方式复制或抄袭本书肉容。版校所有,侵权必窕。本书版权登记号:图字:01-2001-1116图书在版编目(C〕数播嵌人式系统构件(原书第2版)美)拉布罗斯(Lah,J)著;動勇等译.-北京:机械工业出版社,20322嵌人式系统技术丛书)书名原文: Embedded Systems Building blocks, econd ecitonISBN7-1109646-0Ⅰ.嵌.·Ⅱ.①拉.②震.Ⅲ.微型计算机-系统设计Ⅳ.TP6中国版本图书馆CIP数据核字(001)第U88578号机械工业出版杜(北京市四城区百万庄大衡22号邮政編码103?)责任编辑:陈贤舜北京第二外国语学院印刷广印刷·新华书店北京发行所发行200年2月第1版第1次印刷737mmx102mm1/16295印张印数:0001-500册定价:5900元附光金)凡购本书,如有倒页、脱页、缺页,由本社发行部调换前言这是一本介绍软件模块的书,可以用这些模块设计嵌人式系统。这些模块是一些最通用的构建嵌入式系统的模块,如:键盘扫描器、显示器接口记时器和IQ输入/输出}。大部分代码都是用可移植的C语言编写的。管理入员将会喜欢使用这本书,因为它可以减少嵌入式系统设计中某些重复性工作所需要的时间,因而节省费用。每一章与其他章都是相互独立的,可以只使用所需要的模块。每一章都描述了各个模块是做什么的它是怎样工作的以及它提供什么样的服务。这些信息将帮助你估计实现软件产品时需要的资源在第2版中有什么新的内容与第1版内容相比第2版做了很多的改进。当然,最显著的一点就是书的硬封皮(注:指英文原书)使它更加耐用了。第二个最大的改进就是所有的代码和例子都用/68-Ⅱ进行了餘改nμC/ωS-Ⅲ是笔者设计编写的一个实时操作系统,并且在笔者所著的另一本书中给出过完全的描述即MC/0s-Ⅱ he ke- me Kus》(N0-87930-543-6)武&DBok现以对象的形式给出一个pC/QS-的低级版本,可以允许运行和改进示例代码。笔者决定用 En dand vc艹的編译器Ⅵ4.51代替v.1因为很多读拦指出了版本3的工其不再可以使用了。也使用了一个 makefile来构建示例代码,而不再依赖集成开发环境(IE)mekafie很容易改变,所以代码可以针对任何其他的目标处理器进行编译。第!章,“示例代码”,已经完全修改了。第2章,“实时系统概念”,包含了10多页新的内容。为了构建所有的模块,目前将以一节的内容介绍以标准格式存在的应用程序編程接口(AP1)。它将允许你更好地使用每一构件的接口函数。在第1版本屮,附录F包含了全部所使用过的电子组件的数据表格。笔者决定把这些数据表格以PF格式转移到配套的光盘上,这样将减少大约100页的内答,可以少伐一些树在第1版中,列出了本书中提供的构件的每一个接口函数的执行时闾。这个过程显得很冗长,所以决定在第2版中删除这一部分的内容另外,以前使用的与这些执行时间相匹配的80386计算机已经在几年前就被海汰了目标本书通过提供预备使用的模块来帮助嵌入式系统程序员。如果在本书中的代码不能满足实际需求,你可以利用这些代码作为一个起点。换句话说比起从头开始编写代码,修改代码更为容易。本书的主要月的就是节约时间。适合的读者本书合于嵌入式系统程序员询人员和对于嵌人式系统感兴趣的读者,在此假设浏览本书的读者应该了解C语言,并且具备一定的汇编语言的知识。另外,也应该知道微处理器,并具有基本的电子学知识背景。本书中提到的硬件知识非嘗容易理解。因为代码是用C语言编写的,你可以把本书中提出的概念应用到范更加广泛的各种微处理器中(江编语言不能够移植)。如果读者是一位对嵌人式系统感兴趣的学生,本书将通过綸出具体的编程实例来据开嵌入式系统软件设计的神秘面纱。本书也将让学生构建比课堂上所学的更加复杂的嵌入式系统。可移植性本书中的代码是用 ANSI C编写的,具有很好的移植性。之所以选择心为嵌入式系统的语言是因为C具有如下的特点C代码比汇编语言代码更加容易编写和理解。由某些C编译器产生的代码在效率上接近于汇编语言。且编写完程序,C代码经常可以用在不同的处理器上。而对于汇编代码而言则不行。在许多情况下,不到10%的代码使用的CPU时间将超过90%。你总是可以通过使用汇物语言来优化这些对时间有严格要求的代码。那些对于时间要求不严格的代码(代码中的9%)仍然可以用C来编写。如果仍然使用汇编语言来设计嵌人式系统的话,应该考虑利用C编译器,并且用C来編写代码中的一部分。硬件接口函数已经单独地分离出来了,以便使所需的工作量减到最低程度,并使模块适应硬件环境。笔者已经将汇编语音减到最低程度,并且在使用汇编语言的地方,尽可能地简化代码使代码吏为清晰。你需要在什么环境下使用本书本书蠅供的代码适合于运行在一台PC机上(最小硬件配置为80486),使用Wndw895/98/NT,或者D0SV4,x和更高版本的操作系统。这些代码由 Borland lnternational公司(现在称为 Inprise公司)的C+v45进行編译(参见ww. borland.cm),应该图有大约sMB空余空间的硬盘。引言我从事嵌入式系统设计已经超过17年了。在这段时期内,发现嵌入式系统中许多部分看起来一直都没有变。我认为一个入式产品中超过80%的代码都与以前的产品很相似。我总是翁要读模拟的和离散的输人、基于模拟和离散输出的输出控制信号,提供某些形式的用户接口,需要在一个键盘上读/扫描一些键,并且把信息放在一个显示设备的某个端口(七段表示数字和/或到一个LCD模垬上)大多数嵌人式控制器似乎都有一个异步串行端口(也就是,UART,通用异步收发器)及与膝上型电脑之间的接口。我还发现在某一个时间期满的时候需要自已触发事件,并且需要跟踪期和时间。尽管在我职业生涯的某一个时期,开发一些这样的模块是有趣并且带有挑战性的工作,但是在进行每一个新项目的过程中重复同…件事情若干次后,就使该工作变得很平凡甚至是不情愿的事情。我认为真正的挑战性工作是开发一些使我的产品独一无二的应用代码。在这些年中,我已经写了相当多的通用模块以便完成上面提到的一些功能。当使用这些模块时,我优化并月增强它们的功能,这使我得到了一个很大的嵌入式系统构建模块的集就像 Steve Mecon在他的( Cule comnplete)一书中提到的一样,提高代码质量和生产力的唯最佳方法就是复用好的代码”。在 ack gansale的( The Art of Programming Embeded Systems)一书中他提出了:我们的软件开发人员在每一个顶目中都重复开发,这是很滑稽的半情,…聪明的绵程人员则正在为现在和将水的作努力地构建一个工其库……收集各种算法!如果你为嵌人式系统编写软件时话,本书将提供可移植的、随时可以使用的代码,这样将为你的下一个嵌人式系统的设计节约时间。产品上市时同正变得与产品本身的成本一样重要(在某些情况下,甚至更为重要)短产品上市时间将使我们更加具有竞争的优势。如果在产品开发过程中可以让你节约几天或者几周编程时间的话,本书就达到了目的。你可以自己决定使用本书中提供的代码进行快速的原型开发,或者作为最终产品的一个持久附件。本书提供的所有模块与你的产品可能没有什么关系。换句话说,正是你的应用程序代码使你的产品与众不同。例如,在一个传真机上你可能需要一个键盘扫描例行程序和LCD显示器模块。在这个产品中你所要提供的就是传直机方面的识a所以你不需要花很多时间在键盘打描和LCD显示器细节上。编写100%可复用的代码是很困难的。这对于狀入式系统而言尤为正确因为大多数嵌人式系统有非常独特的需求,而且用于保留代码的可执行部分和数据的内存很可能非常有限。本书中提出的代码不是特地为大量出售的嵌入式系统而设计的。因为大量应用程序对价格是很敏感的,这意味着你通常必须考虑内存(BOM和RAM)中的每一个字节。而我所关心的不是为了节约每一个字节。Ⅵ插图、列衰和表格约定你将君到当我引用了某一个图形中的具体元素时我将使用字母F和插图序号。在插图序号后的圆括号中的数字表示试图要引起你注意的图形中的特殊元紫。“F1-2(3)”就是表明在图1-2中请注意第3项列表和表格与插图的约定类似,只不过州表是用字母L开头,而表格是用字母T开头。源代码约定所有这些构建模块对象(函数变量、救 efine常量和宏)都用前缀表明它们与具体的构件相关联。例如,所有的时钟模块函数和变量都以Ck开头。类似地,所有的记时管理器函数和变量都以Tm开头c在所有的源代码中函数以字母序排列。我长期以来一直采用者K&R风格。然而我增加了些自已的特点使得代码我相信)更加容易阅读和维护。縮排总是空4格,从来不使用制表符,在个操作符两边全少留有一个空格,注释总是在代码的右边,常使用注释块来描述函数等等。我也使用首字母简略坷缩写和助记符(AM来使函数变量和#fine名称按照层次方式组织(参见附录C图1-1中用框图来播述本书中涉及到的关键部分。尽管图中显示的构件绝大多数是通过硬件五相作用的但我还是很小心地把依赖于硬件的代码分离到些易于改变的函数和常量中。这样将使代码容易应用到你自已的环境中。此外除非在绝对必要的情况下我避免使用汇編语言异步单行退信sI一口园十一示H+ KEYi+pIspHBbB8Ci高散入高擒出应用利浮马甚人甚抓留CLKO.S. TMR时钟历休酚学囂图1-1本书所涉及的关键部分的块框图Ⅶ各章内容每一章都描述了用图形表示的一个或者多个构件。这些构件大部分都是相独立的,所以你可以跳到所需要的章进行学习。但是你至少阿读第1章的内容,以便能够熟悉我编写中使用到的约定。你也等要了解一下第9章的内容以便能够更好地理解第10章的内容。第1章介绍怎样安装光盘上提供的教件。该章也叙述了一些我所使用的约定,并且提供了一个例子,说明怎样使用本书提供的一些模块。我决定在本书中尽早提出这些信息,以便让你尽快地开始使用这些代码。第2章介绍实时系统的概念,比如前台/后台系统、关键部分,资源、多任务处理、环境转换、调度、重人、任务优先权、互斥、信号量、任务间的通信、任务同步、任务协调、中断、时钟信号等等。第3章描述如图1-1所示的梅件之一:键盘。第3章描述键盘的基本甍念并且提供了一个通用的模块,它可以扦描和译码任何一个3ⅹ3到8x8键值排列的键盘矩阵。该键盘模块可以缀冲按键,如果一个键被按下并保持一定的时间长度,就重复同…个键,可以记录该键被按下了多久的时间,并且允许你定义每一个键的复合扫描代码。该代码可以容易地扩展为支持更大的键盘。第4章该章告诉你怎么样控制LED(发光二极管)显示器。LED显示器可以由离散的LED七段模块或两者的任何组合构成。第4章提供∫一个模块,它叮以将LED从3×3的排列多路复用到8×8的排列。该代码可以容易地改变以适应更人的显示器。第5章该章禔供一个软件模块来控制宇符LCD模块,该模块基于日京(HtMi)公司的HD44780点阵LCD控制器及驱动器芯片。字符LCD(液晶显示器)模块是可以显示字母数字数据的显示设备。第6章该意描述一个软件驱动的时钟/历模块,可以记录时、分、秒、日、月、年(包括闻年)及星期。该代码也提供一个32位的时间戳,它可以用来标记发生的事件。第7章该章描述一个摸块,它最多可以管理250个倒计数的记时器。每一个记时器可以预先设置为最多100小时,间隔(精度)为0.1秒。你可以定义一个函数,当记时器滋出时,执行这个函数(一个数对应一个记时器)第8章该章提供了一个模块,该模块可以读取离散输入和控制离散输出(最多250个)。对于离散的输人,该模块将告诉你輪入是否为高或者低转变是出高到低,还是由低到高或者两者都有。当一个检测到一个转变时,可以执行一个用户定义的函数(每一个函数对应一个输人〕。每个离散的输入也可以模拟一个触发器行为(按ON或OFF)每…个离散的输出可以转化为ON,OFF,或者制作成以用户可定义的速率转换状态。第9章该章将提供一些工具来提高在嵌入式处理器中的数学计算的效率。在这一章中提出的概念将在第10章用到。笫10章该章描述如何读取并按比例确定模撚输人值,如何接比例确定和控剝糢输出值。该章也提供可以读取并按比例确定模拟输入值(至多250个模拟输人)及按比例确定和像正Ⅷ模拟输出值(至多250个模拟输出)的代码。第11章该章讨论了异步串行通信,并特别提供了一段代码,该代码可以在一台PC机上执行缓冲的串行0。实际上咳代码有两个版本。一个版本可用于D0s应用程序,而另一个假设存在实时内核附录A描述怎样使用 Microt/OS- IF The Re- Time Kernel实时内核)。pC/0s-I(简称是一个可移植的、可用ROM的抢先式的实时的多任务的内核。C/0S-I的内部结构在我的另一本书— Microc/OS-H, The Reai-? me Kernel)—中进行了充分的描述,它也可以从R&DBol公司(参见本书背面的广告)获得以及包含了源代码的软盘)。在嵌入式系统构件中提到的大多数代码都假设存在一个实时内核。尤其是,我利用了信号量和时间延迟,这些可以在许多商用的实时内核中得到。为了让读者使用本书中的代码,我已经包含了一个pC/Os-I的编译版本(使用了用于inel80×86 Large Model的 Borland c艹v4.51编译器)。附录B描述一些编程约定。尤其是,我描述了自己的目录结构和C编程风格。附录C列出了本书代码中使用的首竽母简略词、缩写词和助记符附录D提供了我所使用的两个DO公用程序To和 HPLISTC: T0是一个公用程序,我用它来快速地在MS-D0S目录之间进行移动,而不需要输入CD(改变目录)命令。 HPLISTC是一个公用程序,用来以压维的模式打印C源代码(也就是17CPD)并且允许你指定页结束。打印输出的默认值设置为 HP Laserjet型打印机。附录E描述怎样安装本书配套光盘所提供的源代码,并且描述在商业应用教件中使用代码的许可权策路。Web站点为了提供更好的支持我创建!pC/Os-IWeb站点(wWw,u0S-I.om)。读者可以获取如下信息:关于CQS,pC/0S-Ⅱ和嵌入式系统构件的新闻;升级信息;错误修订信息;对丁常见问题的回答(FAQ);应用程序注鄹;书籍信总·分类倌息;链接到其他的Web站点等参考书目Ganssle Jack GThe Art of Programming Embeded syatemsSan Diego, California
用户评论