嵌入式系統

嵌入式系統（Embedded system），是一種嵌入機械或電氣系統內部、具有專一功能和即時計算效能的計算機系統。嵌入式系統常被用於高效控制許多常見裝置，被嵌入的系統通常是包含數位硬體和機械部件的完整裝置，例如汽車的防鎖死煞車系統。相反，通用計算機如個人電腦則設計靈活，可以智慧處理各式各樣的運算情況，以滿足廣大終端使用者不同的需要。

現代嵌入式系統通常是基於微控制器（如含整合記憶體和 / 或外設介面的中央處理單元）的，但在較複雜的系統中普通微處理器（使用外部儲存晶片和外設介面電路）也很常見。通用型處理器、專門進行某類計算的處理器、為手持應用訂製設計的處理器等，都可能應用到嵌入式系統。常見的專用處理器有數字訊號處理器。

嵌入式系統的關鍵特性是處理特定的任務，因此工程師能對其進行最佳化，以降低產品的體積和成本，提升可靠性和效能。

嵌入式系統的物理形態包括便攜裝置如計步器、電子手錶和 MP3 播放器，大型固定裝置如交通燈、工廠控制器，大型複雜系統如混合動力汽車、磁共振成像裝置、航空電子裝置等。它們的複雜度低至微控制器，高至大型底盤或外殼內安裝有多個部件、外設和網路。

嵌入式系統例項

嵌入式系統通常應用於消費類、烹飪、工業、自動化、醫療、商業及軍事領域。

電信系統

從網路級的電話交換機到手機終端都部署了大量嵌入式系統。

消費類電子

包括 PDA、MP3 播放器、行動電話、遊戲機、數位攝像機、DVD 播放器、全球衛星定位系統接收器和印表機。

家居應用

微波爐、洗衣機和洗碗機中採用了嵌入式系統，帶來靈活性、效率和功能；高階暖通空調系統採用聯網的恆溫器更精確、高效的按天或季度控制溫度；智慧家居使用嵌入式裝置進行感知、控制，透過有線和無線網路控制燈光、溫溼度、安全、音影片、監控等。

交通系統

安全要求相當高的飛機中採用了先進的航空電子裝置，如慣性導航系統、全球衛星定位接收器；

各種電機 —— 直流無刷電機、非同步電機和直流電機中使用了電氣 / 電子電機控制器；汽車、電動車、混合動力汽車越來越多地採用嵌入式系統來節能減排；

歷史

MIT 儀器研究室的查爾斯・斯塔克・德雷珀開發的阿波羅制導計算機是現代嵌入式系統的雛形之一。在專案初期，它被看成風險最高的部分，原因是為了減小尺寸和重量，它採用了當時最新研發的單片積體電路。

第一款大批次生產的嵌入式系統是 1961 年釋出的民兵 I 導彈內的 D-17 自動制導計算機。當民兵 II 導彈在 1966 年開始生產的時候，D-17 升級成一種新型計算機，其中首次大量使用了積體電路。僅這個專案就將反及閘模組的單價從 1000 美元降低至 3 美元，低到可用於商業產品。

由於二十世紀六十年代的這些早期應用，不僅嵌入式系統的價格降低了，同時處理能力和功能也獲得了巨大的提高。以第一款微控制器英特爾 4004 為例，它是為計算器和其他小型系統設計的，但仍然需要外部儲存器和外圍晶片。1978 年，國家工程製造商協會發布了可程式設計微控制器的 “標準”，涵蓋了幾乎所有以計算機為基礎的控制器，如單板機、數控裝置，以及基於事件的控制器。

隨著微控制器和微處理器的價格下降，消費品也可以更換掉基於按鈕的模擬器件，如分壓計和可變電容，採用微處理器讀取開關或按鈕訊號。

到了二十世紀八十年代早期，儲存器、輸入輸出部件整合到處理器內，產生了微控制器。在採用通用計算機佔用的成本太高昂的應用中，微控制器取而代之。

