天天看點

嵌入式項目經驗

轉自:topic.csdn.net/u/20090621/14/6af00cc9-1a56-4a8e-a63f-c851df4676aa.html

來源:www.armjishu.com 

作者:jesse 

轉載請注明出處

    我寫這篇文章的目的,是用本人20年的嵌入式經驗來告訴大家,沒有明确的目标,成功将無從談起。做任何事的第一步必須明确目标。與日常生活中的大多數事務一樣,設計一個嵌入式産品的過程也必須從确定目标開始,對生産的産品進行明确定義。對産品進行定義主要是對産品是什麼和能有什麼功能進行描述,其次是在我們的整個開發過程中,應該要撰寫一些開發文檔,大概的架構的如下:

    1)産品需求文檔:描述産品的特性 

    2)功能需求文檔:描述産品必須具備的功能 

    3)工程說明文檔:描述系統實作的方法和滿足需求的手段 

    4)硬體說明文檔:對有關硬體進行描述 

    5)軟體或固件說明文檔:描述特定處理器下設計微程式以及固件的方法 

    6)測試說明文檔:描述必須測試的項目和驗證系統正常運作的方法

1.需求定義

    需求定義用來描述産品的基本功能,對于公司來說,需求一般由該公司的市場銷售部門或該公司的主要客戶來制定;而對小公司或愛好者(就像armjishu.com裡的愛好者一樣),技術人員可以自己負責定義需求,并撰寫成文檔。

    通常需求定義是圍繞以下幾個因素而來:

    1)系統的用途(定義需要系統實作的各種功能)

    2)實際輸入輸出是何種方式實作的(為元器件的選型做參考)

    3)系統是否需要操作界面(涉及軟體層作業系統的選型)

    其實對小型的嵌入式産品來說,定義需求是非常關鍵的,因為需求清楚了,就可以避免後續開發過程中出現的諸如随機存儲器(RAM)容量不足或所選的CPU速度不能滿足處理的需要等一系列問題。

---------------------------------------------------------------------------------------------------------- 

    下面舉個簡單的實際例子,供大家來參考:

    系統描述:用于控制溫泉水泵的換水系統 

    電源輸入:使用來自于變壓器的9V~12V直流電 

    水泵功率:375W 

    1)使用單相交流電機,由機械電氣進行控制 

    2)如果溫泉池處于低水位,則輸入開關閉合,以禁止水泵繼續運作 

    3)使用者可以自由設定水泵運作或關閉的時間長度 

    4)除了自動設定控制外,還需要提供一種人工裝置來允許維護人員靈活控制水泵進行維修 

    5)水泵開啟/關閉/人工幹預的時間可以30分鐘為機關,在30分鐘到23小時的範圍内進行調節 

    6)顯示裝置可以訓示水泵的開關狀态,剩餘時間,以及水泵是否處于人工幹預模式 

    7)具備監視低水位的功能,并顯示在螢幕上

    如果需要商用,那麼除了上面給出的功能要求外,其設計文檔中還要包括電磁幹擾(EMI)和電磁相容性(EMC)認證、安全認證以及使用環境(包括環境溫度、濕度、鹽霧腐蝕等)等方面的需求。

    實際上,以上的需求确定之後,接下來就是要考慮選擇一款合适的CPU來滿足和實作系統的功能,那麼我們就要将上述7點使用者能夠了解的需求轉化成我們專業領域的需求,轉化如下,大家可以參考一下:

    a.處理或更新輸入輸出信号的速率究竟需要多快? 

    解釋:目前嵌入式處理器的主頻一般都在幾十兆到幾百兆不等,單片機的主頻一般是幾十兆,ARM處理器可以到幾百兆;我們主要看這個産品是否需要對大量資料進行處理,或是否需要對緩沖區進行頻繁操作,是否有類似的占用CPU資源的工作要做,這就決定我們要選擇一款合适的處理器來讓該産品得到最佳的性能。

    b.是否可使用單片內建電路(專用IC)或FPGA來完成資料處理? 

    解釋:如果可以的話,就不一定要選擇處理器來做,用這些專業晶片就能替代

    c.系統是否有大量的使用者輸入輸出操作(如對開關和顯示裝置進行頻繁操作)? 

    解釋:如果有的話,要在處理器選型的時候考慮這些因素,選擇一款能夠滿足以上要求的CPU

    d.系統與其他外部裝置之間需要使用何種接口? 

    解釋:這也是需要評估處理器的一個關鍵問題,選擇具備這些接口功能的處理器會友善于我們的電路設計以及軟體程式設計

    e.設計完成後是否有可能需要進行改動,或在設計過程中系統需求是否可能出現變化?我們的設計是否能适應系統需求的變化? 

    解釋:要避免選擇的處理器剛好滿足目前要求,這樣當以後事務要求逐漸提高,處理器性能如果還有一定空間的話,那麼就可以重用目前的産品;第二個就是要選擇不會即将停産的晶片,很多處理器用得很廣乏,可以借鑒的資料也很多,但是很可能這款晶片已經在市場上流行很長時間了,晶片廠商已經推出更新換代的替代品了,如果你選擇了這款晶片,很可能1,2年後就買不到這款處理器晶片了,導緻不得不重新選擇新的處理器,重新設計産品,這樣的既耗費時間,金錢,更消耗人力,延誤市場的戰機。 

