嵌入式與裸機

即時作業系統(real-time operating system, RTOS)

/ AR-toss /

假設你的微控制器要同時兼顧好幾項工作:每毫秒讀一次感測器、閃一盞燈、留意一個按鈕、透過無線電送資料。把這一切塞進一個大迴圈裡很快就會變成一團亂。即時作業系統(RTOS)是一小段軟體,讓你把每項工作寫成各自獨立的任務,由 RTOS 在它們之間切換,營造出它們同時執行的錯覺——而關鍵在於,這麼做時的時序是你「能推理」的。

RTOS 比 Linux 這類桌面作業系統小且簡單得多。它通常沒有虛擬記憶體、沒有使用者、沒有檔案系統(或只有一個迷你的選用版),整個塞進幾 KB。它的核心是一個執行任務的排程器,加上讓任務協調的基本元件:傳訊息用的佇列、共享資源用的號誌與互斥鎖,以及計時器。決定性的特徵在「即時」這部分:RTOS 排程器通常是搶占式且以優先順序為本,意思是最高優先且就緒的任務「總是」執行,立刻搶占較低優先的。這帶來可預測、有上界的回應時間,而非通用作業系統那種「盡力而為、平均很快」的行為。熱門例子有 FreeRTOS、Zephyr 與 ThreadX。底層你仍跑在裸機上——RTOS「就是」你的程式,連結進來並由你的啟動程式碼啟動——沒有另外安裝的作業系統。

它之所以重要,是因為許多嵌入式系統必須在保證的時間內(一個截止期限)做出反應,而 RTOS 給你結構與可預測性去達成那些保證,同時把程式碼整理成任務。誠實的釐清:「即時」指「可預測」且有上界,「不」是「快」——一個慢卻完全準時的系統是即時的,而一個飛快卻偶爾卡住的系統不是。RTOS 不會神奇地讓你的程式碼達成期限;「你」仍須正確指派優先順序、讓 ISR 簡短、避免阻塞錯誤的任務並分析時序。而 RTOS 增加額外負擔與記憶體成本,所以最簡單的系統還是用裸機加一個樸素迴圈更好。

// FreeRTOS:兩個任務,較高優先的會搶占另一個。 void sensorTask(void *p) { for (;;) { readSensor(); vTaskDelay(1); } } void blinkTask (void *p) { for (;;) { toggleLED(); vTaskDelay(500); } } xTaskCreate(sensorTask, "sensor", 128, NULL, 3, NULL); // 優先順序 3 xTaskCreate(blinkTask, "blink", 128, NULL, 1, NULL); // 優先順序 1 vTaskStartScheduler(); // RTOS 現在依優先順序執行任務

每項工作是一個帶優先順序的任務;RTOS 排程器總是執行最高優先的就緒任務,搶占較低的。

即時指可預測且有上界,「不」是快。RTOS 給你達成期限的工具,卻不能替你達成——錯誤的優先順序、過長的 ISR 或無上界的阻塞,仍會錯過期限。

又称
RTOSreal-time kernel即時核心即時作業系統