較低成本的微控制器程式設計後可取代很多獨立部件，這種嵌入式系統通常比傳統解決方案更復雜，但這些複雜性多數體現在微控制器自身。嵌入式系統需要的外圍元件很少，多數設計工作集中在軟體，而軟體原型的建立及測試與設計與建立新的不使用嵌入式處理器的電路相比速度更快。

特性

區別於可以執行多重任務的通用型計算機，嵌入式系統是為某些特定任務而設計的。有些系統則必須滿足即時性要求，以確保安全性和可用性；另一些系統則對效能要求很低甚至不要求效能，以簡化硬體、降低成本。

嵌入式系統並不總是獨立的裝置。許多嵌入式系統由嵌入較大裝置的小計算部件組成，提供較通用的功能。例如吉他機器人採用嵌入式系統來調絃，但總的來說它的設計目的絕不是調絃而是演奏音樂；車載電腦作為汽車的一個子系統存在，提供導航、控制、車況反饋等功能。

為嵌入式系統編寫的程式稱為韌體，儲存在只讀儲存器或快閃記憶體晶片內，執行在有限的硬體資源上：小容量記憶體，小鍵盤或螢幕甚至沒有。

3.1 使用者介面

嵌入式系統使用者介面包括了從沒有使用者介面而只專注於單一任務、到類似於現代桌面作業系統的複雜圖形使用者介面的各類介面。

簡單的嵌入式裝置使用按鈕、LED、圖形或數字 LCD 和簡單的菜單系統。

較高階的嵌入式系統使用圖形顯示屏，配合觸控感應或屏邊按鈕使用，可使佔用空間最小並提供靈活性：按鈕的含義隨螢幕顯示的內容而改變，而且指向想要的選項進行操作就能實現選擇。手持系統通常採用顯示屏加操縱桿按鈕作為觸控裝置。

有些系統透過序列埠（如 RS-232、USB、I2C 等）或網路連線遠端提供使用者介面。這種方式的優勢在於：擴充套件了系統的效能、削減了顯示屏的成本、簡化了 BSP，可以在 PC 上構建豐富的使用者介面。例如執行在嵌入式裝置平臺（如 IP 攝像機或路由器）上的嵌入式網路伺服器，它無需安裝定製軟體，而是在連到裝置的 PC 端的網路瀏覽器中顯示使用者介面。

3.2 嵌入式系統的處理器

嵌入式處理器大概可分為兩類。一類是普通微處理器：使用獨立的積體電路儲存器和外設。另一類是微控制器：具有片上外設，降低了功耗、尺寸和成本。嵌入式系統的軟體是為某種應用定製的，而不是像個人計算機那樣的由終端使用者安裝的商品，因此可以使用各種不同的基本 CPU 架構：既有範紐曼型架構也有不同程度的哈佛結構；既有 RISC 也有非精簡指令集處理器；字長從 4 位到 64 位甚至更高，當然最典型的仍然是 8/16 位。多數架構由幾家不同的公司生產，使用了大量不同的變數和型別。

嵌入式系統也會使用通用型微處理器，但比微控制器需要更多外圍電路。

3.2.1 嵌入式主機板

PC/104 和 PC/104 + 是小型、小批次嵌入式強固系統的標準之一，大多基於 x86 架構；通常比標準 PC 要小，而比多數簡單的 8/16 位嵌入式系統要大；使用 MSDOS、Linux、NetBSD，或即時嵌入式作業系統如 MicroC/OS-II、QNX、VxWorks。有時這些主機板也會使用非 x86 處理器。

在某些應用中，小巧、高效並非主要關注點，因而可以使用與 x86 型 PC 主機板相容的部件。VIA EPIA 系列板卡則可以彌補這個空缺，它相容 PC 但是高度整合、體積較小，或提供其他對嵌入式工程師很有吸引力的特性。這種方法的好處是低成本商品也可以使用通用的軟體開發工具。用這種方法構建的系統仍然是嵌入式系統，因為它嵌入在較大的裝置中、用於滿足單一用途。例如 ATM 和電子遊戲機，它們都包含了針對各自應用的程式碼。

多數嵌入式主機板都不是圍繞 PC 設計的，也不使用 ISA 或 PCI 匯流排。如果採用 SoC 處理器，用標準匯流排連線分立元件就不是上策，此外軟硬體開發環境都可能會很不一樣。

