嵌入式系统/嵌入式系统简介
嵌入式技术现已进入黄金时期,可用的知识财富令人惊叹。然而,大多数嵌入式系统工程师都有一个共同的抱怨。互联网上没有关于该技术的各种设计和实现问题的全面资源。许多公司的知识产权规定部分是造成这种情况的原因,以及将技术诀窍保留在一个受限的研究人员群体中的趋势。
在开始阅读本书的其余部分之前,首先了解嵌入式系统到底是什么以及它们是如何使用的非常重要。本维基百科将尝试涵盖大量主题,其中一些主题仅适用于嵌入式系统,但另一些主题将适用于几乎所有计算机(嵌入式或其他)。因此,本书中的一些材料可能会与其他侧重于低级计算、汇编语言、计算机体系结构等主题的维基百科的材料重叠。但我们首先从基础开始,并在本书真正开始之前尝试回答一些问题。
需要首先提出的第一个问题是,“嵌入式计算机究竟是什么?”嵌入式计算机通常是指为特定目的而实现的计算机。相比之下,普通PC计算机通常用于多种目的:检查电子邮件、上网、听音乐、文字处理等…然而,嵌入式系统通常只有一种任务,或者只有很少的几个与它们被编程执行的任务相关的任务。
每个家庭都有几个嵌入式计算机的例子。例如,任何带有数字时钟的家用电器都配备了一个小型嵌入式微控制器,除了显示时钟之外,它不执行任何其他任务。现代汽车配备了车载嵌入式计算机,使用来自许多不同传感器的输入来控制诸如点火正时和防抱死制动等功能。
然而,嵌入式计算机很少具有通用接口。即使嵌入式系统具有键盘和液晶显示屏,它们也几乎无法使用许多不同类型的输入或输出。一个具有I/O功能的嵌入式系统的例子是带液晶状态显示屏和用于输入密码的键盘的安全警报系统。
一般来说,嵌入式系统:它是执行特定任务的硬件和软件的组合。
- 是一个构建用于执行其职责的系统,完全或部分独立于人工干预。
- 是专门设计以最有效的方式执行少量任务的系统。
- 与我们环境中的物理元素交互,例如控制和驱动电机、感测温度等。
嵌入式系统可以定义为旨在执行特定任务的控制系统或计算机系统。嵌入式系统的常见示例包括MP3播放器、飞机上的导航系统和入侵警报系统。嵌入式系统也可以定义为单用途计算机。
大多数嵌入式系统都是时间关键型应用,这意味着嵌入式系统工作在一个时间非常重要的环境中:操作的结果只有在特定时间范围内发生时才相关。飞机上的自动驾驶仪就是一个时间关键型嵌入式系统。如果自动驾驶仪检测到飞机由于某种原因即将失速,那么它应该在几毫秒内采取措施进行纠正,否则将产生灾难性的后果。
当在微处理器和少量硬件上以软件方式设计的产品的实施成本低于、更可靠或由于其他某些原因优于离散硬件设计时,就会考虑使用嵌入式系统。一个小型且相对便宜的微处理器可以替代数十甚至数百个硬件逻辑门、定时电路、输入缓冲器、输出驱动器等。同样,一个具有标准输入和输出配置的通用嵌入式系统只需更改软件即可以完全不同的方式执行。
嵌入式系统的用途实际上是无限的,因为每天都有新产品进入市场,这些产品以新颖的方式利用嵌入式计算机。近年来,诸如微处理器、微控制器和FPGA芯片等硬件变得越来越便宜。因此,在实现新的控制形式时,明智的做法是购买通用芯片并为其编写自己的自定义软件。生产定制芯片以处理特定任务或任务集的成本要高得多。许多嵌入式计算机甚至带有丰富的库,因此“编写自己的软件”实际上变得非常简单。
从实现的角度来看,计算机和嵌入式系统之间存在主要区别。嵌入式系统通常需要提供实时响应。实时系统被定义为其正确性取决于其响应及时性的系统。此类系统的示例包括飞机的飞行控制系统、核反应堆和发电厂中的传感器系统。对于这些系统,响应延迟是一个致命错误。实时系统的更宽松版本是及时响应且延迟很小的版本是可以接受的。此类系统的示例将是铁路站台上的调度显示系统。在技术术语中,实时系统可分为
- 硬实时系统 - 对响应及时性有严格约束的系统。
- 软实时系统 - 可以容忍响应时间略有变化的系统。
- 混合实时系统 - 对其性能表现出硬约束和软约束的系统。
嵌入式计算机可能经济实惠,但它们常常容易出现一些非常具体的问题。PC计算机可能会附带软件故障,一旦发现,通常可以发布软件补丁来解决问题。然而,嵌入式系统通常只编程一次,并且软件无法打补丁。即使可以在嵌入式系统上修补有故障的软件,该过程对于用户来说也经常过于复杂。
嵌入式计算机的另一个问题是,它们通常安装在可靠性不容有失的系统中。例如,控制汽车制动的计算机在任何情况下都不能允许发生故障。导弹中的目标计算机不允许发生故障并意外地攻击友军。因此,在将生产软件拼凑在一起时使用的许多编程技术不能用于嵌入式系统。在芯片离开工厂之前必须保证可靠性。这意味着每个嵌入式系统都需要经过广泛的测试和分析。
与台式电脑等成熟的计算系统相比,嵌入式系统将拥有非常少的资源。嵌入式系统的内存容量和处理能力有限。与为台式机系统开发应用程序相比,开发嵌入式系统更具挑战性,因为我们正在为非常受限的环境开发程序。一些嵌入式系统运行名为RTOS(实时操作系统)的缩减版操作系统。
嵌入式系统每天都在我们的生活中扮演着重要的角色,即使它们不一定可见。我们每天使用的一些嵌入式系统控制着电视上的菜单系统、微波炉中的定时器、手机、MP3播放器或任何其他内置一定智能的设备。事实上,最近的民意调查数据显示,美国目前嵌入式计算机系统的数量超过了人类的数量。嵌入式系统是一个快速发展的行业,其中发展机会众多。
本书旨在配合计算机工程课程学习使用。但是,本书对于任何对计算机感兴趣的读者也同样有用,因为它可以作为计算机“自底向上”学习的起点。学习小型、受限、简单的计算机比一开始就学习我们日常使用的庞大PC巨头要容易得多。本书涵盖的许多主题也将是软件主题,因此,本书对至少具有一定编程背景(尤其是C语言和汇编语言)的人最有帮助。具备半导体和电子电路的先验知识将是有益的,但不是必需的。
本书将主要关注嵌入式系统,但读者需要理解两个简单的事实
- 本书在没有对微处理器架构进行一般性讨论的情况下无法深入进行。
- 本书中讨论的许多概念同样适用于台式计算机,甚至比嵌入式计算机更适用。
为了完整起见,本书将涵盖一些与所有计算机普遍相关的内容。本书中的许多课程甚至比嵌入式系统工程师更适合台式计算机程序员应用。也许更准确地说,本书更多地是关于“低级计算”,而不是“嵌入式系统”。
当然,本书也会涵盖许多在台式计算机编程中无关紧要的嵌入式系统主题,例如交叉编译器、实时操作系统、EEPROM存储、代码压缩、位邦定串行端口、脐带式开发等等。
阅读本书后,可以继续学习许多潜在的领域。
- 对于对操作系统和硬件软件接口感兴趣的人,请阅读操作系统设计维基教科书。
- 对于对C语言编程或汇编语言编程感兴趣的人,请分别参考编程:C和X86汇编维基教科书。
- 对于对数字控制系统感兴趣的人,将来会有一本关于该主题的书(可编程逻辑)
- 对于对数字信号处理感兴趣的人,将来会有一本关于该主题的书。
- 对于对更高级计算机系统进一步研究感兴趣的人,将来会有一些关于计算机硬件和微处理器的书籍(微处理器设计)
- 对于对更底层的电子学理解感兴趣的人,请参考数字电路。
- 维基versity:小型信息系统学院是一个课程,其中包括在FPGA上运行Java。
- 对于对设计运动控制系统感兴趣的人,即计算机控制的机器,如机器人、机床、汽车、公共汽车、飞机、船舶、卫星、望远镜等,请参考嵌入式控制系统设计。
我们试图使本维基教科书语言中立。当所有嵌入式计算机都不能用一种语言编程时,专注于一种语言是不公平的。
但是,在某种实际语言中拥有功能性的示例代码是很好的。此外,指出某些流行编程语言对嵌入式系统特别重要的特性也很有用。
- ANSI C编程语言:许多微处理器和微控制器可以用C语言编程,并且存在许多用于此目的的C交叉编译器。C可能是新嵌入式系统开发中最常用的语言。“volatile”关键字在桌面应用程序编程中很少使用,但在嵌入式系统/C编程中变得非常重要。
- 最初由国防部为实时操作系统和嵌入式系统开发的Ada,其设计具有多处理器支持和强大的编译时检查,以确保开发系统的质量和完整性——许多微控制器可以用Ada进行编程,因为GNAT Ada编译器是经常移植的GNU编译器集合的一部分,尽管文档通常不如其他更流行的语言(如C)那样可用。
- 汇编语言:有许多不同的微控制器系列,每个系列都有自己的汇编语言,并具有其独特的特性。本书将介绍大多数微控制器通用的汇编语言基础知识。与桌面应用程序编程不同,嵌入式系统程序通常必须设置“中断向量表”。
- 本书将讨论(至少简要地)一些多语言编程技术(特别是C语言和汇编语言)。
- 在某些情况下,微控制器最好用不同的语言进行编程(BASIC和Forth就想到)。
- 有些控制器甚至用它们自己的专有语言进行编程(例如PIC Basic和Dynamic C)。
- 一些非常著名的语言,如C++和Java,在嵌入式系统中很少使用,因为C++和Java编译器在流行的微控制器中根本不可用。但是,本书可能会偶尔描述如何在不支持这些语言的环境中实现C++和Java特性。
- 一些流行的微控制器可以使用Python编译器。Pyastra [1]可以编译所有Microchip PIC12、PIC14和PIC16微控制器。PyMite [2]可以编译“AVR系列中任何至少具有64 KiB程序存储器和4 KiB RAM的设备”。PyMite也针对(某些)ARM微控制器。请注意,这些嵌入式Python编译器通常只能为这些设备编译Python语言的一个子集。
进一步阅读