----------------------------------------------------------------------------------------------------------

2.處理器的選擇

2.1.需要使用的I/O管腳數量

    多數處理器都是使用記憶體和外部管腳來控制輸入輸出裝置的,通常處理器都會有内置ROM和RAM的,如果内置的記憶體就已經滿足需要,那麼處理器就可以節省産生引用外部存儲器信号的引腳,這樣處理器可為輸入輸出提供較多的裝置管腳(某些處理器支援外部RAM或ROM的使用,但對外部存儲器進行通路時,處理器一般需要占用8條到10條I/O管腳)。

    還有,有些處理器帶有專用的内部定時時鐘,這類時鐘也需要使用一個端口管腳來實作某些定時功能;某些處理器中還具有漏極輸出和高電流輸出能力,可以友善的直接驅動繼電器或電磁鐵線圈,而不再需要額外驅動硬體的支援。

    當對處理器I/O管腳進行計數時,我們一定要把使用處理器内部功能(如串行接口和定時器等)時限制使用的某些管腳考慮在内。

2.2.需要使用的接口數量

    嵌入式處理器的主要功能是與應用環境中的硬體進行互動操作,這不僅需要外部硬體對接口具有實時處理能力,而且還要求處理器必須以足夠快的速度對接口資料進行有效處理。

    舉例來說,AT91RM9200是ATMEL公司出品的一款工業級ARM9微處理器,它基于ARM920T核心,處理速度可達200MIPS,同時處理器内部配置了USB、Ethernet 、支援RS485的紅外序列槽、IIC、SPI、SSC等輸出接口,其目的是更友善的利用這些接口開發出嵌入式産品。

    需要注意的是,由于許多處理器具有的局限性沒有在處理器技術資料中給予足夠的說明,是以一定要仔細閱讀處理器的名額說明。例如,在閱讀資料的過程中發現,該資料可能會說明其串行接口可以在最高波特率下工作,但仔細研究該處理器的名額資料時,可能會發現并非該序列槽接口的所有操作模式都可以在最大波特率下運作。

    深入了解并明确接口要求的方法:可以自己動手編寫一些程式來對接口進行實際測試,以确認某種處理器是否可以滿足應用的要求;因為,确認某個處理器是否可以滿足接口要求并非是一件簡單的任務。