一種常用的設計模式是採用小型系統模組 —— 也許只有商務卡片大小，容納高密度的 BGA 晶片如 ARM 處理器和外設、用於儲存的外部快閃記憶體、作為記憶體的 DRAM。模組廠商通常會提供引導軟體和作業系統選項，一般包括 Linux 和一些即時作業系統。這些模組由熟悉專業測試方法的組織大批次生產，配合較小批次的、帶特殊應用外設的定製主機板使用。

3.2.2 ASIC 和 FPGA 解決方案

SoC 是一種常見的為超大批次嵌入式系統設計的可配置陣列。它在單個晶片內包含了多處理器、乘法器、快取和介面，形成一個完整的系統；透過專用積體電路或現場可程式設計門陣列來實現。

3.3 外圍裝置

嵌入式系統透過外設與外部通訊：

序列埠：RS-232、RS-422、RS-485 等
同步序列埠：I2C、SPI、ESSI 等
USB
多媒體卡：SD 卡、CF 卡等
網路：乙太網、LonWorks 等
現場匯流排：CAN 匯流排、LIN 匯流排、PROFIBUS 等
定時器：PLL、捕獲比較模組和時間處理單元
分立 I/O：GPIO
模擬 - 數位 / 數位 - 模擬轉換 (ADC/DAC)
除錯介面：JTAG、ISP、ICSP、BDM 埠、BITP、DP9 埠等

3.4 工具

同典型的計算機程式設計師一樣，嵌入式系統設計人員也使用編譯器、連結器和偵錯程式開發嵌入式系統軟體。然而，他們也使用一些大多數程式設計師不熟悉的工具。

軟體工具的來源有如下幾種：

專注於嵌入式系統市場的軟體公司
從 GNU 軟體開發工具移植（參見交叉平臺編譯）
有些情況下，如果嵌入式處理器與普通個人計算機處理器很近似的話也可以使用個人計算機開發工具

嵌入式系統設計人員也使用一些不為普通計算機程式設計師所熟悉的軟體工具：

一個常用工具是 “電路內部模擬器”（ICE，in-circuit emulator）或者是最新設計中的嵌入式偵錯程式。這個除錯工具是開發嵌入式程式的基本技巧。它代替微處理器或者嵌入微處理器內部，提供了在系統中快速呼叫和除錯試驗程式碼的便捷工具。一個焊點通常就是一個插入系統的特殊電路，通常使用一臺連結到這些焊點的個人計算機作為除錯介面。
連結器通常是各種各樣。對於大多數商業程式設計來說，聯結器幾乎是事後才考慮的部分，預設設定也從來不變。與此相反，嵌入式連結器有完整、複雜的命令列語言是很普通的。經常有不同型別的記憶體，分別儲存特殊的程式碼和資料。單獨的資料結構能夠放在特殊的地址，這樣軟體能夠很方便地訪問對映到記憶體的控制暫存器。嵌入式連結器經常有用於減小程式碼大小和執行時間的外部最佳化工具。例如，他們可能移動子程式的位置以使用較小的呼叫和跳轉指令。它們經常帶有管理和技術的特性，這些技術是在嵌入式軟體經常使用的擴充套件廉價 CPU 的方法。
另外一個常用的工具是一個在程式中新增程式碼和或者 CRC 的工具程式（經常是自己寫的），使用這個工具嵌入式系統能夠在執行程式之前先進行程式資料檢查。
為數字訊號處理開發軟體的嵌入式程式設計師經常使用 MathCad 或者 Mathematica 這樣的數學工具進行數學模擬。
一些較少使用的工具有將資料檔案轉換成程式碼的工具，使用這種工具就可以在程式中包含任意型別的資料。
少數一些專案為了特殊的可靠性或者數字訊號處理要求使用同步式程式語言。

一些程式語言為嵌入式系統程式設計提供了一些特殊支援。

對於 C 語言，ISO/IEC TR 18037:2005 定義了
指定的地址空間
指定的儲存類
基本輸入輸出的硬體定址

3.5 除錯

