本文涉及的內(nèi)容較多,個(gè)人知識(shí)水平有限,如有不當(dāng)之處歡迎指正。
特別鳴謝:嵌入式大神 @tofulee?,@woshizmxin?對(duì)本文給出了一些很好的意見。
何為嵌入式 嵌入式是一個(gè)比較模糊的概念,也沒有很準(zhǔn)確的解釋,其實(shí)也沒必要一定找出個(gè)準(zhǔn)確的解釋來,并不影響學(xué)習(xí)。
參考了網(wǎng)上的資料,根據(jù)我的認(rèn)識(shí),可以認(rèn)為嵌入式系統(tǒng)是一種完全嵌入到設(shè)備內(nèi)部、解決特定問題的專用計(jì)算機(jī)。我們常用的電腦被認(rèn)為是通用計(jì)算機(jī),能安裝各種軟件,從而解決各種不同問題;而嵌入式系統(tǒng)是專用計(jì)算機(jī),只負(fù)責(zé)解決特定問題,例如控制洗衣機(jī)、控制路由器等;其軟件被稱為固件,一般不會(huì)經(jīng)常進(jìn)行變動(dòng)。
一般認(rèn)為智能手機(jī)也是嵌入式系統(tǒng),但是現(xiàn)在手機(jī)功能越來越強(qiáng)大,可以裝各種軟件,和電腦之間的界限也比較模糊了。例如平板電腦,既可以當(dāng)成電腦,又可以當(dāng)成大屏幕手機(jī)……當(dāng)然,沒必要過多的去糾結(jié)這些。
從上面的這個(gè)定義來看,單片機(jī)一般也屬于嵌入式系統(tǒng)。
典型嵌入式系統(tǒng)的設(shè)計(jì)流程 這里舉一個(gè)使用ARM9的CPU和Linux操作系統(tǒng)的、典型的嵌入式系統(tǒng)的設(shè)計(jì)流程。整個(gè)設(shè)計(jì)過程有點(diǎn)組裝電腦的感覺,就是拼接各種模塊,包括軟件模塊和硬件模塊。
需要注意的是,嵌入式的范疇非常廣。這里要舉的例子,作為典型的嵌入式設(shè)備,也是近幾年很流行的智能硬件設(shè)備;其設(shè)計(jì)重點(diǎn)在軟件系統(tǒng)和硬件電路上,和IT類專業(yè)的關(guān)系非常密切。本文也是以這種典型的嵌入式設(shè)備為主進(jìn)行介紹的。
實(shí)際上還有很多不一樣的情況。例如一臺(tái)全自動(dòng)洗衣機(jī),智能化程度不高,運(yùn)算量小,往往只需要簡(jiǎn)單的單片機(jī)就可以控制,也不依賴操作系統(tǒng),這時(shí)設(shè)計(jì)重點(diǎn)就放在了機(jī)電控制、力學(xué)、外觀等方面。
方案確定 現(xiàn)在要做一個(gè)產(chǎn)品,人臉識(shí)別的門鎖。人臉識(shí)別的算法實(shí)現(xiàn),需要用到較高運(yùn)算能力的器件。如果使用一臺(tái)常規(guī)電腦執(zhí)行算法,并和門鎖連接,那樣成本太高,體積大,不實(shí)用,還很費(fèi)電。這時(shí)最佳選擇就是使用嵌入式系統(tǒng)了。
硬件方面,根據(jù)算法的運(yùn)算量和響應(yīng)時(shí)間,可以選擇一款合適的CPU,例如三星的一款A(yù)RM9芯片;容量合適的存儲(chǔ)器,包括RAM、ROM芯片等;給它配備攝像頭負(fù)責(zé)獲取人臉圖像;電機(jī)之類的裝置負(fù)責(zé)開門;可能還有一些指示燈和控制按鈕;以及USB接口,用于連接電腦進(jìn)行更多操作。確定硬件器件時(shí),往往需要考慮很多因素,例如器件的體積,成本,批量制造時(shí)是否便于采購,是否易于使用,等等。
軟件方面,為了開發(fā)方便,考慮直接使用Linux操作系統(tǒng)。Linux系統(tǒng)和Windows類似,但是Linux是開源的,可以看到源代碼,可以按需要修改。在Linux的基礎(chǔ)上,利用OpenCV圖形庫編寫應(yīng)用程序,實(shí)現(xiàn)人臉錄入、識(shí)別等功能。
嵌入式軟件 Linux操作系統(tǒng)是開源的,可以找到它的源碼,按需修改?;贚inux的操作系統(tǒng)很多,例如電腦上用的Ubuntu,手機(jī)上的Android。
整體方案考慮好之后就有問題來了,產(chǎn)品方案已經(jīng)確定,不需要顯示器、聲卡、網(wǎng)卡等硬件設(shè)備。如果把一個(gè)完整的Linux操作系統(tǒng)裝進(jìn)去,上面就會(huì)有很多多余的東西,不僅對(duì)有限的CPU配置來說浪費(fèi)運(yùn)算能力,而且浪費(fèi)存儲(chǔ)空間,又費(fèi)電。
Linux開源免費(fèi),可以按需要修改,帶來了巨大的好處。實(shí)際上只要把需要的設(shè)備驅(qū)動(dòng)和Linux內(nèi)核一起編譯就可以了(操作系統(tǒng)和常見的C語言編程一樣,也是從源碼編譯成可執(zhí)行文件)。而顯卡、聲卡等設(shè)備驅(qū)動(dòng)程序就不需要了。另外還有負(fù)責(zé)引導(dǎo)操作系統(tǒng)啟動(dòng)的BootLoader程序,也可以直接用成品。
Linux的資源非常豐富,需要的攝像頭驅(qū)動(dòng)程序往往都能找到,通常攝像頭的硬件廠商也會(huì)提供配套的驅(qū)動(dòng)程序。有些情況下或許會(huì)有特殊需要,這個(gè)時(shí)候才需要有人專門負(fù)責(zé)給這個(gè)攝像頭寫驅(qū)動(dòng)程序,也就是嵌入式驅(qū)動(dòng)開發(fā)(這里是從產(chǎn)品研發(fā)廠商的角度來考慮的。如果從攝像頭廠商的角度考慮,他們提供的攝像頭產(chǎn)品配套驅(qū)動(dòng)程序,也是需要有人來寫的)。
針對(duì)挑選好的CPU等硬件的型號(hào),配置好各種參數(shù),將這些軟件模塊進(jìn)行編譯,就成了經(jīng)過裁剪的專用操作系統(tǒng)。在這個(gè)操作系統(tǒng)上開發(fā)好人臉識(shí)別程序(嵌入式應(yīng)用軟件)。最后固件開發(fā)完成,下載進(jìn)硬件中就可以了。
嵌入式硬件 硬件方面,首先是電路設(shè)計(jì),一般各種硬件設(shè)備和芯片,例如攝像頭、CPU等都會(huì)有它的接口,就像單片機(jī)的IO口、各種芯片的接口一樣,按照一些規(guī)則進(jìn)行連接就可以了。
然后是PCB的設(shè)計(jì),根據(jù)電路設(shè)計(jì)PCB,PCB設(shè)計(jì)的過程中可能要考慮到布線、產(chǎn)品外觀等問題(實(shí)際上還要設(shè)計(jì)產(chǎn)品外觀,可以利用3D打印技術(shù);大概是工業(yè)設(shè)計(jì)什么的,不太了解,也不細(xì)說)。
產(chǎn)品原型與量產(chǎn) 設(shè)計(jì)好以后,進(jìn)行產(chǎn)品原型的制造,制造的量很少。例如外殼可以用3D打印實(shí)現(xiàn),3D打印非常適合原型的制造,免除了模具設(shè)計(jì)等復(fù)雜的工藝;硬件電路方面,可以申請(qǐng)公司樣片,人工焊接到電路板上;然后燒寫固件并組裝產(chǎn)品。將軟硬件整合成產(chǎn)品原型進(jìn)行測(cè)試,如果有問題則需要再修改設(shè)計(jì),重復(fù)這些步驟。完成后,產(chǎn)品的研發(fā)階段就差不多了,也就是產(chǎn)品原型已經(jīng)能用了。
產(chǎn)品原型實(shí)現(xiàn)了,就可以進(jìn)行批量生產(chǎn)了。批量生產(chǎn)又會(huì)涉及很多問題,例如元器件采購要考慮成本和供應(yīng)量,PCB、外殼的批量制造,焊接、裝配、包裝等。
嵌入式開發(fā)的特點(diǎn)與難點(diǎn) 還是以上面的典型嵌入式系統(tǒng)為例,可以看出,嵌入式系統(tǒng)涉及的東西很多,從最底層的硬件電路,一直到上層的應(yīng)用程序。通常說的嵌入式開發(fā),最主要的就是軟硬件結(jié)合的部分;在其上是應(yīng)用程序開發(fā)了,例如安卓App的開發(fā),對(duì)于底層原理不需要有太多的了解;而在其下如PCB設(shè)計(jì)之類,一般認(rèn)為是純硬件,也不算嵌入式的內(nèi)容了。
軟件方面,利用了很成熟的Linux操作系統(tǒng),整個(gè)過程中大部分軟件模塊都有成品,只需要合理的選用,然后進(jìn)行拼接、編譯就可以了。這些軟件模塊早就有人寫好了,往往不需要去寫,但是要能大致理解寫好的程序,并根據(jù)需要做一些小的修改調(diào)整。而對(duì)于一些特殊和極端情況,才有必要對(duì)程序進(jìn)行較大改動(dòng),甚至自行實(shí)現(xiàn)。很多時(shí)候就是在移植驅(qū)動(dòng)和系統(tǒng),程序方面常用成品,更多的是小規(guī)模的修改調(diào)整;寫程序相對(duì)少,難度較大,往往也沒必要重復(fù)發(fā)明輪子。看懂代碼最簡(jiǎn)單,修改次之,自己寫最難。
嵌入式系統(tǒng)設(shè)計(jì)時(shí),如果使用的都是現(xiàn)成的代碼,難點(diǎn)在哪呢?有大神給我解釋,嵌入式開發(fā)入門比較難,學(xué)著學(xué)著,發(fā)現(xiàn)很多現(xiàn)成的驅(qū)動(dòng)都擺在那兒,而難題在于怎么將這些驅(qū)動(dòng)移植到系統(tǒng)中,怎么去調(diào)試了。因?yàn)檎{(diào)試的時(shí)候,涉及整個(gè)linux系統(tǒng),非常龐大,要考慮的地方非常多,所以顯得比較難了。但是只要在繁雜的linux系統(tǒng)中找到問題所在了,往往就只需要修改那么一兩個(gè)地方即可。另外,在設(shè)計(jì)一個(gè)系統(tǒng)時(shí),需要考慮開支,技術(shù)難度等各種因素,選取合適的芯片、模塊,也比較難。
如何學(xué)習(xí) 嵌入式涉及的東西非常多,學(xué)起來也不容易。我本人只做過單片機(jī)系統(tǒng)設(shè)計(jì),和學(xué)嵌入式的同學(xué)聊過一些,沒有具體的去學(xué)嵌入式,所以這里簡(jiǎn)單提一些看法。嵌入式方面我研究的不多,所以也沒辦法推薦太多的書籍,知道的就順便推薦下。
根據(jù)網(wǎng)上的招聘信息,嵌入式常分為嵌入式硬件和嵌入式軟件兩個(gè)大的方向,硬件方向負(fù)責(zé)電路設(shè)計(jì)之類;嵌入式軟件常常是底層的驅(qū)動(dòng)程序移植、開發(fā)之類;而嵌入式軟件再往上層一點(diǎn),差不多就是操作系統(tǒng)之上的應(yīng)用開發(fā)了。
首先C語言幾乎是嵌入式各種崗位必備的基礎(chǔ)知識(shí),并且要求很高(很多公司給出的要求是精通)。在嵌入式的底層,C語言大量被使用,特別是多維指針、結(jié)構(gòu)體等,還有很多上層C編程中不常用的知識(shí),例如volatile關(guān)鍵字。另外C++在有些公司的招聘要求中也有提到,稍上層一點(diǎn)的編程可能會(huì)用C++。《The C Programming Language》《C++ Primer》這兩本書比較經(jīng)典。
單片機(jī)作為嵌入式的重要基礎(chǔ),有必要學(xué)習(xí)一下,對(duì)于提高動(dòng)手能力等也很有好處。微機(jī)原理也是基礎(chǔ)知識(shí),學(xué)習(xí)單片機(jī)對(duì)于理解微機(jī)原理有幫助;匯編語言則是微機(jī)原理中的重點(diǎn)知識(shí),在嵌入式最底層的程序中會(huì)用到。數(shù)字電路是微機(jī)原理的基礎(chǔ),在單片機(jī)/嵌入式的硬件電路設(shè)計(jì)時(shí),也會(huì)經(jīng)常用到。如果做偏硬件方面,可能還需要一定的模擬電路和PCB設(shè)計(jì)知識(shí)。
Linux的操作也是一個(gè)很基礎(chǔ)的知識(shí),嵌入式用Linux系統(tǒng)很多,編譯很多時(shí)候也是在Linux環(huán)境下進(jìn)行的。由于嵌入式往往涉及操作系統(tǒng),所以操作系統(tǒng)也有學(xué)習(xí)的必要。網(wǎng)絡(luò)方面的知識(shí)也經(jīng)常會(huì)涉及。推薦書籍:《鳥哥的Linux私房菜》《現(xiàn)代操作系統(tǒng)》《計(jì)算機(jī)網(wǎng)絡(luò)》。
然后推薦一本韋東山的《嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)》,里面涉及了嵌入式系統(tǒng)移植方方面面的知識(shí)。如果想學(xué)的再深入一些,可以去看嵌入式驅(qū)動(dòng)開發(fā),還有BootLoader、Linux的原理以及代碼實(shí)現(xiàn)等等。Linux操作系統(tǒng)非常龐大,能把里面的原理都弄明白,需要很多的知識(shí),也需要很長(zhǎng)時(shí)間的積累。編程方面還可能涉及數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)模式等學(xué)科內(nèi)容。嵌入式的編程一般是在Linux系統(tǒng)下進(jìn)行的,所以熟悉Linux系統(tǒng)下的代碼編輯器、熟悉程序的編譯、工程的管理、Makefile的編寫等也很必要。
Android作為一個(gè)新興的優(yōu)秀開源嵌入式系統(tǒng),也在越來越多的被用到,安卓智能手機(jī)的設(shè)計(jì)也少不了嵌入式方面的研發(fā)工作。例如有安卓?jī)?nèi)核與驅(qū)動(dòng)開發(fā)方面的崗位;專門的安卓ROM移植工程師,負(fù)責(zé)安卓系統(tǒng)的定制移植等工作?!禔ndroid內(nèi)核剖析》這本書不錯(cuò)。通常所說的嵌入式方向,不包括安卓應(yīng)用程序的開發(fā)。
總得來說,嵌入式涉及的東西特別多,軟件、硬件都有,其中很多東西對(duì)理論要求倒也不高,但是不好理解。知識(shí)太多需要長(zhǎng)期堅(jiān)持和積累。初級(jí)的嵌入式工程師,主要是移植驅(qū)動(dòng)和系統(tǒng)之類,看懂已有的程序,做一些小的調(diào)整;而高級(jí)的嵌入式工程師,則能對(duì)代碼進(jìn)行大規(guī)模的調(diào)整,甚至自己寫代碼。這一點(diǎn)非常不容易,因?yàn)榍度胧降某绦蛲茈y寫,每一行代碼都可能包含了大量的背景知識(shí)(所以待遇肯定也不會(huì)差)。
本文由jzj1993原創(chuàng),轉(zhuǎn)載請(qǐng)注明來源:http://www.hainter.com/embedded
總結(jié)
以上是生活随笔 為你收集整理的嵌入式科普:基本概念,设计流程,开发特点,如何学习 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。