zh未轉換未轉換 zh-cn大陸大陸 zh-tw台灣台灣 zh-hk港澳港澳 zh-sg新馬新馬 zh-hans簡體簡體 zh-hant繁體繁體
zh zh-cn zh-tw zh-hk zh-sg zh-hans
zh-hant字詞轉換是中文維基的一項自動轉換,目的是通過電腦程式自動消除繁簡、地區詞等不同用字樣式的差異,以達到閱讀方便。
字詞轉換包括全域轉換和手動轉換,本說明所使用的標題轉換和全文轉換技術,都屬於手動轉換。
嵌入式系統,是一種完全嵌入受控器件內部為特定應用設計的專用電腦系統。與個人電腦這樣的通用電腦系統不同,嵌入式系統通常執行的是帶有特定要求的預先定義的任務。由於嵌入式系統只針對一項特殊的任務,設計人員能夠對它進行優化,減小尺寸降低成本。由於嵌入式系統通常進行大量生產,所以單個的成本節約能夠隨著產量進行成百上千的放大。
個人行動數位助理(Personal digital assistants )及手持式電腦(handheld computers)由於它們在硬體上設計的特性,即使在軟體上的擴充性比其他裝置來得好,但普遍被認為是嵌入式裝置。但是這個定義也逐漸模糊。舉例來說,OQO Model 2被引進了Windows XP作業系統(operating system)上、以及使用像USB port--以上兩種特性皆屬於一般用途電腦,因此嵌入式系統的定義又更模糊了。
嵌入式系統的核心是由一個或幾個預先編程好執行少數幾項任務的微處理機或者微控制器組成。與通用電腦能夠運行用戶選擇的軟體不同,嵌入式系統上的軟體通常是暫時不變的;所以經常稱為“韌體(firmware)”。
目錄 |
第一個被大家認可的現代嵌入式系統是麻省理工學院儀器研究室的查爾斯·斯塔克·德雷珀開發的阿波羅導航電腦。在兩次月球飛行中他們在太空駕駛艙和月球登陸艙都是用了這種慣性制導系統。
在計劃剛開始的時候,阿波羅導航電腦被認為是阿波羅計劃風險最大的部分。為了減小尺寸和重量而使用的當時最新的單片整合電路加大了這種風險。
第一款大批量生產的嵌入式系統是1961年發佈的民兵I導彈上的D-17自動導航控制電腦。它是由獨立的晶體管邏輯電路建造的,它帶有一個作為主記憶體的硬碟。當民兵II導彈在1966年開始生產的時候,D-17由第一次使用大量整合電路的更新電腦所替代。這個專案自己就將方塊與非門整合電路的價格從每個1000美元降到了每個3美元,使得整合電路的商業應用稱為可能。
民兵電腦至關重要的設計特性是它的制導演算法能夠在專案後期重新編程以獲得更高的導彈精度,並且電腦能夠測試導彈,從而節省電纜和接頭的重量。
由於這些二十世紀六十年代的對於價格沒有要求的早期應用,嵌入式系統的價格開始下降,同時處理能力和功能也獲得了巨大的增長。這個趨勢就是摩爾定律。
第一款微處理機是英特爾4004,它在計算器和其他小型系統中找到了用武之地。但是,它仍然需要外部的記憶體晶片和其他的外部支援邏輯電路。更加強大的微處理機,如英特爾8080被開發出來用於軍事專案和其他用途。
到了二十世紀七十年代末期,8位微處理機已經變得普通,但是它們通常需要外部記憶體晶片和解碼輸入輸出的邏輯電路。然而,價格在快速下降,更多的應用領域採用小型的嵌入式系統取代當時常見的專門邏輯設計。一些容易見到的應用是儀器和昂貴的器材。
到了二十世紀八十年代中期,許多以前是外部系統的元件被整合到同一個處理機晶片中。這樣的結果就是嵌入式系統尺寸和成本的大幅下降。這樣的整合電路稱為微控制器而不是微處理機,嵌入式系統的大規模應用成為可能。
隨著微控制器的價格已經跌落到低於專案師一個小時的工資,嵌入式系統數量和不同廠商提供的嵌入式系統配件數量出現了大爆發。例如,許多新的特殊功能的整合電路開始使用較少插針的串列編程介面而不是傳統的並行介面來來連結微控制器。I2C也在這個時候出現。
隨著微控制器的價格跌落到1美元以下,使用小型微控制器控制的數字電路取代如分壓計和可變電容這樣的昂貴模擬元件成為可能。
到了八十年代末期,嵌入式系統已經出現在幾乎所有的電子器材中,這個趨勢依然在繼續。
嵌入式系統在最廣的意義上說就是電腦系統,它包括除了專門用於通用目的之外的所有電腦。從便攜式的音樂播放器到太空梭的實時控制子系統都能見到嵌入式系統的應用。
多數商業嵌入式系統都是為了低成本完成任務而設計的。其中絕大多數都有實時系統約束的要求,但並不是所有的嵌入式系統都有這些要求。對於其中一些過程來說它們要很快地完成,而其他一些功能可能並沒有嚴格的時間要求。這些系統透過與特定目的的硬體和根據系統要求配置的軟體組合在一起滿足實時要求。
很難根據速度或者成本描述嵌入式系統的特點,但是對於大批量生產的系統來說,降低成本通常是設計的首要考慮。嵌入式系經常有很低的性能要求,這樣系統硬體就可以簡化以降低成本。專案師最小化的實現通常選擇剛剛滿足所需功能的硬體。
例如,一個衛星電視的數字機頂盒每秒需要處理數十兆連續資料,但是這些資料的絕大部分處理過程是由分析、導引和解碼多路數字視訊的定製的整合電路完成的。嵌入式CPU“建立”這些處理過程並且顯示為機頂盒顯示圖形選單等外觀。隨著嵌入式處理機速度越來越快、價錢越來越低,它們就可以從事更多的高速資料處理。
對於小批量的嵌入式系統來說,經常使用個人電腦透過限制運行的程式或者將作業系統更換為實時作業系統來實現。在這種情況下,用於特殊目的的硬體可以替換成一個或多個高性能的CPU。然而,有些嵌入式系統可能仍然需要高性能的CPU、特殊的硬體和大量的記憶體以完成所需任務。
對於大批量的嵌入式系統來說,如手持音樂播放器或者蜂窩電話,降低成本是需要主要考慮的問題。這些系統通常有少數幾個整合電路、控制所有其他功能的高度整合的CPU和一片記憶體。在這些系統的設計中每個元件的選擇和設計都要有利於降低總體成本。
許多嵌入式系統的軟體,尤其是那些沒有磁碟機的嵌入式系統的軟體也被稱為韌體。韌體是嵌入到硬體器材中的軟體,如固化到一個或多個ROM或者快閃記憶體IC晶片中。
嵌入式系統上的程式經常運行在有限的硬體資源上:經常沒有磁碟、作業系統、鍵盤和螢幕。軟體也可能沒有如檔案系統這樣的部分,即使有檔案系統的話通常也是使用日誌(journaling)檔案系統的快閃記憶體驅動器(flash drive)取代旋轉的媒體。如果有使用者介面的話,那麼它就可能是一個小型按鍵或者液晶顯示。
機器中的嵌入式系統通常需要能夠經年不斷地正確運行,所以它們的軟體的開發和測試都要比個人電腦上的軟體更為仔細。許多嵌入式系統避免使用可動的部件如磁碟機、開關和按鈕等,因為可動部件的可靠性要比如快閃記憶體這樣的固態部件的可靠性差。
另外,嵌入式系統可能在人無法到達的地方運行,如下到油井鑽孔中、發射到外層空間等等,這樣嵌入式系統即使在發生災難性的資料破壞情況下也必須能夠自行重新啟動。這通常是透過一個名為看門狗計時器的標準電子部件實現的,除非軟體周期性地複位這個定時器否則它就會複位電腦。
通常使用微處理機或者微控制器構建嵌入式系統。一些大型的系統或者早期的系統使用通用大型電腦或者小型電腦構建。
嵌入式系統的使用者介面型式非常繁多,所以值得進行特殊說明。
PARC、蘋果電腦公司、波音公司和惠普公司的界面設計人員發現界面應該遵循減少用戶動作型式這樣一個原則。在嵌入式系統中這樣一個原則經常與降低成本的要求結合在一起。
在嵌入式系統中廣泛採用的一個標準界面是使用兩個按鈕控制一個選單系統,其中一個按鈕允許用戶捲動選單條目,另外一個用來選擇條目。
選單系統廣受歡迎是因為它們本身就說明瞭自身內容,並且能夠透過簡單的用戶操作選擇。
另外一個基本的技巧是減少並簡化輸出的型式。有些設計在每個介面插頭或者錯誤條件使用狀態燈指示哪一部分發生故障。一種廉價的做法是使用兩個發光條,另外帶有一個列印出來的故障程式碼表格。用戶可以將他所用語言表示的狀態貼在標簽上。例如,許多小型印表機使用亮燈表示狀態,這些狀態標示在列印成所需語言的不乾膠標簽上。在一些市場上,他們可能使用幾種這些標簽,這樣用戶就可以選擇最適合他們的語言。
另外一個通用的技巧是界面樣式要在用戶的角度上看起來非常清楚。如果一個界面有不同的樣式,它們通常應該可以用明顯的方式的方式切換回去或者它們能夠自動切換回去。
例如,波音公司的標準的測試界面就是一個按鈕和一些亮燈。當按下按鈕時,所有的燈就會變亮;當鬆開按鈕時,出現故障的指示燈就不會熄滅。它們的標簽都是用基礎英語表示的。
設計人員會用不同的顏色表示狀態。紅色表示“危險”或者一些錯誤發生導致整個系統故障;黃色表示一些部分可能有故障;綠色表示狀態正常或良好。這就類似於街頭的紅綠燈,大多數人都知道它們的含義。
一些設計保證在用戶操作之後馬上顯示狀態的變化。如果機器要做什麼動作,通常在7秒內開始並且彙報工作過程。
如果一項設計需要螢幕,設計人員經常選擇純文字方式。優先選用這種方式是因為用戶已經有多年識別標記的經驗。圖形用戶介面看起來很漂亮也能完成所有的功能,但是通常它們會增加一年的設計、批准和翻譯延期、增加專案一到兩個程式員的費用,而這些工作並沒有多少實際意義。經常一個過於聰明的圖形用戶介面因為可能使用用戶不熟悉的符號,所以實際上可能會讓他們感到困惑。
如果設計需要指示如複印機那樣的機器零部件,在實際的機器上它們通常使用數字進行編號,這些編號能在機器外觀上看到。
網路界面就是一個遠端的螢幕,同其他的使用者介面類似。
最成功的螢幕界面之一就是兩個選單按鈕和一行用戶所說語言的文字。它用在尋呼機、中檔印表機、網路交換機和其他一些需要用戶複雜操作的中檔價位的場合。
如果使用的是較大的螢幕,觸摸屏和螢幕旁的按鈕也可以減少用戶操作的型式並且容易控制選單選擇。這種系統的優點就是按鈕的含義可以隨著螢幕而變化,並且選擇的過程非常類似於人們自然選擇東西的方式。
當使用文字的時候,設計人員就要選擇一種或者多種語言。預設語言通常是標的用戶最為常用的語言。許多設計人員使用標的客戶群的原生語言以更好地滿足他們的需要。
文字通常是由專業人員進行翻譯,即使開發人員也說那種語言也是這樣。市場銷售人員能夠告訴國外的銷售商說這些翻譯都是非常專業的。一個國外的製造商有可能要求最大的銷售商審查、更正這些原生語言的翻譯以促進產品被原生銷售人員接受。
許多權威人士認為可用性測試比任何數量的觀點都重要,設計人員推薦可用性要儘早進行測試。一個常用的快速、dirty測試方法是讓秘書使用專案師使用奇怪的標誌拖動、控制的紙板模型。錄製的錄像帶顯示這樣做不僅很幽默也很有教育意義,In the tapes, every time the engineer talks, the interface has failed because it would cause a service call.
在許多組織里,使用者介面要有一個人要批准,通常這個人是客戶、主要的銷售商或者直接負責系統銷售的人。
在嵌入式系統設計中有許多不同的CPU架構,如ARM、MIPS、Coldfire/68k、PowerPC、X86、PIC、Intel 8051、Atmel AVR、Renesas H8、SH、V850、FR-V、M32R、DMCU等。
這與桌面電腦市場有所不同,寫這篇文章的2003年為止在那個領域只有少數幾家競爭的架構,其中主要是英特爾/AMDx86和用於Apple Macintosh的Apple/Motorola/IBM PowerPC。在桌面電腦領域,隨著對於Java接受程度的增長,軟體對於特定運行環境的依賴越來越少。
PC/104標準是小型、小批量嵌入式和ruggedized系統設計的基礎。這些系統通常使用DOS、Linux、NetBSD或者如QNX、Inferno這樣的實時嵌入式作業系統。
大批量生產的嵌入式系統的通常配置是系統單晶片(en:System On Chip),它是一個專用整合電路,CPU是外購的知識產權並且添加到整合電路設計中。一個類似的常用機制是使用可編程門陣列,所有的邏輯包括CPU部分都可以編程實現。許多時髦的FPGA都是為這個目的設計的。
同典型的電腦程式員一樣,嵌入式系統設計人員也使用編譯器、連結器和除錯器開發嵌入式系統軟體。然而,他們也使用一些大多數程式員不熟悉的工具。
軟體工具的來源有如下幾種:
嵌入式系統設計人員也使用一些不為普通電腦程式員所熟悉的軟體工具:
一些程式語言為嵌入式系統編程提供了一些特殊支援。
除錯通常使用內部電路模擬器或者其他一些能夠在微控制器微碼(microcode)內部產生中斷的除錯器。微碼中斷讓除錯器能夠在只有CPU工作的硬體中進行操作,基於CPU的除錯器能夠從CPU的角度來測試和除錯電腦的電路。PDP-11開創了這種特性的先河。
開發人員能夠仍然使用斷點、單步執行以及進階語言進行除錯,在許多的除錯工具上都有這種能力。另外開發人員在除錯實時事件順序的時候需要記錄、使用簡單的記錄工具。
首先遇到這種問題的個人電腦和大型機程式員經常在設計優先順序和可行方法的時候感到困惑。指導、程式碼審查和非個人風格(egoless)的編程是值得推薦的。
隨著嵌入式系統變得越來越複雜,更高層次的工具和作業系統逐漸移植到可行的器材上。例如,蜂窩電話、個人數字助理和其他的消費用電腦需要一些從個人或者這些電子器材製造商之外的公司購買或者提供的一些重要軟體。在這些系統中,需要如Linux、OSGi或者Java這樣的開放編程環境,這樣第三方軟體提供上才能夠在大規模的市場上銷售軟體。
大多數這樣的開發環境都有一個運行在個人電腦上的參考設計,這種軟體的絕大部分都可以在傳統的個人電腦上開發。然而,從開放環境移植到專用的電子器材和電子器材的驅動程式開發通常仍然是傳統的嵌入式系統軟體專案師的工作。在有些情況下, the engineer works for the integrated circuit manufacturer, but there is still such a person somewhere.
嵌入式系統經常沒有作業系統、專用的嵌入式作業系統(經常是實時作業系統)或者指定程式員移植到這些新系統。
嵌入式系統帶有啟動程式碼,通常它禁止中斷、設定電子器材參數、測試電腦(RAM、CPU和軟體),然後開始應用程式運行。許多嵌入式系統從短暫的掉電狀態恢復,經常重起而不進行最近的自檢。在十分之一秒內重起是常見的現象。
許多設計人員發現LED在指示錯誤狀態上非常有用,它們可以幫助進行故障處理。一個常用的機制是在複位的時候點亮電子器材所有的LED以表明供電和LED正常工作;然後在進行加電自檢時由軟體改變LED的狀態;在此之後,軟體用這些LED指示操作過程中的正常或者故障狀態。這可以讓技術人員、專案師和用戶瞭解系統的狀態。一個有趣的例外是電度表(electric power meters)和其他一些大街上的東西,閃爍的指示燈是為了吸引註意力或者表示損壞狀態。
許多嵌入式系統都有一定程度或者一定數量的內部加電自檢,自檢有幾種型式:
根據人們需求的不同可靠性也有不同的定義,有意思的事,可靠性的型式卻相對較少,相似可靠性型式的系統使用相似型式的內在檢查和恢復方法:
常用的嵌入式軟體架構有幾種不同的基本型式。
在這種設計中,軟體有一個簡單的循環,這個循環調用各個子程式,每個子程式管理硬體或者軟體的某一部分。中斷通常用來設置標記或者更新軟體其他部分能夠讀取的暫存器。
系統使用簡單的API來完成允許和禁止中斷設置。如果處理得當的話,它能夠在巢狀子程式中處理巢狀調用,在最外面的中斷允許巢狀中恢復前面的中斷狀態。這種方法是實作Exokernel的一個最簡單的方法。
通常在循環中有一些子程式使用周期性的即時中斷控制一組軟體定時器,當一個定時器時間到的時候就會執行相應的子程式或者設置相應的標誌。
任何可能發生的硬體事件都應該有軟體定時器的支援,硬體事件大概每萬億次出現一次錯誤,對於現代的硬體來說大概是一年發生一次,對於以百萬計大規模生產的設備來說,遺漏一個軟體軟體定時器在商業上可能是災難性的。
有時測試軟體運行一組基於軟體的安全定時器,它們周期性地複位硬體中的軟體看門狗。如果軟體錯過一個事件,安全定時器軟體將會捕捉到它。如果安全定時器出錯,看門狗硬體將會複位系統。
可以使用指向每個狀態機函數的指標實作狀態機,函數可以用C++、C或者組合語言等實作。變化的狀態將不同的函數放到指標中,每次循環運行時都會執行函數指標。
許多設計人員建議每個循環讀一次輸入輸出設備、並且保存得到的結果,這樣可以保證邏輯過程的在一致的參數上運行。
許多設計人員喜歡將狀態機設計成每個狀態僅僅檢查一到兩項內容,通常是檢查硬體事件和軟體定時器。
設計人員建議多級狀態機應該讓低層狀態機早於高層狀態機運行,這樣高層就能夠根據正確的資訊運行。
如內部燃燒控制這樣的複雜功能通常根據多維表格進行處理,代碼通常進行查表處理而不進行複雜的計算,為了減小表格的大小以及成本軟體可以在條目之間進行差值運算。
在最小的微控制器中,尤其是只有128位元組堆疊的8051中,控制環允許好的連接器使用靜態分配的數據覆蓋原生變數。在這種機制中,離子程式調用樹末端越近的變數得到的記憶體位址越高。當開始一個新的分支的時候,它的變數可以在以前分支遺棄的空間中進行重新分配。
簡單控制迴圈的一個主要缺點是它無法保證響應特定硬體事件的時間。
細心的設計可以很容易地保證中斷不會被長時間禁止,這樣中斷代碼就可以在非常精確的時間運行。
控制環的另外一個主要缺陷是增加新的特性的時候會變得複雜。需要花費很長時間的演算法必須小心地進行分解以使得每次只有一小部分在主循環中運行。
這種系統的優勢是它的簡單性,並且在很小的軟體上,循環執行地很快幾乎沒有人關心它是不可預測的。
它的另外一個優勢是這種系統保證運行軟體的質量,無法將不好的運行結果歸咎為其他的作業系統。
非搶先多工系統非常類似於上面的系統,只是這個回圈是隱藏在API中的。我們定義一系列的任務,每個任務獲得自己的子程式棧;然後,當一個任務空閑的時候,它喚起一個空閑子程式(通常喚起“暫停”、“等候”、“交出(:en:yield)”等等)。
帶有類似屬性的架構都帶有一個事件佇列,有一個回圈根據佇列列表中的一個域確定刪除時間和喚起子程式。
這種架構的優點和缺點都非常類似於控制環,只是這種方法添加新的軟體更加簡單,只需要簡單地編寫新的任務或者將它添加到佇列直譯器中。
使用上面的任何一種系統,但是添加一個按照定時器中斷運行子程式的定時器系統,這樣就給系統添加了嶄新的能力,這樣定時器子程式第一次能在一個有保證的時間內運行。
另外,程式碼第一次能夠在非預期的時間訪問自己的資料結構。定時器子程式必須要象中斷子程式一樣進行處理。
使用上面的非搶先式任務系統,從一個搶先式定時器或者其他中斷運行。
這樣系統就突然變得很不一樣了。任何一個任務的程式碼都有可能損害其他任務的資料 &emdash; 所以它們必須進行切缺的切分。對於共用資料的訪問必須使用一些同步策略進行控制,如訊息佇列、信號燈或者非阻塞同步機制。
經常在這一步開發組織就會購買一套實時作業系統。如果一個組織缺少能夠編寫作業系統的人才或者作業系統將要在幾個產品之上,這可能是一個明智的選擇。這通常要將開發計劃增加六倒八周,and forever after programmers can blame delays on it.
這種方法試圖將系統組織得比大核心更易於配置,而同時提供類似的特點。
微核心是實時作業系統的一個邏輯發展,通常的組織方式是作業系統核心分配記憶體並且將CPU在不同的執行緒之間進行切換。用戶樣式的行程實現如檔案系統、用戶介面等主要的功能。
微核心在二十世紀五十年代開始首次嘗試,但是由於電腦在任務間切換以及在任務間交換資料速度非常緩慢,所以人們放棄了微核心而鐘情於MULTICS和UNIX風格的大核心。總體上來說,微核心在工作切換以及任務間通信速度快的時候是比較成功的,在速度慢的時候是失敗的。
外核心透過使用普通的子程式喚起獲得的通信效率很高,硬體以及系統中的軟體都是程式員能用也能擴展的。資源核心(可能是庫的一部分)分配CPU時間、記憶體以及其他資源。如多工、網路以及檔案系統這樣的大核心特性透過程式碼庫來提供。庫可以進行動態的連線、擴展或者共用。不同的應用甚至可以使用的不同的庫,但是所有的資源都來自於資源核心。
一些航空電子系統使用幾個商用電腦。這樣更進一步,每個電腦都在模擬它們自身的幾個副本,重要的程式同時在幾個電腦上運行並且進行投票控制(:en:vote)。
模擬環境的優點就是即使一個電腦出現故障,軟體的不同常式能夠遷移到正常工作的軟體分區,表決的票數並不受影響。
通常虛擬軟體運行在電腦的用戶樣式下,它捕捉、模擬硬體訪問和不在用戶樣式下運行的指令。
另外一種常用的機制是兩個電腦計算 for a bit,然後將它們的計算結果報到那個點上。如果一個電腦的計算是 nut,它就會被關閉。
這種系統通常在沒有系統經費的嵌入式專案中流行,但是從這篇文章的多個作者來看這通常是不正確的,它們的邏輯是:
然而許多工程師並不認同這一點,嵌入式Linux越來越受到人們的歡迎,尤其是在無線路由器和全球定位系統這樣的功能強大的嵌入式系統中。其中有下麵一些原因:
一些系統需要安全、及時、可靠或者高效的特性,上面的架構卻無法達到,構建這樣的系統有一些廣為人知的技巧:
這就意味著使用兩個優先順序和監視器的系統是安全、可靠的,因為它們沒有死鎖和優先順序倒置的問題。如果監視器能夠執行到結束,那麼就永遠不會掛起。如果使用和諧的任務,可能還會相當高效。然而,RMA 無法描述這些系統,優先順序最好也不要到處都有,其中包括作業系統和硬體。
參見嵌入式作業系統
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History