2.3.需要使用的記憶體容量

    決定記憶體容量的大小是嵌入式産品設計過程中的一個基本步驟,如果對所需記憶體容量估計過高,那麼我們就有可能會選擇成本較高的解決方案;反之,如果低估了所需記憶體容量,就有可能因系統需要重新設計而導緻項目不能按時完工。

    a.RAM和ROM的差別:存儲器分為随機存儲器(RAM)和隻讀存儲器(ROM)兩種。其中ROM通常用來固化存儲一些生産廠家寫入的程式或資料,用于啟動電腦和控制電腦的工作方式。而RAM則用來存取各種動态的輸入輸出資料、中間計算結果以及與外部存儲器交換的資料和暫存資料。裝置斷電後,RAM中存儲的資料就會丢失。

    b.随機存儲器(RAM)的選擇:RAM容量的預測是比較直覺的,我們隻需把所有變量數目與所有内部緩沖區的容量以及先入先出(FIFO)隊列長度和堆棧長度直接相加,就能得到所需RAM容量的總數。 

    如果所需記憶體容量超出這類處理器的尋址範圍,那麼隻能通過增加外部RAM來滿足需求;然而,增加外部RAM的同時将會占用一定數量的I/O管腳來對擴充記憶體進行尋址,這種擴充往往會影響到處理器來實作應用的初衷。 

    需要注意的一個問題是,某些微處理器限制RAM的使用,這種限制的目的是為了借用部分記憶體存儲器作為内部寄存器組使用。除了以上因素外,所使用的開發語言也對所需RAM容量有一定的影響,某些效率較低的編譯程式可能會占用大量寶貴的RAM空間。

    c.隻讀存儲器(ROM)的選擇:系統所需ROM的大小應該是系統程式代碼與所有基于ROM的資料表容量之和。預測所需ROM空間容量比較困難的部分是預測程式代碼的長度,解決這類問題的方法隻能是随着經驗的逐漸積累來提高預測精度。 

    然而,最重要的并不是精确計算程式的代碼長度,而是要清楚地估算代碼長度的上限。根據經驗,如果80%的ROM空間被代碼占用的話,那麼就太擁擠了,除非能確定系統需求不會有任何變化,否則至少要為可能發生的變化保留足夠的備用ROM空間。 

    在多數情況下,我們可以試着在ROM中寫入一部分程式代碼,以便觀察代碼占用空間的情況,對于帶有内部ROM的微處理器系統來說,系統程式都隻能占用有限的程式存儲器空間。

    d.經驗之談:ROM與RAM使用情況相類似,程式代碼長度與所選用的開發語言有關。舉例來說,使用彙編語言編制的程式要比使用C語言編制的程式占用少得多的空間。 

    對于追求低成本的小型系統來說,一般不提倡使用進階程式設計語言;這是因為雖然進階語言在使用、調試以及維護方面來的比較容易,但同時這類語言需要占用更多的記憶體空間和大量的處理器時鐘周期。 

    如果開發語言選擇不當,其後果可能是把一個簡單、低成本的單片機系統變為一個需要使用配置若幹兆位元組RAM空間的64位嵌入式處理器系統。

2.4.需要使用的中斷數量

    中斷的主要用途是向中央處理器通報目前發生的某類特殊事件,這類事件包括諸如定時器逾時事件、硬體引發的事件等。

    需要強調的是,多數系統設計師經常過多地使用中斷功能,實際上,中斷的主要作用隻是中斷現行程式的執行,中斷最适用于必須要求中央處理器立即提供服務的事件。

    在需要設計和使用中斷的情況下,一定要首先确認實際需要的中斷數量,然後必須考慮到系統内部占用的中斷資源,如果需要使用的中斷資源超出了處理器可以接收的中斷數量,我們就應借助于某些特殊手段來減少所需中斷信号的數量。

