嵌入式科普:基本概念,設計流程,開發特點,如何學習

本文涉及的內容較多,個人知識水平有限,如有不當之處歡迎指正。

特別鳴謝:嵌入式大神 @tofulee ,@woshizmxin 對本文給出了一些很好的意見。

何爲嵌入式

嵌入式是一個比較模糊的概念,也沒有很準確的解釋,其實也沒必要一定找出個準確的解釋來,並不影響學習。

參考了網上的資料,根據我的認識,可以認爲嵌入式系統是一種完全嵌入到設備內部、解決特定問題的專用計算機。我們常用的電腦被認爲是通用計算機,能安裝各種軟件,從而解決各種不同問題;而嵌入式系統是專用計算機,只負責解決特定問題,例如控制洗衣機、控制路由器等;其軟件被稱爲固件,一般不會經常進行變動。

一般認爲智能手機也是嵌入式系統,但是現在手機功能越來越強大,可以裝各種軟件,和電腦之間的界限也比較模糊了。例如平板電腦,既可以當成電腦,又可以當成大屏幕手機……當然,沒必要過多的去糾結這些。

從上面的這個定義來看,單片機一般也屬於嵌入式系統。

典型嵌入式系統的設計流程

這裏舉一個使用ARM9的CPU和Linux操作系統的、典型的嵌入式系統的設計流程。整個設計過程有點組裝電腦的感覺,就是拼接各種模塊,包括軟件模塊和硬件模塊。

需要注意的是,嵌入式的範疇非常廣。這裏要舉的例子,作爲典型的嵌入式設備,也是近幾年很流行的智能硬件設備;其設計重點在軟件系統和硬件電路上,和IT類專業的關係非常密切。本文也是以這種典型的嵌入式設備爲主進行介紹的。

實際上還有很多不一樣的情況。例如一臺全自動洗衣機,智能化程度不高,運算量小,往往只需要簡單的單片機就可以控制,也不依賴操作系統,這時設計重點就放在了機電控制、力學、外觀等方面。

方案確定

現在要做一個產品,人臉識別的門鎖。人臉識別的算法實現,需要用到較高運算能力的器件。如果使用一臺常規電腦執行算法,並和門鎖連接,那樣成本太高,體積大,不實用,還很費電。這時最佳選擇就是使用嵌入式系統了。

硬件方面,根據算法的運算量和響應時間,可以選擇一款合適的CPU,例如三星的一款ARM9芯片;容量合適的存儲器,包括RAM、ROM芯片等;給它配備攝像頭負責獲取人臉圖像;電機之類的裝置負責開門;可能還有一些指示燈和控制按鈕;以及USB接口,用於連接電腦進行更多操作。確定硬件器件時,往往需要考慮很多因素,例如器件的體積,成本,批量製造時是否便於採購,是否易於使用,等等。

軟件方面,爲了開發方便,考慮直接使用Linux操作系統。Linux系統和Windows類似,但是Linux是開源的,可以看到源代碼,可以按需要修改。在Linux的基礎上,利用OpenCV圖形庫編寫應用程序,實現人臉錄入、識別等功能。

嵌入式軟件

Linux操作系統是開源的,可以找到它的源碼,按需修改。基於Linux的操作系統很多,例如電腦上用的Ubuntu,手機上的Android。

整體方案考慮好之後就有問題來了,產品方案已經確定,不需要顯示器、聲卡、網卡等硬件設備。如果把一個完整的Linux操作系統裝進去,上面就會有很多多餘的東西,不僅對有限的CPU配置來說浪費運算能力,而且浪費存儲空間,又費電。

Linux開源免費,可以按需要修改,帶來了巨大的好處。實際上只要把需要的設備驅動和Linux內核一起編譯就可以了(操作系統和常見的C語言編程一樣,也是從源碼編譯成可執行文件)。而顯卡、聲卡等設備驅動程序就不需要了。另外還有負責引導操作系統啓動的BootLoader程序,也可以直接用成品。

Linux的資源非常豐富,需要的攝像頭驅動程序往往都能找到,通常攝像頭的硬件廠商也會提供配套的驅動程序。有些情況下或許會有特殊需要,這個時候才需要有人專門負責給這個攝像頭寫驅動程序,也就是嵌入式驅動開發(這裏是從產品研發廠商的角度來考慮的。如果從攝像頭廠商的角度考慮,他們提供的攝像頭產品配套驅動程序,也是需要有人來寫的)。

針對挑選好的CPU等硬件的型號,配置好各種參數,將這些軟件模塊進行編譯,就成了經過裁剪的專用操作系統。在這個操作系統上開發好人臉識別程序(嵌入式應用軟件)。最後固件開發完成,下載進硬件中就可以了。

嵌入式硬件

硬件方面,首先是電路設計,一般各種硬件設備和芯片,例如攝像頭、CPU等都會有它的接口,就像單片機的IO口、各種芯片的接口一樣,按照一些規則進行連接就可以了。

然後是PCB的設計,根據電路設計PCB,PCB設計的過程中可能要考慮到佈線、產品外觀等問題(實際上還要設計產品外觀,可以利用3D打印技術;大概是工業設計什麼的,不太瞭解,也不細說)。

產品原型與量產

設計好以後,進行產品原型的製造,製造的量很少。例如外殼可以用3D打印實現,3D打印非常適合原型的製造,免除了模具設計等複雜的工藝;硬件電路方面,可以申請公司樣片,人工焊接到電路板上;然後燒寫固件並組裝產品。將軟硬件整合成產品原型進行測試,如果有問題則需要再修改設計,重複這些步驟。完成後,產品的研發階段就差不多了,也就是產品原型已經能用了。