除錯通常使用內部電路模擬器或者其他一些能夠在微控制器微碼（microcode）內部產生中斷的偵錯程式。微碼中斷讓偵錯程式能夠在只有 CPU 工作的硬體中進行操作，基於 CPU 的偵錯程式能夠從 CPU 的角度來測試和除錯計算機的電路。PDP-11 開創了這種特性的先河。

開發人員能夠仍然使用斷點、單步執行以及高階語言進行除錯，在許多的除錯工具上都有這種能力。另外開發人員在除錯即時事件順序的時候需要記錄、使用簡單的記錄工具。

首先遇到這種問題的個人電腦和大型機程式設計師經常在設計優先順序和可行方法的時候感到困惑。指導、程式碼審查和非個人風格的程式設計是值得推薦的。

隨著嵌入式系統變得越來越複雜，更高層次的工具和作業系統逐漸移植到可行的裝置上。例如，蜂窩電話、個人數字助理和其他的消費用計算機需要一些從個人或者這些電子裝置製造商之外的公司購買或者提供的一些重要軟體。在這些系統中，需要如 Linux、OSGi 或者 Java 這樣的開放程式設計環境，這樣第三方軟體提供上才能夠在大規模的市場上銷售軟體。

大多數這樣的開發環境都有一個執行在個人電腦上的參考設計，這種軟體的絕大部分都可以在傳統的個人電腦上開發。然而，從開放環境移植到專用的電子裝置和電子裝置的驅動程式開發通常仍然是傳統的嵌入式系統軟體工程師的工作。在有些情況下，the engineer works for the integrated circuit manufacturer, but there is still such a person somewhere.

3.6 作業系統

嵌入式系統經常沒有作業系統、專用的嵌入式作業系統（經常是即時作業系統）或者指定程式設計師移植到這些新系統。

3.7 啟動

嵌入式系統帶有啟動程式碼，通常它禁止中斷、設定電子裝置引數、測試計算機（RAM、CPU 和軟體），然後開始應用程式執行。許多嵌入式系統從短暫的掉電狀態恢復，經常重起而不進行最近的自檢。在十分之一秒內重啟是常見的現象。

許多設計人員發現 LED 在指示錯誤狀態上非常有用，它們可以幫助進行故障處理。一個常用的機制是在復位的時候點亮電子裝置所有的 LED 以表明供電和 LED 正常工作；然後在進行加電自檢時由軟體改變 LED 的狀態；在此之後，軟體用這些 LED 指示操作過程中的正常或者故障狀態。這可以讓技術人員、工程師和使用者瞭解系統的狀態。一個有趣的例外是電度表（electric power meters）和其他一些大街上的東西，閃爍的指示燈是為了吸引注意力或者表示損壞狀態。

3.7.1 內部自檢

許多嵌入式系統都有一定程度或者一定數量的內部加電自檢，自檢有幾種型別：

計算機檢查：檢查 CPU、RAM 和程式儲存器。通常一加電就開始這些檢查，在一些安全性非常重要的系統中，通常週期性地在安全時間間隔內進行自檢，或者經過一段時間就進行自檢。
外圍裝置檢查：模擬輸入和讀入資料或者測量輸出資料。有大量的通訊、模擬和控制系統都有這些非常廉價的檢查。
電源檢查：通常測試每個供電電路，也可能檢查電池或者主電源輸入。通常供電部分的負載都很重，並且少有餘量，所以這項檢查很有意義。
通訊檢查：驗證從相連單元接收到的簡單訊息，例如在網際網路上使用 ICMP 訊息 “ping”。
電纜檢查：將線連結到待檢查的電纜上指示針進行檢查。如電話這樣的同步通訊系統經常使用 “同步” 測試。電纜檢查成本很低，當單元部分有插頭的時候這項檢查尤其重要。
裝備檢查：一個系統在安裝時經常需要進行調整，這項檢查就向安裝人員做出狀態指示。
消耗檢查：檢查系統所消耗的東西、在預量太低時發出警告。最常見的例子是汽車的油量表，最複雜的例子可能是維持化學反應物詳細狀態的自動醫學分析系統。
執行檢查：檢查使用者關心的系統執行狀態。顯然，在系統執行時必須進行這項檢查，這方面的檢查包括飛機上的導航儀器、汽車的速度表和磁碟的指示燈等。
安全檢查：在 ' 安全時限 ' 內進行檢查確保系統仍然可靠。安全時限通常小於能夠產生損害的最小時間。

