許多 embedded system ,如 MP3 player, mobile phone, PDA,都內含 embedded OS;也有很多小型的 embedded system ,如 USB controller, Nand Flash controller,是不必動用到 OS 的。 embedded OS 提供的 services,最基本的是 multitasking ,其他如 memory management, protocol stack, file system... 也很常見。
對一些小型的應用,把 OS 納入,不但多耗用硬體資源,還可能使系統變得複雜許多。
一個好的思考點是,「在甚麼情況下,把 OS 安置到 embedded system 內才變得必要?」。
看了《Embedded System Design》,得到了一些啟發,面對這個議題,我內心也有更明確的答案。
簡單說,當系統會動用到 multitasking(或 multithreading)時,就是該找個 OS 來用的時候。
但 linux kernel 著名的 hacker, Alan Cox 卻說了這樣的話:
Computers are state machines. Threads are for people who can't program state machines.
看來剛剛的確把話講得太過「簡單」了 :p
~~
《Embedded System Design》提到許多用來描述 embedded system 的 computation model :
- sequential program computation model: 由一組用來計算的程式指令及決定指令順序的敘述構成。C 或 assembly 都是設計來作這類描述的。
- communication process model: 支援多個 process 並行執行。
- finite-state machine, FSM: 以一組可能的狀態,描述系統的行為,無論何時,系統只能處於一個狀態;狀態的轉移,取決於現在狀態、輸入值;動作或輸出發生在狀態中或狀態轉移時。現今電腦硬體結構,就是 FSM 加上 ALU, memory 及 I/O 。
- dataflow model: 將系統的行為描述成一組節點與邊,節點代表轉換,邊則代表資料由一節點流到另一節點。每一節點耗用由其輸入邊所得到的資料、執行轉換、並在其輸出邊上產生資料,所有節點可並行執行。
- object-oriented model: 將軟體切割成一個個物件,每個物件有自己的責任、行為,物件間可以建立關聯、傳訊息、相互委託,或組合成其他物件。
描述系統,可混合使用幾種 model 。實務上可根據系統特性,以最方便的方式描述、設計系統,必要時再譯成開發環境支援的方式描述。
為了方便描述系統, FSM 也有許多擴充:
- finite-state machine with Data, FSMD: 為 FSM 增加了可指定型別的資料變數,將變數讀取當成特殊的輸入,變數寫入看成特殊的輸出。
- hierarchical/concurrent finite-state machine, HCFSM: 狀態可以有子狀態,形成階層;任何時刻,多個狀態可以並存。
- program state machine, PSM: 容許用循序程式碼來定義一狀態的動作。
值得注意的是,系統也有可能是控制系統。控制系統藉由設定一實體系統的輸入,設法使其輸出追蹤所要的參考輸入,一個有名的例子是汽車定速控制器。如果辨別出所遭遇是控制系統,那要用到的技巧是自動控制領域的 open loop 或 close loop control, PID controller 這些東西。
~~
那到底「怎麼判定是否要把 OS 安置到 embedded system 內?」
一個有用的判斷標準是,當描述系統最方便的方式是 concurrent process model ,可以考慮找個有支援 concurrent processes, pre-emptive multitasking 的 RTOS 來用。
當然,在下這個決定前,請再次複習 Alex Cox 那句名言:「Computers are state machines. Threads are for people who can't program state machines.」
對 sequential program computation model 而言, 用 C 就可以了; object-oriented model 可以用 C++;finite-state machine 可以很機械地翻譯成 sequential program computation model;data flow model 在許多場合都可以簡單地用 sequential program computation language 來描述。
另一方面,《Embedded C》及《Patterns for Time-Triggered Embedded Systems》都提到, Embedded System 可以是 even-triggered 或 time-triggered 的。作者 Michael J. Pont 強烈推薦使用 time-triggered 的方式,尤其是在重視安全的應用。因為相較於 even-triggered 的作法,time-triggered 具有簡單、可預期的優點。
Michael J. Pont還提到, co-operatively scheduler 除了比普遍使用的 pre-emptive scheduler 更簡單、可預測、安全、可靠外,在記憶體及 CPU 運算方面也更節省。可以列入 concurrent system 的替代方案。
2 comments:
可以看看 TCL 作者寫的文章, Why Threads Are A Bad Idea.
sorry, 剛剛給的link有問題, 太久沒寫HTML, 重 po 一次,
Why Threads Are A Bad Idea.
Post a Comment