產品原型實現了,就可以進行批量生產了。批量生產又會涉及很多問題,例如元器件採購要考慮成本和供應量,PCB、外殼的批量製造,焊接、裝配、包裝等。

嵌入式開發的特點與難點

還是以上面的典型嵌入式系統爲例,可以看出,嵌入式系統涉及的東西很多,從最底層的硬件電路,一直到上層的應用程序。通常說的嵌入式開發,最主要的就是軟硬件結合的部分;在其上是應用程序開發了,例如安卓App的開發,對於底層原理不需要有太多的瞭解;而在其下如PCB設計之類,一般認爲是純硬件,也不算嵌入式的內容了。

軟件方面,利用了很成熟的Linux操作系統,整個過程中大部分軟件模塊都有成品,只需要合理的選用,然後進行拼接、編譯就可以了。這些軟件模塊早就有人寫好了,往往不需要去寫,但是要能大致理解寫好的程序,並根據需要做一些小的修改調整。而對於一些特殊和極端情況,纔有必要對程序進行較大改動,甚至自行實現。很多時候就是在移植驅動和系統,程序方面常用成品,更多的是小規模的修改調整;寫程序相對少,難度較大,往往也沒必要重複發明輪子。看懂代碼最簡單,修改次之,自己寫最難。

嵌入式系統設計時,如果使用的都是現成的代碼,難點在哪呢?有大神給我解釋,嵌入式開發入門比較難,學着學着,發現很多現成的驅動都擺在那兒,而難題在於怎麼將這些驅動移植到系統中,怎麼去調試了。因爲調試的時候,涉及整個linux系統,非常龐大,要考慮的地方非常多,所以顯得比較難了。但是只要在繁雜的linux系統中找到問題所在了,往往就只需要修改那麼一兩個地方即可。另外,在設計一個系統時,需要考慮開支,技術難度等各種因素,選取合適的芯片、模塊,也比較難。

如何學習

嵌入式涉及的東西非常多,學起來也不容易。我本人只做過單片機系統設計,和學嵌入式的同學聊過一些,沒有具體的去學嵌入式,所以這裏簡單提一些看法。嵌入式方面我研究的不多,所以也沒辦法推薦太多的書籍,知道的就順便推薦下。

根據網上的招聘信息,嵌入式常分爲嵌入式硬件和嵌入式軟件兩個大的方向,硬件方向負責電路設計之類;嵌入式軟件常常是底層的驅動程序移植、開發之類;而嵌入式軟件再往上層一點,差不多就是操作系統之上的應用開發了。

首先C語言幾乎是嵌入式各種崗位必備的基礎知識,並且要求很高(很多公司給出的要求是精通)。在嵌入式的底層,C語言大量被使用,特別是多維指針、結構體等,還有很多上層C編程中不常用的知識,例如volatile關鍵字。另外C++在有些公司的招聘要求中也有提到,稍上層一點的編程可能會用C++。《The C Programming Language》《C++ Primer》這兩本書比較經典。

單片機作爲嵌入式的重要基礎,有必要學習一下,對於提高動手能力等也很有好處。微機原理也是基礎知識,學習單片機對於理解微機原理有幫助;彙編語言則是微機原理中的重點知識,在嵌入式最底層的程序中會用到。數字電路是微機原理的基礎,在單片機/嵌入式的硬件電路設計時,也會經常用到。如果做偏硬件方面,可能還需要一定的模擬電路和PCB設計知識。

Linux的操作也是一個很基礎的知識,嵌入式用Linux系統很多,編譯很多時候也是在Linux環境下進行的。由於嵌入式往往涉及操作系統,所以操作系統也有學習的必要。網絡方面的知識也經常會涉及。推薦書籍:《鳥哥的Linux私房菜》《現代操作系統》《計算機網絡》。

然後推薦一本韋東山的《嵌入式Linux應用開發完全手冊》,裏面涉及了嵌入式系統移植方方面面的知識。如果想學的再深入一些,可以去看嵌入式驅動開發,還有BootLoader、Linux的原理以及代碼實現等等。Linux操作系統非常龐大,能把裏面的原理都弄明白,需要很多的知識,也需要很長時間的積累。編程方面還可能涉及數據結構,設計模式等學科內容。嵌入式的編程一般是在Linux系統下進行的,所以熟悉Linux系統下的代碼編輯器、熟悉程序的編譯、工程的管理、Makefile的編寫等也很必要。

Android作爲一個新興的優秀開源嵌入式系統,也在越來越多的被用到,安卓智能手機的設計也少不了嵌入式方面的研發工作。例如有安卓內核與驅動開發方面的崗位;專門的安卓ROM移植工程師,負責安卓系統的定製移植等工作。《Android內核剖析》這本書不錯。通常所說的嵌入式方向,不包括安卓應用程序的開發。

總得來說,嵌入式涉及的東西特別多,軟件、硬件都有,其中很多東西對理論要求倒也不高,但是不好理解。知識太多需要長期堅持和積累。初級的嵌入式工程師,主要是移植驅動和系統之類,看懂已有的程序,做一些小的調整;而高級的嵌入式工程師,則能對代碼進行大規模的調整,甚至自己寫代碼。這一點非常不容易,因爲嵌入式的程序往往很難寫,每一行代碼都可能包含了大量的背景知識(所以待遇肯定也不會差)。

本文由jzj1993原創,轉載請註明來源:http://www.hainter.com/embedded

發佈了124 篇原創文章 · 獲贊 142 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章