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

2021-06-27 22:12:49 字數 3921 閱讀 5598

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

特別鳴謝:嵌入式大神 @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等都會有它的介面,就像微控制器的io口、各種晶元的介面一樣,按照一些規則進行連線就可以了。

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

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

產品原型實現了,就可以進行批量生產了。批量生產又會涉及很多問題,例如元器件採購要考慮成本和**量,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核心剖析》這本書不錯。通常所說的嵌入式方向,不包括安卓應用程式的開發。

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

嵌入式基本概念

前後臺系統 對基於晶元的開發來說,應用程式一般是乙個無線迴圈,平時微處理器在停機狀態,所有事都靠中斷服務來完成,可稱為前後系統或超迴圈系統 作業系統 作業系統是計算機中最基本的程式。作業系統負責計算機系統中全部軟硬資源的分配與 控制與協調等併發的活動 作業系統提供使用者介面,使使用者獲得良好的工作環...

嵌入式基本概念

1.uboot 和 bootloader bootloader 引導程式,在嵌入式linux中,沒有bios,而是直接從flash中執行,來裝載核心。它可以初始化硬體裝置,從而將系統的軟硬體環境帶到乙個合適的狀態,以便為最終呼叫作業系統做好準備。uboot 是bootloader中的一種 2.nor...

嵌入式系統的基本概念

一 定義 定義1 嵌入式系統用來控制或監視機器 裝置 工廠等大規模系統的裝置。定義2 嵌入式系統是指以應用為中心,計算機技術為基礎,軟硬體可剪裁,適應應用系統對功能 可靠性 成本 體積 功耗嚴苛要求的專用計算機系統。二 發展史 1 積體電路 integrated circuit 把乙個電路中所需的電...