3.8 可靠性體系

根據人們需求的不同，可靠性也有不同的定義，有意思的是，可靠性的型別卻相對較少，相似可靠性型別的系統，使用相似型別的內在檢查和恢復方法：

系統非常不安全或者無法修理。這包括太空系統、水下電纜、導航燈塔、鑽孔系統，非常奇怪的是還包括汽車和大規模生產產品。總的來說，嵌入式系統檢測各個子系統、線上切換到冗餘部分或者工作在 “limp 模式” 提供部分的功能。大規模生產的消費產品如汽車、個人電腦或者印表機也屬於這個類別，這是因為與購買的費用相比維修費用高昂、維修人員又路途遙遠。
系統不能安全地停止執行。這包括飛機導航、反應控制系統、重要的化學工廠安全控制、鐵路訊號、單發動機飛機的發動機，如上所述，但是 “limp 模式” 較難容忍，通常需要操作員選擇備份系統。
系統停機時將會造成大量的金錢損失。這些包括電話交換機、工廠控制、橋樑和電梯控制、資金轉移、市場開發、自動銷售和服務等，這些系統通常有一些運轉 / 不運轉測試，它們通常帶有線上冗餘或者使用替換系統和人工過程的 limp 模式。
系統不安全的時候不能操作。同上面的情況類似，系統的執行將會造成大量的金錢損失。醫療裝置、帶有發動機這樣的熱備份的飛行器、化學工廠控制、自動股票交易、遊戲系統等。測試可能是五花八門，但是出錯時能夠做的就是停止整個系統。

嵌入式軟體架構的型別

常用的嵌入式軟體架構有幾種不同的基本型別。

4.1 控制迴圈

在這種設計中，軟體有一個簡單的迴圈，這個迴圈呼叫各個子程式，每個子程式管理硬體或者軟體的某一部分。中斷通常用來設定標記或者更新軟體其他部分能夠讀取的暫存器。

系統使用簡單的 API 來完成允許和禁止中斷設定。如果處理得當的話，它能夠在巢狀子程式中處理巢狀呼叫，在最外面的中斷允許巢狀中恢復前面的中斷狀態。這種方法是實作 Exokernel 的一個最簡單的方法。

通常在迴圈中有一些子程式使用週期性的即時中斷控制一組軟體定時器，當一個定時器時間到的時候就會執行相應的子程式或者設定相應的標誌。

任何可能發生的硬體事件都應該有軟體定時器的支援，硬體事件大概每萬億次出現一次錯誤，對於現代的硬體來說大概是一年發生一次，對於以百萬計大規模生產的裝置來說，遺漏一個軟體軟體定時器在商業上可能是災難性的。

有時測試軟體執行一組基於軟體的安全定時器，它們週期性地複位硬體中的看門狗計時器。如果軟體錯過一個事件，安全定時器軟體將會捕捉到它。如果安全定時器出錯，看門狗硬體將會複位系統。

可以使用指向每個狀態機函式的指標實作狀態機，函式可以用 C++、C 或者組合語言等實作。變化的狀態將不同的函式放到指標中，每次迴圈執行時都會執行函式指標。

許多設計人員建議每個迴圈讀一次輸入輸出裝置、並且儲存得到的結果，這樣可以保證邏輯過程的在一致的引數上執行。

許多設計人員喜歡將狀態機設計成每個狀態僅僅檢查一到兩項內容，通常是檢查硬體事件和軟體定時器。

設計人員建議多級狀態機應該讓低層狀態機早於高層狀態機執行，這樣高層就能夠根據正確的資訊執行。

如內部燃燒控制這樣的複雜功能通常根據多維表格進行處理，程式碼通常進行查表處理而不進行複雜的計算，為了減小表格的大小以及成本軟體可以在條目之間進行差值運算。

