如何加速物聯網操作系統開發?Zephyr項目引入JavaScript這樣做到的
據統計軟件工程師的數量遠遠大于硬件工程師,而物聯網設備需要軟件和硬件的高度融合才能實現良好的用戶體驗。原來只針對硬件工程師的開發環境已經無法滿足物聯網產品快速開發的需求,因此將web開發環境與物聯網操作系統逐步融合成為物聯網操作系統提供商首要考慮的問題。為了兼顧物聯網設備內存限制的問題和開發者的設計需要,Zephyr操作系統引入了JavaScript。
眾所周知,JavaScript是一款非常流行的編程語言,目前它已經從最早的桌面web瀏覽器快速發展到Node.js服務器,它也可以應用于物聯網這種小型設備,讓設備裝上帶有JavaScript Runtime的Zephyr實時操作系統(以下稱為ZJS開發環境)。ZJS開發環境是基于JerryScript(一個輕量級的JavaScript引擎)和Zephyr實時操作系統開發的。當用戶使用該工具編寫應用程序時,ZJS開發環境可以向工程師提供Node.js API和JavaScript API子集,其中包括傳感器、執行器和通信器。對于那些已經掌握JavaScript技能的開發人員,ZJS開發環境簡單易學,可以快速建立原型。
ZJS開發環境最初的目標是可以順暢無阻地在Arduino 101開發板上運行。Arduino 101是基于英特爾X86架構的一款Arduino平臺。與Arduino Uno功能相似,在原有的基礎上增加了低功耗藍牙、加速度計和陀螺儀。
圖1:Arduino 101開發板
英特爾讓Zephyr結緣JavaScriptZephyr項目是Linux基金會推出的一款開源實時操作系統,它在一系列開發板上支持X86架構、ARM架構和ARC架構處理器,如:Arduino 101、Minnowboard Turbot, NXP FRDM-K64F和Arduino Due。JerryScript是開源的、輕量級的JavaScript引擎,它可以讓內存受限的設備執行ECMAScript 5,它支持存儲空間小于64KB RAM和200KB ROM的設備,它還在各種開發板上支持X86架構和ARM架構處理器。
2016年初,英特爾開始將兩種技術結合,試圖利用Zephyr操作系統推出一種可以應用于Arduino 101和未來物聯網開發板的可替代開發環境,因此將JavaScript引入了Zephyr。目前,Zephyr操作系統可用C語言編程,但是編寫程序需要大量的專業知識儲備,而JavaScript接口可以讓工程師免去大量復雜的編程工作。Zephyr目前也在探索JavaScript在各個層面上的優勢,從小型嵌入式設備到大型服務器,從原型到無縫的端到端應用程序。
結合以后的開發環境最后定名為帶有JavaScript的Zephyr實時操作系統(ZJS開發環境),并且向工程師提供JerryScript開發環境,用戶只要添加應用接口就可以實現各種物聯網硬件特性,通過工具可以簡化開發工作。
各種應用可單獨執行,占用空間最小化當用戶建立一個Zephyr操作系統工程時,用戶會先創建一個完整的系統鏡像,通過操作系統組件運行單一應用程序,這些組件就是用戶在實際中使用的,它可以使系統鏡像占用空間最小化。Zephyr操作系統支持執行線程服務、定時器服務、內存管理、同步和數據傳輸服務,其中每一項都可以選擇獨立執行,這取決于用戶是否需要這項服務。它還為其支持的芯片和板卡提供硬件驅動,如GPIO、ADC、PWM、I2C、SPI總線、UART和低功耗藍牙。同樣,這些硬件驅動也可以獨立執行,從而使系統鏡像占用的ROM 和RAM 最小。
通過對來自JavaScript的代碼做簡單的數據分析,ZJS可以利用Zephyr操作系統的可配置性建立工程。例如:如果GPIO接口被采用,所需要的驅動程序和相關的ZJS應用代碼將會包含到項目中,反之亦然;如果你的項目涉及到所有的驅動程序,那么得到的系統鏡像會很大,因此不適用于小型設備,如:添加低功耗藍牙目前會用到額外的7.2KB RAM和56KB ROM。如果你很在乎系統鏡像的尺寸,但必要時也可以限制額外的應用,那么你就可以對尺寸和項目占用空間進行協調平衡。
目前,ZJS可以為GPIO,ADC,PWM,I2C,BLE提供應用程序接口,并且可以為帶有RGB背光的LCD面板提供簡化接口,也支持setInterval/setTimeout 簡化的執行子集。另外,ZJS支持物聯網開放連接基金會(OCF)規范互操作性,包含相同的JavaScript API,例如在Node.js中提供Iotivity-node模塊。未來會支持SPI接口,W3C通用傳感器API,以及其它Node.js API開發。
圖2:Arduino 101 開發板上的基于Zephyr 項目的JavaScript實時架構
以Arduino 101 開發板為例,英特爾Quark ? SE處理器在Arduino 101開發板上有兩個MCU核:一個是X86架構,一個是ARC架構。要使這兩個核的硬件得到充分利用,C語言程序員必須直接做處理。幸運的是,ZJS API可以利用來自JavaScript相同的內容使ARC硬件特性得以實現。在必要時,ZJS API可以無縫地與ARC核心上運行的支持ZJS的image通信。(見圖2)
Arduino 101包含80KB RAM和384KB 閃存。默認情況下,閃存分配144KB給X86應用,分配152KB給ARC應用。ZJS需要在ARC中將代碼最小化,這有利于重新分區,從而給X86應用預留更多存儲空間。Zephyr工程師為Arduino固件開發了一個補丁,它可以使用戶把程序從144KB的 X86區塊遷移到256KB的ARC區塊,處理完成然后再遷移回來。這種模式不僅為ZJS提供了足夠的運行空間,而且它還提供二進制刷機包,讓用戶改變或恢復存儲更簡單。
權衡利弊,用戶各取所需將JavaScript應用于小型嵌入式設備的優勢如下:
- 很多工程師已經熟悉JavaScript,這意味著它們利用ZJS開發環境進行設計更簡單;
- JavaScript 使用戶可以在不同的環境下編程,如PC、云端、移動端和物聯網設備上,這些代碼可以重用,從而提高工作效率;
- 工程師在這些系統之間使用通用數據交換格式JSON的潛力,這將減少寄送各種開發板的成本;
- JavaScript也可以在瀏覽器中打開,更容易進行器件仿真。
對于任何解釋語言來說都一樣,從做出改變到看到改變的周期很短,JavaScript也是如此。誠然,最初這一優勢會因為我們的系統無法體現,因為工程師需要編譯Zephyr操作系統,并將其更新到設備上。但我們可以使用 ashell 功能來回收一些這樣的好處,這是一個不安全的開發者模式,允許您與設備交互并上傳新的 JavaScript 而不重刷。
Zephyr計劃向工程師提供基于瀏覽器的IDE,這樣工程師就可以在瀏覽器上通過仿真器進行開發。
然而,在小型資源受限設備中使用JavaScript也有弊端:
占用額外資源。通常本地代碼會更快更小,因為JavaScript引擎會消耗一部分系統RAM和ROM,因此在資源嚴重受限的設備上就減少了留給應用程序的存儲空間。例如,工程師熟悉的最小的helloworld.js示例需要大約133KB ROM。大一點的WebBluetooth示例需要199KB ROM和42KB RAM。對比發現,相同的WebBluetooth示例通過C語言完成只需要65KB ROM和18KB RAM(JavaScript包含一個大的頭文件,但未必會全都用到)。
處理中斷程序復雜。C程序會處理一些簡單的中斷程序,在這種情況下兩者性能差異也十分顯著。JavaScript中執行這一邏輯時,待處理事件必須在隊列中排隊(相當于Zephyr操作系統的進程內容),內容交換后,再回調到JavaScript引擎,最后讓本地API工作。
JavaScript實時性能不確定。例如,垃圾信息收集可以在正常的活動脈沖中引入停頓。因此,JavaScript可能不適合有嚴格的實時要求的應用程序,但它非常適用于普通的應用程序。然而,隨著Zephyr項目的逐步成熟這類問題會減少。
總之,引入JavaScript的Zephyr操作系統系統有利有弊,用戶可以根據自身設計需求選擇使用,發揮其優勢作用,加快項目開發。未來的ZJS會越來越完善,更大程度地滿足用戶需求。
關于Zephyr項目Zephyr 項目是一款小型且可擴展的操作系統,尤其適用于資源受限的系統,可支持多種架構;該系統高度開源,對于開發人員社區完全開放,開發人員可根據需要對該系統進行二次開發,以支持最新硬件、工具和設備驅動程序;該系統高度模塊化平臺,可輕松集成任何架構的第三方庫和嵌入式設備。
來自:http://geek.csdn.net/news/detail/133848