區別於可以執行多重任務的通用型電腦,嵌入式系統是為某些特定任務而設計的。有些系統則必須滿足即時性要求,以確保安全性和可用性;另一些系統則對效能要求很低甚至不要求效能,以簡化硬體、降低成本。
嵌入式系統並不總是獨立的裝置。許多嵌入式系統由嵌入較大裝置的小計算部件組成,提供較通用的功能。例如吉他機器人採用嵌入式系統來調弦,但總的來說它的設計目的絕不是調弦而是演奏音樂;車載電腦作為汽車的一個子系統存在,提供導航、控制、車況回饋等功能。
為嵌入式系統編寫的程式稱為韌體,儲存在唯讀記憶體或快閃記憶體晶片內,執行在有限的硬體資源上:小容量主記憶體,小鍵盤或螢幕甚至沒有。
使用者介面
編輯
嵌入式系統使用者介面包括了從沒有使用者介面而只專注於單一任務、到類似於現代桌面作業系統的複雜圖形化使用者介面的各類介面。
簡單的嵌入式裝置使用按鈕、LED、圖形或數字LCD和簡單的選單系統。
較高階的嵌入式系統使用圖形顯示器,配合輕觸感應或屏邊按鈕使用,可使占用空間最小並提供靈活性:按鈕的含義隨螢幕顯示的內容而改變,而且指向想要的選項進行操作就能實現選擇。手持系統通常採用顯示器加操縱杆按鈕作為觸控裝置。
有些系統通過序列埠(如RS-232、USB、I2C等)或網路連接遠端提供使用者介面。這種方式的優勢在於:擴充了系統的效能、削減了顯示器的成本、簡化了BSP,可以在PC上構建豐富的使用者介面。例如執行在嵌入式裝置平台(如IP攝錄影機或路由器)上的嵌入式網路伺服器,它無需安裝客製化軟體,而是在連到裝置的PC端的網路瀏覽器中顯示使用者介面。
嵌入式系統的處理器
編輯
嵌入式處理器大概可分為兩類。一類是普通微處理器:使用獨立的積體電路記憶體和外部裝置。另一類是單晶片:具有片上外部裝置,降低了功耗、尺寸和成本。嵌入式系統的軟體是為某種應用客製化的,而不是像個人電腦那樣的由終端使用者安裝的商品,因此可以使用各種不同的基本CPU架構:既有范紐曼型架構也有不同程度的哈佛結構;既有RISC也有非精簡指令集處理器;字長從4位元到64位元甚至更高,當然最典型的仍然是8/16位元。多數架構由幾家不同的公司生產,使用了大量不同的變數和類型。
嵌入式系統也會使用通用型微處理器,但比單晶片需要更多外圍電路。
嵌入式主機板
編輯
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和一些即時作業系統。這些模組由熟悉專業測試方法的組織大批次生產,配合較小批次的、帶特殊應用外部裝置的客製化主機板使用。
ASIC和FPGA解決方案
編輯
SoC是一種常見的為超大批次嵌入式系統設計的可組態陣列。它在單個晶片內包含了多處理器、乘法器、快取和介面,形成一個完整的系統;通過專用積體電路或現場可程式化門陣列來實現。
外圍裝置
編輯
嵌入式系統通過外部裝置與外部通訊:
序列埠: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埠等
工具
編輯
同典型的電腦程式員一樣,嵌入式系統設計人員也使用編譯器、連結器和除錯器開發嵌入式系統軟體。然而,他們也使用一些大多數程式設計師不熟悉的工具。
軟體工具的來源有如下幾種:
專注於嵌入式系統市場的軟體公司
從GNU軟體開發工具移植(參見交叉平台編譯)
有些情況下,如果嵌入式處理器與普通個人電腦處理器很近似的話也可以使用個人電腦開發工具
嵌入式系統設計人員也使用一些不為普通電腦程式員所熟悉的軟體工具:
一個常用工具是「電路內部仿真器」(ICE,in-circuit emulator)或者是最新設計中的嵌入式除錯器。這個除錯工具是開發嵌入式程式的基本技巧。它代替微處理器或者嵌入微處理器內部,提供了在系統中快速呼叫和除錯試驗代碼的便捷工具。一個焊點通常就是一個插入系統的特殊電路,通常使用一台連結到這些焊點的個人電腦作為除錯介面。
連結器通常是各種各樣。對於大多數商業編程來說,連接器幾乎是事後才考慮的部分,預設設定也從來不變。與此相反,嵌入式連結器有完整、複雜的命令列語言是很普通的。經常有不同類型的主記憶體,分別儲存特殊的代碼和資料。單獨的資料結構能夠放在特殊的位址,這樣軟體能夠很方便地訪問對映到主記憶體的控制暫存器。嵌入式連結器經常有用於減小代碼大小和執行時間的外部最佳化工具。例如,他們可能移動子程式的位置以使用較小的呼叫和跳轉指令。它們經常帶有管理資料疊加(英語:data overlays)和band switch(英語:band switch)技術的特性,這些技術是在嵌入式軟體經常使用的擴充廉價CPU的方法。
另外一個常用的工具是一個在程式中添加代碼和或者CRC的工具程式(經常是自己寫的),使用這個工具嵌入式系統能夠在執行程式之前先進行程式資料檢查。
為數位訊號處理開發軟體的嵌入式程式設計師經常使用MathCad或者Mathematica這樣的數學工具進行數學仿真。
一些較少使用的工具有將資料檔案轉換成代碼的工具,使用這種工具就可以在程式中包含任意類型的資料。
少數一些專案為了特殊的可靠性或者數位訊號處理要求使用同步式編程語言。
一些程式語言為嵌入式系統編程提供了一些特殊支援。
對於C語言,ISO/IEC TR 18037:2005定義了
指定的位址空間
指定的儲存類
基本輸入輸出的硬體定址
除錯
編輯
除錯通常使用內部電路仿真器或者其他一些能夠在微控制器微碼(microcode)內部產生中斷的除錯器。微碼中斷讓除錯器能夠在只有CPU工作的硬體中進行操作,基於CPU的除錯器能夠從CPU的角度來測試和除錯電腦的電路。PDP-11開創了這種特性的先河。
開發人員能夠仍然使用斷點、單步執行以及高階語言進行除錯,在許多的除錯工具上都有這種能力。另外開發人員在除錯即時事件順序的時候需要記錄、使用簡單的記錄工具。
首先遇到這種問題的個人電腦和大型電腦程式設計師經常在設計優先級和可行方法的時候感到困惑。指導、代碼審查和非個人風格(egoless(英語:egoless))的編程是值得推薦的。
隨著嵌入式系統變得越來越複雜,更高層次的工具和作業系統逐漸移植到可行的裝置上。例如,蜂窩電話、個人數字助理和其他的消費用電腦需要一些從個人或者這些電子裝置製造商之外的公司購買或者提供的一些重要軟體。在這些系統中,需要如Linux、OSGi或者Java這樣的開放編程環境,這樣第三方軟體提供上才能夠在大規模的市場上銷售軟體。
大多數這樣的開發環境都有一個執行在個人電腦上的參考設計,這種軟體的絕大部分都可以在傳統的個人電腦上開發。然而,從開放環境移植到專用的電子裝置和電子裝置的驅動程式開發通常仍然是傳統的嵌入式系統軟體工程師的工作。在有些情況下,the engineer works for the integrated circuit manufacturer, but there is still such a person somewhere.
作業系統
編輯
使用Windows XP的網際網路收費電話
嵌入式系統經常沒有作業系統、專用的嵌入式作業系統(經常是即時作業系統)或者指定程式設計師移植到這些新系統。
啟動
編輯
嵌入式系統帶有啟動代碼,通常它禁止中斷、設定電子裝置參數、測試電腦(RAM、CPU和軟體),然後開始應用程式執行。許多嵌入式系統從短暫的掉電狀態恢復,經常重起而不進行最近的自檢。在十分之一秒內重啟是常見的現象。
許多設計人員發現LED在指示錯誤狀態上非常有用,它們可以幫助進行故障處理。一個常用的機制是在復位的時候點亮電子裝置所有的LED以表明供電和LED正常工作;然後在進行加電自檢時由軟體改變LED的狀態;在此之後,軟體用這些LED指示操作過程中的正常或者故障狀態。這可以讓技術人員、工程師和使用者了解系統的狀態。一個有趣的例外是電度表(electric power meters)和其他一些大街上的東西,閃爍的指示燈是為了吸引注意力或者表示損壞狀態。
內部自檢
編輯
許多嵌入式系統都有一定程度或者一定數量的內部加電自檢,自檢有幾種類型:
電腦檢查:檢查CPU、RAM和程式記憶體。通常一加電就開始這些檢查,在一些安全性非常重要的系統中,通常周期性地在安全時間間隔內進行自檢,或者經過一段時間就進行自檢。
外圍裝置檢查:仿真輸入和讀入資料或者測量輸出資料。有大量的通訊、類比和控制系統都有這些非常廉價的檢查。
電源檢查:通常測試每個供電電路,也可能檢查電池或者主電源輸入。通常供電部分的負載都很重,並且少有餘量,所以這項檢查很有意義。
通訊檢查:驗證從相連單元接收到的簡單訊息,例如在網際網路上使用ICMP訊息「ping」。
電纜檢查:將線連結到待檢查的電纜上指示針進行檢查。如電話這樣的同步通訊系統經常使用「同步」測試。電纜檢查成本很低,當單元部分有插頭的時候這項檢查尤其重要。
裝備檢查:一個系統在安裝時經常需要進行調整,這項檢查就向安裝人員做出狀態指示。
消耗檢查:檢查系統所消耗的東西、在預量太低時發出警告。最常見的例子是汽車的油量表,最複雜的例子可能是維持化學反應物詳細狀態的自動醫學分析系統。
執行檢查:檢查使用者關心的系統執行狀態。顯然,在系統執行時必須進行這項檢查,這方面的檢查包括飛機上的導航儀器、汽車的速度表和磁碟的指示燈等。
安全檢查:在'安全時限'內進行檢查確保系統仍然可靠。安全時限通常小於能夠產生損害的最小時間。
可靠性體系
編輯
根據人們需求的不同,可靠性也有不同的定義,有意思的是,可靠性的類型卻相對較少,相似可靠性類型的系統,使用相似類型的內在檢查和恢復方法:
系統非常不安全或者無法修理。這包括太空系統、水下電纜、導航燈塔、鑽孔系統,非常奇怪的是還包括汽車和大規模生產產品。總的來說,嵌入式系統檢測各個子系統、線上切換到冗餘部分或者工作在「limp模式」提供部分的功能。大規模生產的消費產品如汽車、個人電腦或者印表機也屬於這個類別,這是因為與購買的費用相比維修費用高昂、維修人員又路途遙遠。
系統不能安全地停止執行。這包括飛機導航、反應控制系統、重要的化學工廠安全控制、鐵路訊號、單發動機飛機的發動機,如上所述,但是「limp模式」較難容忍,通常需要操作員選擇備份系統。
系統停機時將會造成大量的金錢損失。這些包括電話交換機、工廠控制、橋梁和電梯控制、資金轉移、市場開發、自動銷售和服務等,這些系統通常有一些運轉/不運轉測試,它們通常帶有線上冗餘或者使用替換系統和人工過程的limp模式。
系統不安全的時候不能操作。同上面的情況類似,系統的執行將會造成大量的金錢損失。醫療裝置、帶有發動機這樣的熱備份的飛行器、化學工廠控制、自動股票交易、遊戲系統等。測試可能是五花八門,但是出錯時能夠做的就是停止整個系統。