2.5.實時處理方面的考慮

    實時處理是一個涉及範圍很廣的題目,其主要内容與系統的處理速度有密切聯系,實時事件是嵌入式微處理器需要關注的主要任務。

    例如:處理器跟序列槽進行通信時,通常通過上層軟體(為了保證明時性,進行任務切換的時間足夠短),然後再占用處理器去執行從序列槽拿資料的任務,并且要保證處理器的速率比序列槽速率快,那麼處理器可以以最快的速度反應并處理序列槽的相關的任務,這樣就可以達到最大的實時性;

    另一方面,如果處理器本身就内置了序列槽控制器、或DMA、或LCD的控制器等,那麼它就可以保證直接使用這些處理器内置的接口去控制序列槽、液晶屏等對象,以達到最大的實時性能。

2.6.該廠商是否提供好的開發工具和環境

    選擇一款新的處理器,很可能就要使用一個新的開發工具和開發環境,包括軟體的編譯環境等;對于開發日程安排比較緊張的項目來說,開發人員往往無法抽出專門的時間來研究,熟悉新的開發工具,進而也無法全面掌握開發工具的使用技巧。

    并且,有的開發工具價格也比較昂貴,而且很可能隻能從制造商那裡購買,還有仿真工具也是需要付費的,這些對我們在選擇一款處理器的時候,是都應該考慮進去的成本因素。

2.7.處理器速度方面的考慮

    主要考慮幾個細節問題: 

    1)處理器速度與處理器時鐘之間的關系

    例:單片機8031為例,由該處理器可以适應12MHz頻率的輸入時鐘,是以就可以認為它是一個速度為12MHz的處理器了嗎?不是,實際上,由于該處理器内部邏輯電路執行每條指令需要多種不同頻率的時鐘脈沖,是以該處理器内部時鐘電路要對輸入的12MHz時鐘12分頻處理;最終為處理器提供的隻是1MHz主頻。

    有的時候,80MHz主頻的處理器(80MHz輸入時鐘,80MHz執行速度)要比200MHz主頻的處理器(200MHz輸入時鐘,50MHz執行速度)執行速度要快得多。

    2)處理器指令系統

    如果不需要執行複雜數學運算的應用,那麼RISC指令集的處理器要快;如果執行比較複雜的操作,則CISC指令集的處理器速度要更快。

    3)晶片結構體系

    現在有的晶片是将多個不同功能的核封裝到一個晶片IC中,定制某種特定的功能,比如DSP,其中包括用于實作數字解碼、乘法運算的硬體乘法器和移相器等;然而,這類處理器也有其自身局限,往往在執行某些普通操作之前必須要使用額外的指令來把RAM中的資料放入内部寄存器,相比之下,一般處理器隻允許對RAM中的資料進行直接通路。

2.8.隻讀存儲器(ROM)的選擇

    多數工程項目在其開發階段一般使用可擦寫可程式設計隻讀存儲器(EPROM)或快速存儲器(Flash Memory);這類可擦寫可重複寫入存儲器的主要優點是可多次使用。一旦産品研制完畢,就可以用一次寫入裝置(OTP)來取代EPROM存儲器,一次性寫入器件的外觀與封裝幾乎與EPROM完全一樣,惟一不同之處就是其表面沒有擦除視窗,并且價格要比EPROM低很多。

    但是,另外一種情況,如果該産品今後需要更新固件,或線上程式設計,那麼我們還是應該選擇可擦寫可程式設計的存儲器。

    還有一種是非易失的存儲器,例如制造一台電視機,就有可能需要該裝置具有記憶上次觀看最後一個頻道的功能,即使在切斷電源後,該頻道資訊也不會丢失。

    總結:是以,根據不同的産品選擇不同的存儲器也是一門很講究的學問。

