Arduino控制板通常執行單一任務,沒有使用作業系統。許多嵌入式裝置需要同時執行多個應用程式(多工作業),像汽車多媒體音響主機,可在導航的同時播放MP3音樂,就需要作業系統來協調應用程式的運作,以及管理記憶體和其他資源。作業系統也可以減輕程式開發的工作,例如,針對Android(安卓)系統開發的App,可被安裝在Android系統的手機、電視、汽車音響…等裝置,無須改寫程式碼,也不用管裝置的硬體規格。
嵌入式作業系統(Embedded OS)是專門為效能和記憶體要求不高、具特定功能的嵌入式裝置所開發的作業系統;嵌入式作業系統品牌繁多,被廣泛運用在各種電機∕電子產品,像水波爐、無線網路IP分享器、遊戲機、電子告示板…光是網路IP分享器的作業系統就多達20種以上。
Arduino Nano 33 BLE和BBC Micro:bit控制板都採用Nordic半導體公司的同系列系統單晶片(SoC),也都有採用ARM公司開發的嵌入式作業系統:Mbed OS。這是Arduino Nano 33 BLE控制板:
在Arduino官網的“Why we chose to build the Arduino Nano 33 BLE core on Mbed OS”文章提到,因為沒有適用於Nordic nRF52840 Cortex-M4微控制器的官方Arduino內核(開機啟動程式和藍牙驅動程式),他們研究了各種替代方案:
- 使用Nordic的softdevice(藍牙驅動程式)基礎架構
- 從頭開始編寫內核程式
- 以Mbed OS為基礎編寫程式
Nordic的softdevice不是開放原始碼,不符Arduino的開源精神;第2個選項需要花費許多時間和精力,而且開發出來的核心程式無法在其他微控器晶片重複使用。因此,團隊選擇採用Mbed OS的方案,使用作業系統提供的驅動程式來控制硬體;Nano 33 BLE控制板的使用者不會察覺到他們編寫的程式是在mbed OS上運作,程式編輯器仍是Arduino IDE,程式碼也是原有的Arduino,由setup()和loop()函式組成。
BBC Micro:bit控制板的系統架構
底下是micro:bit控制板的系統架構簡圖。為了進一步優化程式開發環境,英國Lancaster大學開發了一個相當於「中間人」的執行環境(runtime),無論是積木式程式或者JavaScript和MicroPython,都是在此執行環境上運作;此執行環境也叫做裝置抽象層(Device Abstraction Layer,簡稱DAL)。
Mbed OS本身已經具備各類型硬體裝置的驅動程式和程式庫,例如,讀寫SD記憶卡、輸出PWM訊號、控制指定腳位輸出高、低電位…等等,這些是屬於通用的基礎指令,可在所有支援Mbed OS的控制板上執行。
以控制Micro:bit的LED矩陣為例,Mbed的C/C++程式首先要初始化LED接腳,將它們設置成「輸出」模式,再依序控制接腳的輸出電位來點亮或關閉LED。
裝置抽象層提供的驅動程式,則是替micro:bit特有的硬體,像是LED矩陣、兩個按鍵開關、加速度計和電子羅盤,提供專屬的程式庫。例如,它的“MicroBitDisplay”類別提供控制LED矩陣捲動文字及圖像、控制單一LED的亮度…等功能。
在Micro:bit的LED矩陣呈現捲動一次“HELLO WORLD!”訊息的C程式如下(取自micro:bit runtime說明文件):
#include "MicroBit.h" MicroBit uBit; // 宣告MicroBit類型物件 int main() { uBit.init(); // 初始化MicroBit物件 uBit.display.scroll("HELLO WORLD!"); // 捲動文字 // 把控制權交給底層的作業系統, // 讓它執行其他工作或者進入睡眠。 release_fiber(); }
多虧有裝置抽象層,我們在不知道LED的接腳編號,也無須設置微控器的接腳模式,還是能完成捲動文字的效果。