2.3 嵌入式系统
嵌入式系统的常规定义是在一块计算机硬件上运行软件以执行特定的任务。例如,电视机顶盒、智能卡、路由器、磁盘驱动器、打印机、汽车发动机管理系统、MP3或复印机。与计算机系统相比,不同之处在于计算机上具有各种各样的通用软件,以及输入和输出的设备,如键盘和某种类型的图形化显示器。
现在,这种区分变得越来越模糊,如移动电话,一个基本电话原型可能只能执行拨打电话的任务,但现代智能手机还可以运行一个复杂的操作系统,甚至可下载成千上万的应用程序。
嵌入式系统可能包含简单的8位微处理器,如Intel 8051或PIC微控制器,或者包含一些复杂的32位或64位处理器,如ARM系列。因此产生了本书的题材。系统需要一些RAM和某种形式的非易失性存储空间来保存系统执行的程序,需要一些额外的外围设备,对于这些设备的实际功能(通常包括通用异步收发器(UART)、中断控制器、定时器、GPIO控制器)也可能是相当复杂的模块,如DSP、GPU(图形处理器)或DMA控制器。
在嵌入式系统上运行的软件通常分为两个独立的部分:操作系统(OS)和在OS上运行的应用程序。大量投入使用的操作系统,从简单的内核、复杂的实时操作系统(RTOS),到全功能的、存在于电脑上的复杂操作系统。电脑上的系统是我们熟悉的Windows或Linux系统。本书将主要集中在Linux上,Linux的源码可以很容易被读者找到,也是许多程序员所熟悉的。Linux系统的课程学习也同样适用于其他操作系统。
由于嵌入式系统上很多限制存在,与通用PC的编程相比,嵌入式系统的编程可能会面临更多的挑战。
(1)内存占用。在许多系统中,为了最大限度地降低成本,内存的大小是被限制的。程序员可能会被迫考虑程序的规模,以及在程序运行时如何减少对内存的使用。
(2)实时性。某些系统的特点是对外部事件的响应有一定的时间限制。这可能是“硬性”的要求(如汽车制动系统必须在一定时间内响应)或“软性”的要求(如音频处理必须某个时间帧下完成,以避免糟糕的用户体验,不能满足则可能导致这个系统不值钱)。
(3)功率。许多嵌入式系统中的电源都是电池,程序员和硬件设计师必须最大限度地减少对系统的能源使用。这是可以做到的,例如通过减慢时钟、减少供应电压或在没有工作的时候关闭处理器。
(4)成本。成本可能是一个系统设计的最大约束点。
(5)上市时间。在竞争激烈的市场中,开发一个产品所用的时间是影响该产品的成功的一个重要因素。