在最小的微控制器中，尤其是隻有 128 位元組堆疊的 8051 中，控制環允許好的連結器使用靜態分配的資料覆蓋本地變數。在這種機制中，離子程式呼叫樹末端越近的變數得到的記憶體地址越高。當開始一個新的分支的時候，它的變數可以在以前分支遺棄的空間中進行重新分配。

簡單控制迴圈的一個主要缺點是它無法保證響應特定硬體事件的時間。

細心的設計可以很容易地保證中斷不會被長時間禁止，這樣中斷程式碼就可以在非常精確的時間執行。

控制環的另外一個主要缺陷是增加新的特性的時候會變得複雜。需要花費很長時間的演演算法必須小心地進行分解以使得每次只有一小部分在主迴圈中執行。

這種系統的優勢是它的簡單性，並且在很小的軟體上，迴圈執行地很快幾乎沒有人關心它是不可預測的。

它的另外一個優勢是這種系統保證執行軟體的質量，無法將不好的執行結果歸咎為其他的作業系統。

4.2 搶先式任務

使用上面的非搶先式任務系統，從一個搶先式定時器或者其他中斷執行。

這樣系統就突然變得很不一樣了。任何一個任務的程式碼都有可能損害其他任務的資料 & emdash; 所以它們必須進行切缺的切分。對於共享資料的訪問必須使用一些同步策略進行控制，如訊息佇列、訊號燈或者非阻塞同步機制。

經常在這一步開發組織就會購買一套即時作業系統。如果一個組織缺少能夠編寫作業系統的人才或者作業系統將要在幾個產品之上，這可能是一個明智的選擇。這通常要將開發計劃增加六到八週，and forever after programmers can blame delays on it.

4.3 微核心與外核心

這種方法試圖將系統組織得比宏核心更易於配置，而同時提供類似的特點。

微核心是即時作業系統的一個邏輯發展，通常的組織方式是作業系統核心分配記憶體並且將 CPU 在不同的執行緒之間進行切換。使用者模式的程序實現如檔案系統、使用者介面等主要的功能。

微核心在二十世紀五十年代開始首次嘗試，但是由於計算機在任務間切換以及在任務間交換資料速度非常緩慢，所以人們放棄了微核心而鍾情於 MULTICS 和 UNIX 風格的大核心。總體上來說，微核心在任務切換以及任務間通訊速度快的時候是比較成功的，在速度慢的時候是失敗的。

外核心透過使用普通的子程式呼叫獲得的通訊效率很高，硬體以及系統中的軟體都是程式設計師能用也能擴充套件的。資源核心（可能是庫的一部分）分配 CPU 時間、記憶體以及其他資源。如多工、網路以及檔案系統這樣的大核心特性透過程式碼庫來提供。庫可以進行動態的連線、擴充套件或者共享。不同的應用甚至可以使用的不同的庫，但是所有的資源都來自於資源核心。

4.4 虛擬機器

一些航空電子系統使用幾個商用計算機。這樣更進一步，每個計算機都在模擬它們自身的幾個副本，重要的程式同時在幾個計算機上執行並且進行投票控制（vote）。

模擬環境的優點就是即使一個計算機出現故障，軟體的不同例程能夠遷移到正常工作的軟體分割槽，表決的票數並不受影響。

通常虛擬軟體執行在計算機的使用者模式下，它捕捉、模擬硬體訪問和不在使用者模式下執行的指令。

4.5 檢查點計算

另外一種常用的機制是兩個計算機計算 for a bit，然後將它們的計算結果報到那個點上。如果一個計算機的計算是 nut，它就會被關閉。

4.6 辦公用（宏核心）作業系統

這種系統通常在沒有系統經費的嵌入式專案中流行，但是從這篇文章的多個作者來看，這通常是不正確的，它們的邏輯是：

