1. 搭建工作环境:选择内核、处理器与工具链
1.1. 认识嵌入式操作系统内核
今天是信息和数据高度发达的数字时代,人们对智能设备需求的日益增长,出现了形式多样的数字化设备。我们已经几乎无法离开智能手机带来的便利;以电视、门锁等为代表的各式家具家电也在朝着数字化的方向发展;汽车的价值也因为搭载各类数字化设备而不断提升;现代工厂里巨大的机器和自动化流水线内部往往是由一个个小型的数字传感器和控制器构成。未来,随着物联网、智慧工厂、智慧城市、车路协同等各种新兴概念和技术的发展,还会产生更多形式的数字设备,给我们的社会带来更为深远的影响。数字化的设备形态各异,种类繁多,但通常都需要把一个专门设计的计算机系统嵌入其中,从而提供数字化和智能化的功能。所以人们称之为嵌入式设备。
嵌入式操作系统是工作在嵌入式设备上的操作系统,其内核提供了驱动设备硬件,实现软件应用的编程框架。下面让我们具体了解一下嵌入式操作系统的内核。
1.1.1. 操作系统是什么
如果用一句话来形容操作系统,我想应该是“连接人类与计算机之间的桥梁”。准确的说,操作系统是帮助人类使用计算机的软件系统。比如说上网看个小视频吧,我们就需要跟很多硬件设备打交道。首先,我们需要一台显示器来播放图像;其次,我们需要一个音响来播放声音;除此之外,还需要一个网卡来上网,需要鼠标和键盘来点击链接输入网址。如果想要把视频下载下来随时观看的话,还得准备一个硬盘来保存视频数据。人们总是觉得能够上网看视频是计算机最基本的能力,很少有人会关注这样一个简单的功能背后的细节。正是站在我们和计算机之间的操作系统,做了大量的工作,为我们隐藏了那些硬件的工作原理,相互配合的流程细节,才使得人类能够轻松地使用计算机看小视频。
“操作系统是人类的好帮手”这种说法是站在我们使用者的角度来讲的。如果从计算机的立场出发,那么操作系统应该是“计算机的好管家”。从计算机的角度来看,“人类的要求真多,总让我干这干那的,整慢了还不高兴”。而且现如今人类指派的任务越来越复杂了,往往需要多个设备一起配合才能完成工作。比如刚刚提到的上网看小视频这个功能,就涉及了显示器、音响、网卡、鼠标、键盘、硬盘这些设备。除此之外,还有处理器、内存、各种总线、显卡、声卡……许多硬件需要管理。操作系统在这里就起到了一个资源管理器的作用。它负责协调各方面的工作,解决资源冲突的问题,尽可能的提高各个设备的使用效率。
这两个角度正是 Andrew S. Tanenbaum 在他的经典著作 《现代操作系统》中提到的操作系统的两个身份。从人类的视角来看,操作系统就是计算机的扩展(The Operating System as an Extended Machine);从计算机的视角来看,则是资源管理器(The Operating System as Resource Manager)。如上图所示,操作系统正是由人机和软硬两个界面所包裹的软件系统。
大体上,操作系统可以拆分为内核、应用程序和系统驱动三个部分。很多人把操作系统和内核两个概念混用,在我看来是不合理的。内核的作用是对系统资源和工作任务进行抽象,提供通用的接口和编程框架,并没有实现什么具体的功能。脱离了应用程序和系统驱动,仅靠内核是不能让计算机为我们所用的。系统驱动直面各种硬件设备,保证它们能够正常工作,接受内核的管理和调度。各种应用程序为人类提供了丰富多样的服务,在内核的协调之下,满足了我们形式各样的需求。所以只有将内核、应用程序和系统驱动看做一个整体,才可以将之称为操作系统。
1.1.2. 嵌入式操作系统的特点
在介绍嵌入式操作系统之前,我们有必要研究一下嵌入式系统。遗憾的是,嵌入式设备的边界很模糊,并没有一个明确的定义。我所理解的嵌入式设备,是为满足特定的应用需求,但是受到空间、功耗、成本等诸多因素的影响,将以微处理器(MCU)为核心的专用计算机嵌入其中的设备。
相比于通用的计算机系统,比如PC机,服务器等,嵌入式设备的关键在于定制化,是为了特定应用需求专门设计的软硬件系统。可以说它们追求的不是通用而是实用,其形态也会因为具体的应用而有所不同。根据应用不同,大体上可以分为以下的几类:
以手机、平板为代表的消费类电子产品。最早的手机只是拿来打打电话,收发短信,有些简单的游戏,对于计算的需求并不强烈。自从iPhone的横空出世,手机的功能被不断扩展而且还发展出了一个所谓的移动互联网行业。这类电子产品追求的是用户体验,它们不断地提升硬件的性能,软件的功能,现在和通用的计算机之间的界限已经变得很模糊了。运行在它们上面的操作系统,目前基本上是Android和iOS两家的竞争。
以洗衣机、空调、指纹门锁等为代表的智能家电产品。这类产品的功能很简单,之所以冠以智能二字,更多的是因为它们可以和手机的App互动,远程管理。它们追求的是数字化和低成本,所以这类设备的资源通常都是受限的。运行在这类设备上的操作系统通常都是极简的,甚至是裸机运行。
以桥梁在线监视传感器等为代表的物联网应用。这类产品旨在实现被检测对象的数字化。相比于上一类设备,它们的功能更简单,可以说是单一。但是往往需要长时间在线工作。其软硬件资源极为有限,基本上不需要任何操作系统。
以飞控系统、汽车的ECU为代表的航空航天、汽车电子、工业现场产品。它们一般作为汽车、飞机、产线这类庞大系统中的一个子系统或者模块存在。这类产品的资源一般也比较有限,但是在系统的实时性、可靠性、安全性上有着很高的要求。其操作系统一般都是有较强实时性的,通过各种可靠性认证的VxWorks,μC/OS,NuttX等。
以交换机、路由器、基站为代表的通信设备。它们需要长时间稳定工作,而且数据量很大,追求的是高吞吐率、高可靠性。其计算资源相对比较富裕,一般运行具有丰富网络功能的Linux系统。
总的来说,嵌入式设备上运行的操作系统是根据需要定制化的。至于一个设备应该选用什么样的操作系统,往往是在资源和性能之间的相互妥协退让的过程中决定的。这里存在一个矛盾,我们研究嵌入式操作系统是希望它能够用在更多的嵌入式设备上,这是在追求通用,但是嵌入式设备却是定制化的。
嵌入式操作系统与其说是操作系统,不如说是编程框架。因为在不同设备上,我们通常都需要根据具体的硬件对操作系统进行移植和裁剪,不存在哪个操作系统可以通吃所有的嵌入式设备。但是操作系统背后的进程模型、驱动模型、内存模型、文件模型等诸多基础的理念或者说是编程模式,是放在任何设备上都行得通的。