物聯網作業系統主要是指運行在物聯網設備上的嵌入式作業系統,包括RTOS(Real-time Operating System),也可以包括Android,Linux。本文主要講RTOS相關的系統架構。
越來越多的設備具備接入網絡的能力,使得物聯網的發展在迅速加快。阻礙物聯網發展的幾個因素還包括成本,設備軟硬體差異大和協議不統一。隨著設備/服務提供商和消費者都越來越認可智能化提供的價值,產業規模在迅速擴大,推動了技術發展,規模效應也進一步降低了成本。硬體上晶片廠商通過SoC的方式集成更多周邊器件,軟體上通過平臺對設備差異進行屏蔽,結成標準聯盟等都促進了設備的互聯互通。
另外,算力在邊緣端設備的增強,讓過去廣泛使用單片機的產品開始使用微處理器,微處理器上運行作業系統,讓設備可以集成複雜的功能,網絡協議和算法。阿里巴巴,騰訊都相繼推出了自己的物聯網作業系統,作業系統是智能化改造的平臺和基礎。
衡量物聯網嵌入式作業系統的重要指標包括:
輕量級:編譯出來的固件(Firmware)小,小的固件意味著存儲所需Flash空間小,做OTA升級時需要傳輸的數據少(更快的升級速度,良好的用戶體驗和無線環境下的更低失敗率)。通常這些作業系統的內核會比較簡單,且通過配置和編譯選項(makefile等)擁有可裁剪的內核/子系統,
資源消耗少:包括CPU,Flash,內存等資源,通常物聯網設備的CPU資源因為功耗和成本考慮,在選型時不會預留很大的buffer。Flash和內存大小一般在幾Mbytes。很多系統當內核和平臺必需的模塊運行起來後,可供應用使用的內存不到幾百KBytes。
低功耗:對於無外接供電使用電池的設備來說低功耗尤其關鍵。一些物聯網設備一塊電池使用時間長達數年。CPU往往是功耗的最大用戶,通常通過處理器睡眠或在不同應用場景調節CPU的頻率來降低功耗。
新接入設備的速度:易於移植和接入系統是構建生態的重要基礎,提供SDK將平臺的差異化部分剝離出來,提供通用的組件,標準的接口和協議,減少重複開發。
良好的設備抽象:屏蔽底層設備的差異,將設備的能力抽象成服務開放。
安全:提供加密算法庫等組件。
常用的RTOS包括FreeRTOS,AliOS things,TencentOS Tiny,LiteOS,ucOS等。一個RTOS作業系統一般包含內核,BSP,驅動,協議,應用組件,文件系統等。以TencentOS Tiny物聯網作業系統為例:
CPU 庫 :TencentOS tiny 支持的 CPU IP 核架構,當前主要支持 ARM Cortex M0/3/4/7。
驅動管理層 :包括板級支持包(BSP,主要由 MCU 晶片廠家開發與維護)、硬體抽象(HAL,主要由 TencentOS tiny 提供,方便不同晶片的適配與移植)、設備驅動(Drivers,例如 Wi-Fi、GPRS、LORA 等模塊的驅動程序)。
內核 :TencentOS tiny 實時內核包括任務管理、實時調度、時間管理、中斷管理、內存管理、異常處理、軟體定時器、鍊表、消息隊列、信號量、互斥鎖、事件標誌等模塊。
IoT 協議棧:TencentOS tiny 提供 lwip、AT Adapter、SAL 層,支持不同的網絡硬體,例如乙太網、串口 Wi-Fi、GPRS、NB-IoT、4G等通信模塊。TCP/IP 網絡協議棧上提供常用的物聯網協議棧,例如 COAP、MQTT,支撐終端業務快速接入騰訊雲。
安全框架:TencentOS tiny 為了確保物聯網終端數據傳輸安全以及設備認證安全,提供了完整的安全解決方案。安全框架提供的 DTLS 和 TLS 安全協議,加固了 COAP 及 MQTT 的傳輸層,可確保物聯網終端在對接騰訊雲時實現安全認證和數據加密;另外針對低資源的終端硬體,安全框架還提供與騰訊雲 IoT Hub 配套的密鑰認證方案,確保資源受限設備也能在一定程度上實現設備安全認證。
組件框架:TencentOS tiny 提供文件系統、KV 存儲、自組網、JS 引擎、低功耗框架、設備框架、OTA、調試工具鏈等一系列組件,供用戶根據業務場景選用。
開放 API(規劃開發中):TencentOS tiny 將在協議中間件和框架層上提供開放 API 函數,方便用戶調用中間件功能,使用戶無需過多關心中間件具體實現,快速對接騰訊雲,實現終端業務上雲的需求,期望最大程度減少終端物聯網產品開發周期,節省開發成本。
示例應用 :TencentOS tiny 提供的示例代碼,模塊測試代碼等,方便用戶參考使用。
再來看下FreeRTOS的架構,這裡引用了一個Amazon FreeRTOS:
最後,以AliOS Things為例:
AliOS Things是阿里巴巴推出的面向IT領域的輕量級物聯網嵌入式作業系統,適用於多種設備類型,如物聯網設備、手機、平板電腦、電視、車載系統等。主要特點如下:
應用與內核隔離:分別運行在不同的權限模式,應用不能直接訪問內核空間和其他應用空間,單個應用崩潰不會導致系統崩潰,提升了穩定性;應用通過系統調用獲取內核服務,通過IPC與其他應用通信;內核可獨立編譯、連結和更新;可同時加載運行多個應用,並動態加載與卸載。
組件可配置和可裁剪:模塊被組織成組件,每個組件有自己的.mk文件,用於描述它和其它組件間的依賴關係,方便應用開發者按需選用,方便裁剪。
Rhino內核:AliOS Things的實時作業系統內核叫做Rhino,它的核心模塊包括緩衝隊列,環形緩衝區、定時器、信號量、互斥量、先入先出隊列、事件等。這一塊的實現和其它作業系統差別不大。
支持多種協議:LwIP(IPv4&IPv6),藍牙BLE,LoRaWAN,HTTP,HTTPS,CoAP,LwM2M,MQTT等。協議的支持對設備接入網絡至關重要。
調度策略:基於優先級的搶佔式調度和round-robin循環調度策略,通過tick中斷觸發檢查任務隊列中的優先級,選擇下一個運行的任務。
網絡安全:支持包括TLS,TFS, TEE在內的安全組件。
低功耗模式:支持CPU的tickless idle 模式。
OTA升級:支持差分升級,斷點續傳,HTTPS下載固件。
文件存儲:支持KV健值對存儲,RAMFS,VFS。
Log機制:Log可以輸出到文件,UDP,或者雲端。
以下是AliOS Things的系統架構圖:
AliOS Things 系統架構
其設計原則遵循了以下幾個要求:
模塊自包含(Self-Contained):減少模塊對外部模塊的依賴,實現模塊間的解耦
運行時插件化(Pluggable):根據參數定義動態檢查接口依賴和調用
軟體層次設計(Layered Design):系統整體被劃分成四個層次,自頂而下分別為應用/算法層(AIL)、應用開發層(ADL)、硬體管理層(HML)、硬體適配層(VSL),禁止下層模塊反向依賴上層模塊,確保軟體系統能按層次演進
從底部到頂部包括:
板級支持包(BSP):主要由SoC供應商開發和維護
硬體抽象層(HAL):比如WiFi和UART
內核:包括Rhino實時作業系統內核、Yloop, VFS, KV 存儲
協議棧:包括TCP/IP協議棧(LwIP),uMesh網絡協議棧
安全:安全傳輸層協議(TLS),可信服務框架(TFS)、可信運行環境(TEE)
AOS API:提供可供應用軟體和中間件使用的API
中間件:包括常見的物聯網組件和阿里巴巴增值服務中間件
示例應用:阿里自主開發的示例代碼,以及通過了完備測試的應用程式(比如Alinkapp)
目錄結構:
接下來介紹AliOS幾個重要特性的實現:
低功耗Tickless Idle模式:對於物聯網設備來說,硬體功率至關重要,因為電量是有限的。如果系統消耗電量過快,它將很快沒電。系統的主要供電是CPU,當CPU睡眠的時候,系統通常是處於低功耗狀態的,Rhino提供了CPU的tickless idle 模式來幫助系統節約電能和延長使用時間。
通常情況下,當CPU沒有執行操作時,它將執行一個處理器指令(對於ARM來說的WFI,對於IA32位處理器來說的HLT),進入低功耗狀態。此時,CPU寄存器的信息被保存,系統的tick clock interrupts會在每個tick時刻喚醒CPU。
為了比正常模式節省更多的電量,Rhino為CPU提供了tickless idle模式。當作業系統檢測到有一個固定時間(多個ticks或更長時間)的空閒後,它將進入tickless idle模式。系統做好中斷配置,並把CPU置於C1模式,那時system tick clock中斷不再被觸發,system tick的計數也將停止。CPU會保持低耗電狀態直到tickless idle時間結束。然後,當system tick timer interrupt再次被觸發時,喚醒CPU從C1模式回到C0模式,為ticks計算好補償時間並繼續計數。
任務調度:Rhino提供了兩個調度策略,基於優先級的搶佔式調度和round-robin循環調度策略。對於兩個調度策略而言,具有最高優先級的任務都是被優先處理的。這也是絕大部分RTOS系統採用的調度策略。
基於優先級的搶佔式調度器會在遇到比當前運行的任務具有更高優先級任務時搶佔CPU。這意味著,如果出現一個任務比當前任務具有更高優先級,內核將立即保存當前任務的context,並切換到高優先級的任務的context。因此,內核保證CPU總是優先處理優先級最高的任務。
round-robin調度器通過時間片來為各任務分配CPU資源。在一組具有相同優先級的任務中,每個任務都會被安排運行一個固定的時間長度,或者說時間片,之後CPU將處理下一個任務。所以,在一個任務阻塞之前,其他任務不能搶奪到處理器資源。當時間片失效時,系統將運行該優先級就緒隊列中的最後一個任務。
調試:Rhino 可以支持stack溢出、內存洩漏、內存損壞的檢測,作業系統還提供了對stack的backtrace功能。
鍵值對存儲(KV):KV組件是AliOS Things中一個以Key-Value方式進行持久化存儲的輕量級組件,主要為基於Nor Flash的小型MCU設備提供通用的Key-Value持久化存儲接口。它的優勢和特徵包括:
更少的擦寫次數來延長flash的使用壽命
電源安全,沒有中間狀態將存在
方便使用,關鍵碼值支持二進位格式數據
最低支持Flash的大小是8KB
Log 機制:各模塊通過調用ulog()函數將log發送到queue中,log task從queue中接收log,並決定是列印到文件中,udp還是傳到雲端。通過使用mutex來鎖log的生成,避免多任務的競爭,因此要避免在中斷中使用該接口。
空中固件升級(FOTA):FOTA(Fireware Over-The-Air) 可以對設備進行遠程升級。特別提下,嵌入式系統升級時往往有3種方式,一種是出廠的固件放在Flash A區,程序固定從B區啟動,每次下載的固件都存放到B區,當B區的固件損壞無法啟動的時候,系統使用A區的固件啟動。第二種是A區和B區交替使用(桌球升級),如果固件下載到B區,後續程序從B區啟動,下次升級固件存儲到A區,程序從A區啟動,這個好處是可以保證總有可用的固件,避免升級失敗變磚,且可以回滾到之前的固件版本。第三種是固定從A區啟動,下載的固件覆蓋原A區的固件,這種升級存在失敗系統變磚的風險。使用第一和第二種方式都可以,我不推薦第三種方式。AliOS Things支持第二種和第三種方式。
特徵:
AliOS Things Flash分區
雲端連接協議:支持通過Alink連接阿里雲平臺,用於智慧生活。支持標準的MQTT協議。支持CoAP(基於UDP的輕量級協議),和CoAP FOTA結合為NB-IoT設備建立一個只有UDP的系統。
AT 解析器:AT解析器提供了處理AT命令連接通信模塊的框架。AT解析器可處理串行流解析;回調OOB可以處理模塊的特殊AT命令。與SAL一起使用,應用程式甚至可以在AT模塊中使用BSD socket。
每周日早上10點15分到11點,架構設計分享課。可添加微信licheng_domi加入架構師學習群,進入騰訊會議。