作業系統是經過特殊封裝的重用程式碼庫。如果這些程式碼有用，設計人員就會節省時間和金錢，否則它們就是無用的。
商務系統的作業系統沒有嵌入式硬體的介面。例如，如果要用 Linux 寫一個馬達控制器或者電話交換機，絕大部分的實際控制操作都是 IOCTL 呼叫，同時，正常的讀、寫和查詢介面都是無用的。所以作業系統對於實際的開發妨礙很大。
大多數的嵌入式系統不處理辦公事務，所以辦公作業系統的大部分程式碼都被浪費了。例如，絕大多數的嵌入式系統從來都不使用檔案系統或者螢幕，所以檔案系統和圖形使用者介面部分就是浪費的，這些不用的程式碼只會影響系統的可靠性。
辦公用作業系統保護硬體不讓使用者程式操作，這就嚴重地妨礙了嵌入式開發工作。
作業系統必須移植到嵌入式系統上，也就是說，硬體驅動程式無論如何都必須重寫，這也是作業系統最難的部分，所以使用這樣的作業系統幾乎沒有功效。
作業系統真正有用、可移植的特性是小段程式碼。例如，一個基本的 TCP/IP 介面大約有 3000 行程式碼，另外的一個例子是大約同樣大小的簡單檔案系統。如果設計需要這些程式碼，能夠使用少於嵌入式系統開發 10% 的經費就能完成，不需要支付版權費用，只需要簡單地重寫就可以了。如果系統這些程式碼有足夠的通用性，嵌入式系統雜誌封面的後面通常有公司銷售沒有版權費的 C 語言實現程式碼。

然而許多工程師並不認同這一點，嵌入式 Linux 越來越受到人們的歡迎，尤其是在無線路由器和全球定位系統這樣的功能強大的嵌入式系統中。其中有下面一些原因：

有現成的移植到普通嵌入式晶片的實現程式碼。
它們允許重用公開獲得的裝置驅動程式、網頁伺服器、防火牆或者其他程式碼。
開發系統能夠從許多特性組合開始，在釋出的時候可以剔除不需要的功能，從而節約所消耗的記憶體。
許多工程師認為在使用者模式執行應用程式更為可靠、更容易除錯，所以開發過程更容易、程式碼更易於移植。
許多嵌入式系統沒有控制系統那樣對於即時性的嚴格要求，對於許多應用來說如嵌入式 Linux 這樣的系統的響應速度就已經足夠了。
要求更快的響應速度，而不是可靠性的特性，通常放到了硬體上。
許多即時作業系統都針對每件產品收取費用，當產品是消費品時，這項費用是巨大的。

4.7 Exotic custom 作業系統

一些系統需要安全、及時、可靠或者高效的特性，上面的架構卻無法達到，構建這樣的系統有一些廣為人知的技巧：

僱傭一個真正的系統程式設計師。他們的花費很小，但是能夠節約數年的除錯以及相關的收入損失。
RMA（rate monotonic analysis），可以用來評估一組任務能否在特定的硬體系統下執行，在最簡單的形式下，設計人員保證最快完成的任務有最高的優先順序，平均來說 CPU 至少有 30% 的空閒時間。
和諧的任務能夠高效地最佳化 CPU。基本上來說，設計人員保證每件工作都是從 heartbeat timer 開始工作的。在即時作業系統上很難這樣做，因為它們在等候輸入輸出裝置的時候通常就會切換任務。
剛好有兩個優先順序（通常是執行和禁止中斷）的系統不能出現高優先順序任務等候低優先順序任務釋放訊號燈或者其他資源的優先順序倒置問題，
有監視器（monitor）的系統不能出現死鎖。監視器鎖住一段程式碼禁止中斷和其他搶先任務。如果這個監視器只用於一小段快速執行的程式碼，系統可能工作正常。如果能夠證明監視器 API 在所有情況下都能夠完整執行，例如僅僅禁止中斷，那麼就不會產生系統掛起的情況。

這就意味著使用兩個優先順序和監視器的系統是安全、可靠的，因為它們沒有死鎖和優先順序倒置的問題。如果監視器能夠執行到結束，那麼就永遠不會掛起。如果使用和諧的任務，可能還會相當高效。然而，RMA 無法描述這些系統，優先順序最好也不要到處都有，其中包括作業系統和硬體。

常見的嵌入式作業系統

業界常見的開源嵌入式軟硬體系統