嵌入式系統學習在初學者中存在的誤區有這五點
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///
嵌入式系統的應用範圍可以粗略分為兩大類:電子系統的智能化(工業控制、現代農業、家用電器、汽車電子、測控系統、數據採集等),計算機應用的延伸(MP3、手機、通信、網絡、計算機外圍設備等)。從這些應用可以看出,要完成一個以MCU為核心的嵌入式系統應用產品設計,需要硬體、軟體及行業領域相關知識。硬體主要有MCU的硬體最小系統、輸入/輸出外圍電路、人機接口設計。軟體設計有固化軟體的設計,也可能含PC機軟體的設計。行業知識需要通過協作、交流與總結獲得。
硬體最小系統(電源、晶振、復位、寫入調試接口);
模/數轉換(各種傳感器信號的採集與處理,如紅外、溫度、光敏、超聲波、方向等);
通信(串行通信接口SCI、串行外設接口SPI、集成電路互聯總線I2C、CAN、USB、嵌入式乙太網、ZigBee技術等);
控制(控制各種設備,包括PWM等控制技術);
各種具體應用。
以上實踐訓練涉及硬體基礎、軟體基礎及相關領域知識。計算機語言、作業系統、開發環境等均是達到這些目的的工具。有些初學者,容易把工具的使用與所要達到的真正目的相混淆。例如,有的學習者學了很長時間的嵌入式作業系統移植,而不進行實際嵌入式系統產品的開發,到最後也做不好一個嵌入式系統小產品,偏離了學習目標,甚至放棄嵌入式系統領域。這就是進入了嵌入式系統學習誤區,下面對此作一些分析。
關於嵌入式系統的學習方法,因學習經歷、學習環境、學習目的、已有的知識基礎等不同,可能在學習順序、內容選擇、實踐方式等方面有所不同。但是,應該明確哪些是必備的基礎知識,哪些應該先學,哪些應該後學;哪些必須通過實踐才能獲得;哪些是與具體晶片無關的通用知識,哪些是與具體晶片或開發環境相關的知識。
2.1作業系統的困惑
RTOS本身由於種類繁多,實際使用何種RTOS,一般需要由工作單位確定。基礎階段主要學習RTOS的基本原理與RTOS上的軟體開發方法,而不是學習如何設計RTOS。以開發實際嵌入式產品為目標的學習者,不要把過多的精力花在設計或移植RTOS上面。正如很多人使用Windows作業系統,而設計 Windows作業系統的只有Microsoft。許多人「研究」Linux,但不使用它,浪費了時間。人的精力是有限的,學習必須有所選擇。
以MCU為核心的嵌入式技術的知識體系必須通過具體的MCU來體現、實踐。但是,選擇任何型號的MCU,其晶片相關的知識只占知識體系的20%左右,80%左右是通用的軟體硬體及相關知識。80%的通用知識,必須通過具體實踐才能獲得,所以學習嵌入式技術一般要選擇一個系列的MCU。
有些學者,僅從軟體開發角度認識嵌入式系統,甚至僅從嵌入式作業系統認識嵌入式系統。這些學者大多具有良好的計算機軟體開發基礎知識,認為硬體是生產廠商的事。他們沒有認識到,嵌入式系統產品的軟體與硬體均是需要開發者設計的。筆者常常接到一些關於嵌入式產品穩定性的諮詢,發現大多數是由於軟體開發者對底層硬體的基本原理不理解。特別是有些功能軟體開發者,過分依賴於底層硬體的驅動軟體,自己對底層驅動原理知之甚少。實際上,一些功能軟體開發者,名義上在做嵌入式軟體,其實僅僅是使用嵌入式編輯、編譯環境而已,本質與開發通用PC機軟體沒有兩樣。而底層硬體驅動軟體的開發,若不全面考慮高層功能軟體對底層硬體的可能調用,也會使封裝或參數設計得不合理或不完備,導致高層功能軟體調用困難。可以看出,若把嵌入式系統的開發孤立地分為硬體設計、底層硬體驅動軟體設計、高層功能軟體設計,那麼一旦出現問題,就可能難以定位。實際上,嵌入式系統設計是一個軟體、硬體協同設計工程,不能像通用計算機那樣,軟體、硬件完全分開來看,而要在一個大的框架內協調工作。
學習嵌入式系統是以軟體為主還是以硬體為主,或者如何選擇切入點,如何在軟體與硬體之間取得平衡?對於這個困惑的建議是:要想成為一名真正的嵌入式系統設計師,在初學階段,必須打好嵌入式系統的硬體與軟體基礎。以下是從事嵌入式系統設計二十多年的美國學者JohnCatsoulis在《Designing Embedded Hardware》一書中關於這個問題的總結:嵌入式系統與硬體緊密相關,是軟體與硬體的綜合體,沒有對硬體的理解就不可能寫好嵌入式軟件;同樣,沒有對軟體的理解也不可能設計好嵌入式硬體。
2.3片面認識嵌入式系統
嵌入式系統產品種類繁多,應用領域各異。在第1部分中,把嵌入式系統的應用範圍粗略分為電子系統的智能化與計算機應用的延伸兩大類。從初學者角度,可能存在分別從這兩個角度片面認識嵌入式系統的問題。因此,一些從電子系統智能化角度認識嵌入式系統的學習者,可能會忽視編程結構、編程規範、軟體工程的要求、作業系統等知識的積累。另一些從計算機應用的延伸角度認識嵌入式系統的學習者,可能會把通用計算機學習過程中的概念與方法生搬硬套到嵌入式系統的實踐中,忽視嵌入式系統與通用計算機的差異。
實際上,在嵌入式系統學習與實踐的初始階段,應該充分了解嵌入式系統的特點,根據自身的已有知識結構,制定適合自身情況的學習計劃。目標應該是打好嵌入式系統的硬體與軟體基礎,通過實踐,為成為良好的嵌入式系統設計師建立起基本知識結構。學習過程中,具體應用系統可為實踐載體,但不能拘泥於具體系統,應該有一定的抽象與歸納。
例如,初學者開發實際控制系統時沒有使用實時作業系統,但不要認為實時作業系統不需要學習。又例如,初學者可以一個帶有實時作業系統的樣例為藍本進行學習,但不要認為任何嵌入式系統都需要實時作業系統,甚至為一個十分簡明的實際系統加上不必要的實時作業系統。因此,片面認識嵌入式系統,可能導致學習困惑。應該根據實際項目需要,鍛鍊自己分析實際問題、解決問題的能力。這是一個長期的學習與實踐過程,不能期望通過短期培訓完成整體知識體系的建立,應該重視自身實踐,全面地理解嵌入式系統的知識體系。
2.4入門晶片選擇的困惑
嵌入式系統的大部分初學者需要選擇一個微控制器(MCU)進行入門級學習,面對眾多廠家生產的微控制器系列,往往不知如何是好。
首先是關於位數問題,目前主要有8位、16位和32位MCU。不同位數的MCU各有應用領域,這一點與通用微機有很大不同。例如做一個遙控器,不需要使用 32位MCU,否則MCU晶片價格就已經超過遙控器價格需求。對於首次接觸嵌入式系統的學習者,可以根據自己的知識基礎選擇入門晶片的位數。建議大多數初學者選擇8位MCU作為快速入門晶片,了解一些彙編與底層硬體知識,之後再選16位或32位晶片進行學習實踐。
關於晶片選擇的另一個誤區是認為有「主流芯片」存在,嵌入式系統也可以形成晶片壟斷。這完全是一種誤解,是套用通用計算機系統的思維模式,而忽視了嵌入式系統應用的多樣性。關於學習晶片選擇還有一個誤區,即誤認為選擇工作頻率高的晶片進行入門學習,更先進。實際上,工作頻率高可能給初學者帶來不少困難。