智能硬件时代的开源硬件
——写给硬件工程师们
2017-04-14何立民
何立民
北京航空航天大学
智能硬件时代的开源硬件
——写给硬件工程师们
何立民
北京航空航天大学
微控制器诞生后,传统电子领域的工程师已升华为软、硬兼顾,可从事应用软件开发的电子工程师,但人们仍习惯称他们为硬件工程师。随着智能硬件系统的同质化、多种智能硬件的软件生成、软件开发工具层出不穷,如今,嵌入式产品开发中的纯硬件工作已很少见。智能电子系统的同质化,诞生了用户板;为解决操作系统通用性与用户板的特殊性矛盾,在操作系统中引入了板级支持包;FPGA诞生后,有了硬件描述语言的硬件系统设计模式。所有这些,都体现了嵌入式产品开发不断软化的趋势,而且软化中不断向用户开放,便有了如今的开源硬件概念。
1 开源硬件概念起源与演化
开源概念起源于操作系统的源代码开放。出于商业利益考虑,众多商用操作系源代码不向用户开放。为了便于用户二次开发,Linux从一开始就是一个源代码对用户开放的操作系统,从此便有了开源软件的概念。目前在嵌入式系统领域有大量的开源RTOS,这些开源RTOS不仅为嵌入式应用做出了巨大的贡献,还形成了开源文化。即在市场经济利益交织环境下,为用户提供一个开放的、低成本的、可任意裁剪、可二次开发的公共平台。开源软件出现后,培养出了大批嵌入式领域的软件人才。
相对于源代码开放的开源软件,开源硬件似乎今人费解。因为传统的硬件体系中没有数字化代码,何来开源?因此,开源硬件的开源内涵主要体现在开源文化中的开放、低成本、可二次开发与可任意裁剪上。开源硬件的开放不仅是电路系统的开放,还在于对软件工程师的开放,因此,开源硬件诞生后,吸引了众多软件工程师进入嵌入式应用领域。
可二次开发的开源硬件,是一个基于软件开发的软硬件综合开发平台;基于软件的开发模式有利于软件工程师介入嵌入式产品开发;开源硬件可任意裁剪、任意选择的特点,为开发众多个性化嵌入式产品提供了低成本、低门槛、灵活、便捷的手段。
嵌入式应用领域之所以能演化出开源硬件,与其硬件结构的同质化、开发环境的不断软化、开源操作系统引入有关。在早期的嵌入式系统产品设计中,电子工程师是主体,因为软件工程师无法介入硬件系统的应用开发。有了用户板的嵌入式产品平台后,软件工程师在用户板级产品平台上,不必了解硬件结构,借助开源RTOS、集成开发环境,就能实现嵌入式产品开发。另外,有了硬件描述语言,软件工程师可以绕开传统的硬件设计模式,实现SoC的嵌入式产品设计。所有这些硬件系统设计模式的转变,为软件工程师开放了传统的智能硬件系统设计领域。在他们看来,从用户可介入二次开发的开源概念出发,不妨以“开源硬件”来描述如今基于嵌入式产品平台、基于硬件描述语言、以软件技术为主的智能硬件的开发模式。
从硬件系统开发不断软化的变革可以看出,当今的开源硬件有以下几类:一类是由用户板进化出的可二次开发的板级开源硬件(早期以树莓派为代表);另一类是开源硬件描述语言(以Chisel为代表源代码开放的开源硬件);还有一类是开源操作系统中的开源硬件数据结构(如ARM Device Tree)。
2 板级开源硬件
用户板是最原始的板级开源硬件。由于嵌入式产品都有相同的微处理器内核及通用外围功能单元,将它们集合起来,可做成一个供众多嵌入式产品个性化开发的产品平台。最引人注目的是由树莓派(Raspberry Pi)引发的智能化通用板级开源硬件。
Raspberry Pi配置了众多的外围电路与外部交互接口,与其说是微型电脑,不如说是嵌入式的综合实验平台,是用户板系统的终极化发展。由于低价位、功能强大、有众多的外围电路与I/O端口、易开发的软件配置,树莓派迅速成为板级开源硬件的理想化通用产品平台。2015年统计,板级开源硬件已形成三大主流平台,即Arduino平台(Arduino板+Arduino IDE)、Beagle板平台与Raspberry Pi板平台。它们集硬件(开放性板级智能电子系统)、软件(开源RTOS)、开发环境于一身,是一个极佳的通用产品开发平台。如今,网上商城都可以方便地选购。近年来,也出现了国产化的板级开源硬件,中航工业部门的有关研究所推出了由国产GD32微控制器和RT-Thread实时操作系统构建的一个Colibri-F207ZE开发板,具有软硬件自主可控、安全可靠,为嵌入式应用提供了有效解决方案,被称为口袋实验室。2017年《单片机与嵌入式系统应用》第3期吕华溢等人的“一种软硬件自主可控的嵌入式实时控制系统”,详细介绍了Colibri-F207ZE的板级开源硬件及其应用方法。
3 开源硬件描述语言
硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。硬件描述语言发展至今已有20多年的历史,它将硬件设计软件化,通过EDA工具进行仿真验证,最终通过微电子的ASIC手段或半定制的FPGA来实现一个真实的硬件系统。这是一种非主流电子工程师的非传统硬件系统设计方法,成功地应用于硬件设计的各个阶段,如建模、仿真、验证与数字化模块的综合等。随着系统级FPGA以及系统芯片的出现,软硬件协调设计和系统设计变得越来越重要。传统意义上的硬件设计越来越倾向于系统设计和软件设计结合。硬件描述语言为适应新的情况,迅速发展,出现了很多新的硬件描述语言。硬件描述语言从一开始就是一种用软件工具、在软件方法基础上实现的电路系统设计方法。
Chisel是加州大学伯克利分校研究人员设计并发布的一种新的开源硬件设计语言。Chisel建立在Scala语言之上,可以支持高级硬件设计。用户使用Chisel时,以编写Scala程序的方式来设计硬件电路。采用Chisel设计的电路,经过编译可以得到FPGA、ASIC的Verilog HDL的相关代码。目前国内外已有人使用Chisel语言成功地实现了多种开源处理器。有多个开源项目使用Chisel作为开发语言,包括:采用RISC-V架构的开源标量处理器Rocket、开源乱序执行处理器BOOM(Berkeley Out-of-Order Machine)等。
此外,Chisel的开源特性,也有助于用户了解硬件设计语言的内部实现机理,并在此基础上进行特定的优化与改进。2017年《单片机与嵌入式系统应用》第3期刊登雷思磊的“开源硬件描述语言Chisel的组合电路设计”,详细地介绍了这种开源硬件的电路设计方法。
4 操作系统中的开源设备树
设备树是嵌入式操作系统中的一种开源硬件数据结构,是嵌入式操作系统中板级支持包(Board Support Package,BSP)的华丽转身,其源头是PowerPC的Device Tree技术。目前,最著名的是ARM Linux中的扁平设备树FDT(Flattened Device Tree)。
早先在嵌入式系统中引入操作系统时为了满足操作系统对硬件单元的有效管理,设置了板级支持包,并添加有大量的驱动程序固件。板级支持包介于主板硬件与操作系统之间,是操作系统的一部分。程序员在使用嵌入式操作系统时,可以根据硬件结构的变化,在BSP中添加一些和系统相关的驱动程序。因此,随着主板的升级与变更,BSP也愈加庞杂。
以ARM Linux为例,早期的ARM Linux中充斥着大量的垃圾代码,相当多的代码只是在描述板级细节,而这些板级细节对于内核来讲,只是垃圾。后来引入了PowerPC已成熟应用的Device Tree技术,使得ARM Linux内核中的BSP华丽转身为扁平设备树。
Device Tree是一种描述硬件的数据结构,基本上是一个描述电路板上CPU、总线、设备组成的树形结构,由一系列的结点(node)和属性(property)组成,结点本身可包含子结点,可用来描述原先Kernel中的大量板级细节与硬件细节,直接通过它传递给Linux。Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的众多设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应设备。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息。
由根结点、子结点、叶结点形成了硬件相关的树形结构,树结构将在节点之间创建父子关系,此父子关系是体系结构无关性的关键。当叶驱动程序或总线结点驱动程序本质上需要依赖于体系结构的服务时,该驱动程序会请求其父级节点提供该服务。采用此方法,不管计算机或处理器的体系结构是什么,驱动程序都可以正常运行。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息,这使得ARM Linux内核中的冗余编码大大减少,同时也使得用一个内核镜像去引导同一类ARM芯片集的硬件平台成为可能。2017年《单片机与嵌入式系统应用》第3期罗名驹等人的“扁平设备树FDT在ARM Linux中的应用研究”详细地介绍了ARM Linux中的FDT,以及如何通过FDT获取板级硬件的细节信息。
结 语
�士然
2017-02-02)