2.9.電源的要求

    在某些設計方案中,電源根本不存在問題,對電源唯一的要求就是可以為電路正常供電;實際上,選擇電源主要要考慮三個方面的問題:

    1)要注意設計方案中是否對電源的供電方式有所限制,例如,是否像大多數家用電器那樣需要使用屋内牆上的電源插座供電,或是是使用USB接口供電

    2)看系統是否需要使用電池供電方式,如果這樣,我們就要考慮選擇那種對驅動電流要求不高的處理器,然後再為其選擇合适的電池。

    3)休眠電流:許多微處理器都支援低功耗運作模式,在這種模式下,系統的CPU處理器将處于休眠狀态,同時所有外部裝置的電源供電都被暫時切斷,以便減少系統的電能消耗;某些微處理器在這種方式下需要的維持電流極小,但也有一些微處理器在這種方式下并不能節省多少功率;不管怎樣,我們都要對系統在節電模式下的工作時間有一個估測,以便對具體情況選擇使用的電池。

    總之,無論哪種情況,我們都要對系統需要的供電總功率做到心中有數。

2.10.裝置工作環境的要求

    環境要求主要内容是考慮溫度,濕度等;如果系統必須在溫度範圍較大的環境下運作,諸如用于軍事裝置或汽車的控制系統,那麼處理器可選擇的範圍就要小得多;并且由于大範圍溫度變化的裝置通常比較昂貴,是以在設計過程中就不能再根據一般工業級器件的價格來制定預算。

2.11.使用周期成本

    如果我們的産品是mp3,在一般情況下,可以不必考慮在使用者現場對mp3程式進行修改的問題,也不用為是否可以得到裝置備件而着急,這是因為mp3是一種消費産品;換句話說,如果我們的産品是價值幾萬塊的工業裝置并且需要常年不斷地運作,那麼我們在産品設計過程中就必須從長計議了:

    a.首先,我們需要選擇一種處理器或存儲體系結構都可以更新的器件 

    b.考慮到程式更新的可能,我們還要選擇較大容量的記憶體 

    c.最後要注意的則是所選處理器是否可以長期供貨,這一點的重要性遠遠大于處理器的價格

    除了上面的考慮之外,使用周期成本也是在設計之初要考慮的因素。總的來說,生産的部件越多,則可以接受的前期開發成本也就越大。如果産品是mp3,我們可能會選擇一個低價微處理器,同時投入一大筆錢來開發控制mp3的軟體。

    但如果我們的産品是價格昂貴的工業用裝置,那麼在産品的使用期内,該裝置的銷售量将隻有幾百台,毫無疑問,開發這種産品最重要的就是降低開發成本(降低開發成本而不是硬體成本!!!);除此之外,工業産品的成本也不像家用電器或消費電子産品那麼敏感。綜上所述,開發工業産品當然要選擇一種便于進行開發并且有助于縮短開發過程的處理器。

2.12.處理器相關資料是否豐富

    如果該款處理器在市場上已經用得很廣了,那麼我們可以擷取更多的相關資料,觀察人家的産品是如何使用處理器的,也能在網絡上找到不少的相關的設計資料以及相關技術主題,這樣就進一步降低了技術門檻,確定了使用該處理器做産品可行性,降低了風險;

    反之,如果是廠商全新推出的處理器,因為市場上還沒有可以借鑒的産品,我們就隻能從全英文的晶片手冊開始閱讀,了解這款晶片,這樣開發周期不僅變長,而且不可預知的風險也很大。

3.開發成本的預測和估計

    大多數項目或産品都有專人負責預測整個過程的開發成本,對于任何項目來說,其開發成本主要包括人力和材料開銷。

    預測開發成本在很大程度上需要根據經驗,這也是為什麼大型公司一般指定有經驗的進階工程師來完成這一任務的原因,除了人力和材料的開銷之外,總結下來,還有以下的開銷:

    1)人力成本(開發人員、管理人員、銷售人員、其他行政等輔助人員)的開銷

    2)材料(硬體物料和損耗,有時候需要投幾次PCB版才把産品穩定下來)的開銷

    3)開發系統和開發工具軟體的開銷

    4)硬體工具的開銷(例如示波器、仿真器等)

    對于整個項目來說,上述的開銷将直接可能導緻産品成本增加,其中人力成本最為關鍵,尤其是在中國,呵呵