原书序
我曾与亚历山大·狄恩(Alex Dean)在20世纪90年代供职于联合技术公司时帮助过Otis、Pratt&Whitney、Carrier和Sikorsky等公司改进它们的嵌入式计算项目。自那以后,我们的工作就都与嵌入式系统设计相关,也完成了许多实际工业项目中的设计审查。有时我们也会在特别重要的产品审查中合作,闲聊时他会告诉我最近一些有趣的项目,比如帆船上的小装置。Alex见识到了真实世界中的嵌入式系统设计,并且可以亲手建造实际的系统,这在教授中是不多见的。本书正是反映了他的那段经历。
我们正处于技术人员都在寻求专业化的时代,但是成为一个好的嵌入式系统设计者需要计算机科学与计算机工程两方面的知识。除此以外,很多嵌入式系统的问题都与PC系统或企业系统不同。本书涵盖了嵌入式计算设计空间,平衡了硬件与软件、深度与宽度、性能与约束的关系。嵌入式计算通常被成本、速度、内存、功率等因素高度限制。搭建嵌入式系统也可能对公司有很大影响,由软件缺陷而引发的产品召回成本很可能让一家公司破产。
大多数领域外的人并不了解这项技术的流行程度与难点。举个用于大数据的服务器群的例子。我们都知道其中应该有很多的多核CPU,但还需要有嵌入式计算机和关键嵌入式软件存在于下列位置:网络接口、硬盘管理器、存储箱控制器、板级电源、电源管理、功率分配转换设备、备用电源控制器、备用柴油机引擎控制器、温度显示器、空气处理器、冷却压缩机、冷却安全阀、湿度控制、光照控制、网络转换、标记切换系统、监控录像系统、报警系统、防火系统、自动贩卖机,以及以上所有系统的状态显示系统等。我们往往忽略了对嵌入式计算机的需要。没有嵌入式计算机,高科技世界就不复存在。上面的例子只是冰山一角,嵌入式系统无处不在。除了微控制器,更重要的是整个设计和维护嵌入式系统的团队。嵌入式系统设计得是否成熟决定了一款产品的成败。出现失误时嵌入式系统设计将是个严重的问题,比如软件性能很差甚至存在系统错误,这家公司就会面临数十亿美元的诉讼。
本书适用于碎片式地学习过嵌入式系统的读者,它使用结构化的教学模式将知识串起来。这意味着读者已在其他软硬件课程中学习过如何编程、CPU如何工作以及程序如何执行。本书将这些碎片化的知识整合,也帮助读者掌握一些只在设计大型系统时才使用的习惯。在嵌入式系统中,内存不是“免费”的,也不能简单地增加CPU数目。理解嵌入式系统需要融合科学与工程学的知识,还需要充分认识市场需求的多样性和实际设计的复杂性。
本书给出了不同主题的介绍,包括以下内容。
• 计算机组成和汇编语言。了解中断如何工作是建立嵌入式系统的基础(还有更多的问题需要了解,在这里不再赘述)。
• 数字设计以及软件如何与裸机硬件交互。现代嵌入式系统与外设电路共同工作,需要以最低的总成本获取最大化的系统性能。
• 模拟量的输入/输出,毕竟现实世界不是数字的。
• C语言编程。最适合嵌入式系统编程的语言是C或者C++,大部分项目都建立在已存在的代码库上。
• 时间。计算机的工作要跟上现实世界,而不能反过来让现实世界跟上计算机。如此一来就出现了很多要考虑的问题。
• 理解软件与硬件的情况。最好的嵌入式系统设计者应了解如何利用软硬件的优点。
本书使用Arm Cortex-M0+处理器。该处理器虽然有资源限制,但却有很好的外设选择。此外,本书实例均取自Alex在行业中的工作经验,有助于读者解决实际开发中的问题。
本书整合了碎片化知识,而非单独讲解每个部分。每一章都给出了基于实际MCU评估板的详细实例,这些实例在前几章就开始介绍,在第2章展示了使用GPIO和C语言通过开关控制LED灯。并发性和响应性也出现得很早,从忙等待到抢占式任务调度贯穿在本书的实例中。另外,实例都通过简单的方式完成,使用外设而非强行采用软件方法来提升性能。模拟波形生成器提供了运行示例,可以使用纯软件定时发送DMA数据到DAC。
本书强调让读者了解编译C代码的过程。尽管大多数嵌入式系统由C语言而不是汇编语言编写,读者仍然需要了解编译器的作用来避免代码过长、过慢或者易受竞争条件影响等问题。读者也需要掌握调试优化后的编译代码的方法,可以编写临时低级优化循环来提升代码速度。更进一步的话,还可以了解如何让编译器生成更具效率的代码。
如果读过本书后还需要一些参考书籍,读者可自行选择。如果该书目录中未包含“看门狗”一词,那么就少了些参考价值(Alex这本书包含了看门狗定时器)。期待接下来在教学中选用这本书。
如果你是在校学生,建议关注本书。你可能已经读过很多流行的教材或者只介绍代码的手册,它们可能很贵,但是你并不会从中收获很多知识。本书不同于其他教材,它可以帮你整合零散的知识并了解所有需要的知识,这与在大学中学习的好处是一致的。
菲尔·库普曼(Phil Koopman)教授,美国卡耐基·梅隆大学
Pittsburgh, PA, 2017-1