何立民
北京航空航天大學
智能硬件時代的開源硬件
——寫給硬件工程師們
何立民
北京航空航天大學
微控制器誕生后,傳統電子領域的工程師已升華為軟、硬兼顧,可從事應用軟件開發的電子工程師,但人們仍習慣稱他們為硬件工程師。隨著智能硬件系統的同質化、多種智能硬件的軟件生成、軟件開發工具層出不窮,如今,嵌入式產品開發中的純硬件工作已很少見。智能電子系統的同質化,誕生了用戶板;為解決操作系統通用性與用戶板的特殊性矛盾,在操作系統中引入了板級支持包;FPGA誕生后,有了硬件描述語言的硬件系統設計模式。所有這些,都體現了嵌入式產品開發不斷軟化的趨勢,而且軟化中不斷向用戶開放,便有了如今的開源硬件概念。
開源概念起源于操作系統的源代碼開放。出于商業利益考慮,眾多商用操作系源代碼不向用戶開放。為了便于用戶二次開發,Linux從一開始就是一個源代碼對用戶開放的操作系統,從此便有了開源軟件的概念。目前在嵌入式系統領域有大量的開源RTOS,這些開源RTOS不僅為嵌入式應用做出了巨大的貢獻,還形成了開源文化。即在市場經濟利益交織環境下,為用戶提供一個開放的、低成本的、可任意裁剪、可二次開發的公共平臺。開源軟件出現后,培養出了大批嵌入式領域的軟件人才。
相對于源代碼開放的開源軟件,開源硬件似乎今人費解。因為傳統的硬件體系中沒有數字化代碼,何來開源?因此,開源硬件的開源內涵主要體現在開源文化中的開放、低成本、可二次開發與可任意裁剪上。開源硬件的開放不僅是電路系統的開放,還在于對軟件工程師的開放,因此,開源硬件誕生后,吸引了眾多軟件工程師進入嵌入式應用領域。
可二次開發的開源硬件,是一個基于軟件開發的軟硬件綜合開發平臺;基于軟件的開發模式有利于軟件工程師介入嵌入式產品開發;開源硬件可任意裁剪、任意選擇的特點,為開發眾多個性化嵌入式產品提供了低成本、低門檻、靈活、便捷的手段。
嵌入式應用領域之所以能演化出開源硬件,與其硬件結構的同質化、開發環境的不斷軟化、開源操作系統引入有關。在早期的嵌入式系統產品設計中,電子工程師是主體,因為軟件工程師無法介入硬件系統的應用開發。有了用戶板的嵌入式產品平臺后,軟件工程師在用戶板級產品平臺上,不必了解硬件結構,借助開源RTOS、集成開發環境,就能實現嵌入式產品開發。另外,有了硬件描述語言,軟件工程師可以繞開傳統的硬件設計模式,實現SoC的嵌入式產品設計。所有這些硬件系統設計模式的轉變,為軟件工程師開放了傳統的智能硬件系統設計領域。在他們看來,從用戶可介入二次開發的開源概念出發,不妨以“開源硬件”來描述如今基于嵌入式產品平臺、基于硬件描述語言、以軟件技術為主的智能硬件的開發模式。
從硬件系統開發不斷軟化的變革可以看出,當今的開源硬件有以下幾類:一類是由用戶板進化出的可二次開發的板級開源硬件(早期以樹莓派為代表);另一類是開源硬件描述語言(以Chisel為代表源代碼開放的開源硬件);還有一類是開源操作系統中的開源硬件數據結構(如ARM Device Tree)。
用戶板是最原始的板級開源硬件。由于嵌入式產品都有相同的微處理器內核及通用外圍功能單元,將它們集合起來,可做成一個供眾多嵌入式產品個性化開發的產品平臺。最引人注目的是由樹莓派(Raspberry Pi)引發的智能化通用板級開源硬件。
Raspberry Pi配置了眾多的外圍電路與外部交互接口,與其說是微型電腦,不如說是嵌入式的綜合實驗平臺,是用戶板系統的終極化發展。由于低價位、功能強大、有眾多的外圍電路與I/O端口、易開發的軟件配置,樹莓派迅速成為板級開源硬件的理想化通用產品平臺。2015年統計,板級開源硬件已形成三大主流平臺,即Arduino平臺(Arduino板+Arduino IDE)、Beagle板平臺與Raspberry Pi板平臺。它們集硬件(開放性板級智能電子系統)、軟件(開源RTOS)、開發環境于一身,是一個極佳的通用產品開發平臺。如今,網上商城都可以方便地選購。近年來,也出現了國產化的板級開源硬件,中航工業部門的有關研究所推出了由國產GD32微控制器和RT-Thread實時操作系統構建的一個Colibri-F207ZE開發板,具有軟硬件自主可控、安全可靠,為嵌入式應用提供了有效解決方案,被稱為口袋實驗室。2017年《單片機與嵌入式系統應用》第3期呂華溢等人的“一種軟硬件自主可控的嵌入式實時控制系統”,詳細介紹了Colibri-F207ZE的板級開源硬件及其應用方法。
硬件描述語言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的組合電路設計”,詳細地介紹了這種開源硬件的電路設計方法。
設備樹是嵌入式操作系統中的一種開源硬件數據結構,是嵌入式操作系統中板級支持包(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)