— 作者 謝恩銘 轉(zhuǎn)載請(qǐng)注明出處
##嵌入式可以說(shuō)是目前涵蓋面最廣、最火的職業(yè)之一
幾天前,在微信里經(jīng)人介紹新認(rèn)識(shí)了一位朋友,是在法國(guó)的學(xué)生,目前在找實(shí)習(xí),學(xué)嵌入式和工業(yè)信息的。加了好友之后回復(fù)了一些問(wèn)題。
因?yàn)槲沂乔度胧杰浖?zhuān)業(yè)的, 目前的工作是Android嵌入式和app開(kāi)發(fā)。以前也有人專(zhuān)門(mén)發(fā)郵件問(wèn)過(guò)我關(guān)于嵌入式學(xué)習(xí)的問(wèn)題。
我覺(jué)得把這些回復(fù)整合起來(lái),也許對(duì)大家有那么一點(diǎn)點(diǎn)用,就寫(xiě)出來(lái)看看。
不過(guò)我自己還很不夠呢,還望讀者不吝賜教和補(bǔ)充指正,彼此學(xué)習(xí)~
##什么是嵌入式?
這個(gè)問(wèn)題三言?xún)烧Z(yǔ)還真說(shuō)不清楚。
因?yàn)槭紫?,嵌入式有不少組合名詞,例如嵌入式系統(tǒng),嵌入式軟件,Linux嵌入式,Android嵌入式,嵌入式Web,等等。
通常對(duì)嵌入式的定義其實(shí)是對(duì)\”嵌入式系統(tǒng)\”的定義。
網(wǎng)上對(duì)嵌入式系統(tǒng)的中文定義實(shí)在是不好理解,比較官方的中文定義是:
嵌入式系統(tǒng)是:以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗等嚴(yán)格要求的專(zhuān)用計(jì)算機(jī)系統(tǒng)。
我個(gè)人感覺(jué):
如果是從來(lái)沒(méi)接觸過(guò)嵌入式的朋友,看了上面這段定義,估計(jì)跟沒(méi)看差不多,還是一頭霧水。當(dāng)年我剛開(kāi)始學(xué)習(xí)嵌入式時(shí)看到這段解釋也是這般感受。
當(dāng)然了,這段定義是正確的,不過(guò)就是有點(diǎn)學(xué)究味,不夠形象, 不夠\”接地氣\”。
那么如何來(lái)給嵌入式系統(tǒng)一個(gè)接地氣的定義呢?
我可以先列舉目前用到嵌入式系統(tǒng)的IT領(lǐng)域:
-
Android嵌入式開(kāi)發(fā)。
Linux嵌入式開(kāi)發(fā)。
智能手機(jī),平板,智能手表。
可穿戴設(shè)備,例如Google眼鏡,小米手環(huán)。
微軟的Xbox和Kinect。
無(wú)人機(jī)。
VR頭盔。
無(wú)線(xiàn)路由器。
還有很多~
我想不必再列舉也已經(jīng)感覺(jué)到了吧 : 是的,嵌入式正在滲透到我們生活的方方面面, 而且會(huì)越來(lái)越多地被使用。
但是, 例如Android, iOS純app開(kāi)發(fā)的話(huà)一般就不能算是嵌入式了吧, 只能算軟件開(kāi)發(fā)。
未來(lái),也許我們可以有一身輕便的可穿戴設(shè)備,衣食住行都用得到。甚至未來(lái)可以穿一身輕薄的\”飛行衣\”, 想去哪都行。
嵌入式編程,最近幾年越來(lái)越火,雖然入門(mén)門(mén)檻比較高,但是學(xué)好了薪資水平不錯(cuò)哦。例如Linux嵌入式的高級(jí)工程師。
而且如果你能啃下嵌入式這個(gè)\”硬柿子\”, 學(xué)了很多方面的知識(shí), 那么其他一些編程領(lǐng)域, 也許就能比較輕松地掌握了。就好比你如果熟練掌握了C語(yǔ)言和C , 那么其他一些編程語(yǔ)言一般都可以輕松駕馭了。
我覺(jué)得原版英語(yǔ)的定義應(yīng)該會(huì)更便于理解,因此我將維基百科上對(duì)嵌入式系統(tǒng)的定義翻譯如下 (不才, 若翻譯有誤請(qǐng)補(bǔ)充指正):
An embedded system is a computer system with a dedicated function within a larger mechanical or electrical system, often with real-time computing constraints. It is embedded as part of a complete device often including hardware and mechanical parts. Embedded systems control many devices in common use today. Ninety-eight percent of all microprocessors are manufactured as components of embedded systems.
嵌入式系統(tǒng)首先是一個(gè)具備特定功用的計(jì)算機(jī)系統(tǒng), 是包含在更大的機(jī)械或電子系統(tǒng)里面的, 通常有實(shí)時(shí)的計(jì)算約束。嵌入式系統(tǒng)作為一個(gè)部件被嵌入在一個(gè)完整的設(shè)備里(小編補(bǔ)充: 這也是\”嵌入式\”的名字由來(lái)), 這個(gè)設(shè)備通常有硬件和機(jī)械的部分。當(dāng)今時(shí)代, 嵌入式系統(tǒng)控制了很多通用設(shè)備。98%的微處理器被生產(chǎn)用來(lái)作為嵌入式系統(tǒng)的部件。
Examples of properties of typically embedded computers when compared with general-purpose counterparts are low power consumption, small size, rugged operating ranges, and low per-unit cost. This comes at the price of limited processing resources, which make them significantly more difficult to program and to interact with.
嵌入式系統(tǒng)和通常的系統(tǒng)有區(qū)別, 主要體現(xiàn)在以下特性 :
低能耗
小尺寸
受限的計(jì)算范圍
單元成本較低
這些特性是以有限的處理資源為代價(jià)的,使得嵌入式系統(tǒng)更難以編程和交互。
Modern embedded systems are often based on microcontrollers (i.e. CPUs with integrated memory or peripheral interfaces), but ordinary microprocessors (using external chips for memory and peripheral interface circuits) are also common, especially in more-complex systems. In either case, the processor(s) used may be types ranging from general purpose to those specialised in certain class of computations, or even custom designed for the application at hand. A common standard class of dedicated processors is the digital signal processor (DSP).
現(xiàn)代嵌入式系統(tǒng)通?;谖⒖刂破鳎淳哂屑蓛?nèi)存或外圍接口的CPU(中央處理器)),但是普通微處理器(使用用于存儲(chǔ)器和外圍接口電路的外部芯片)也是常見(jiàn)的,特別是在更復(fù)雜的系統(tǒng)中。 在任一情況下,所使用的處理器可以是從通用的到專(zhuān)門(mén)用于某些計(jì)算類(lèi)別的那些類(lèi)型,或者甚至是針對(duì)當(dāng)前應(yīng)用而定制的類(lèi)型。 數(shù)字信號(hào)處理器(DSP)就是一種通用標(biāo)準(zhǔn)類(lèi)別的專(zhuān)用處理器。
Since the embedded system is dedicated to specific tasks, design engineers can optimize it to reduce the size and cost of the product and increase the reliability and performance.
由于嵌入式系統(tǒng)專(zhuān)用于特定任務(wù),設(shè)計(jì)工程師可以對(duì)其進(jìn)行優(yōu)化,以減小產(chǎn)品的尺寸和成本,并提高可靠性和性能。
Embedded systems range from portable devices such as digital watches and MP3 players, to large stationary installations like traffic lights, factory controllers, and largely complex systems like hybrid vehicles and avionics. Complexity varies from low, with a single microcontroller chip, to very high with multiple units, peripherals and networks mounted inside a large chassis.
嵌入式系統(tǒng)存在于當(dāng)今的很多設(shè)備里, 小到數(shù)碼手表, mp3播放器, 大到交通燈, 工業(yè)控制器, 混合汽車(chē), 航空航天設(shè)備。嵌入式系統(tǒng)的復(fù)雜性也千差萬(wàn)別, 簡(jiǎn)單的嵌入式系統(tǒng)可能只有一個(gè)微控制器芯片 ; 復(fù)雜的則有很多個(gè)計(jì)算單元, 外設(shè), 網(wǎng)絡(luò), 這些都被\”鑲焊\”在一個(gè)大\”底板\”上。
在嵌入式編程中還有一個(gè)交叉編譯的概念: 什么是交叉編譯呢?
簡(jiǎn)單來(lái)說(shuō), 就是\”在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼\”。
普通的軟件開(kāi)發(fā)過(guò)程中, 如果是編譯型的編程語(yǔ)言, 例如C語(yǔ)言, C , Java, 等等, 你想要運(yùn)行你寫(xiě)的程序, 需要用編譯器將代碼編譯成可執(zhí)行程序 (當(dāng)然, 中間還有幾個(gè)步驟, 比如匯編, 鏈接, 在此就不提了)。
但是嵌入式系統(tǒng)的計(jì)算能力有限, 內(nèi)存有限, 儲(chǔ)存空間有限, 因此無(wú)法完成比較需要資源和速度的編譯過(guò)程。
比如在A(yíng)ndroid嵌入式開(kāi)發(fā)中, 你不可能在A(yíng)ndroid手機(jī)里直接讓它編譯自己的系統(tǒng)或軟件吧 (臣妾做不到啊)。
因此, 我們會(huì)先在普通電腦(比Android手機(jī)的計(jì)算能力更強(qiáng), 內(nèi)存更大, 儲(chǔ)存空間更大) 里將程序編譯 (需要不同于我們編譯普通軟件的編譯器, 稱(chēng)為\”交叉編譯器/軟件\”, 比較常見(jiàn)的有arm-linux-gcc一族) 成適配Android手機(jī)的特定可執(zhí)行文件(一般會(huì)打包成鏡像文件), 然后通過(guò)專(zhuān)門(mén)的工具\(yùn)”燒錄\”到Android手機(jī)里。
相信經(jīng)過(guò)這些解釋, 大家對(duì)嵌入式有了一個(gè)初步的了解了吧。
但是光看這些解釋是不可能了然于胸的, 還必須要學(xué)習(xí), 在實(shí)踐當(dāng)中你就會(huì)更深入理解嵌入式編程是什么了。
##入門(mén)和提高嵌入式
現(xiàn)代這個(gè)匆忙時(shí)代, 假如你不好好利用網(wǎng)上那么多的優(yōu)秀資源(大多數(shù)是免費(fèi)的)來(lái)自學(xué)的話(huà), 就有點(diǎn)虧了。
如果花大錢(qián)去讀培訓(xùn)班,就更虧了(假如沒(méi)有自制的能力,去了培訓(xùn)機(jī)構(gòu)基本也是\”浪費(fèi)\”)。
-
嵌入式軟件的話(huà)不一定需要學(xué)很多硬件知識(shí)的(有的話(huà)當(dāng)然是多多益善)。
會(huì)用一些燒寫(xiě)工具,編譯,調(diào)試工具(比如JTAG)就可以了,到時(shí)候要用了現(xiàn)學(xué)。
開(kāi)發(fā)工具也沒(méi)什么固定的,一般也不一定要IDE,用文本編輯器就可以寫(xiě)代碼(比如Vim,Emacs, nano, Sublime)了。
編譯一般用GCC的變種。
嵌入式一般要學(xué)C語(yǔ)言(去看看我的C語(yǔ)言探索之旅, 以及C語(yǔ)言深度解剖,C程序設(shè)計(jì)語(yǔ)言這兩本書(shū)。
也可以繼續(xù)深入看C語(yǔ)言專(zhuān)家編程等等)。
C 不一定會(huì)用到, 但也可以學(xué)一下。
Linux是要學(xué)習(xí)的。因?yàn)榻徊婢幾g經(jīng)常要用到Linux系統(tǒng),即使在Windows下也要用到Cygwin這類(lèi)的。
可以看小編的Linux探索之旅入門(mén),當(dāng)然要更深入提高須要看來(lái)自臺(tái)灣的鳥(niǎo)哥的鳥(niǎo)哥的Linux私房菜 。
可以逛逛中國(guó)Linux公社 。
看Unix環(huán)境高級(jí)編程這本書(shū)。
豬哥的嵌入式Linux公房菜還行,我沒(méi)看完,感覺(jué)有點(diǎn)亂(當(dāng)然作者比我厲害多了),沒(méi)有鳥(niǎo)哥的文筆那么流暢清晰。
最好花點(diǎn)時(shí)間學(xué)一下匯編,對(duì)理解計(jì)算機(jī)的原理,特別是內(nèi)存,指針,二進(jìn)制,十六進(jìn)制都有很好幫助,不需要學(xué)很深。
推薦王爽老師的匯編語(yǔ)言一書(shū), 是入門(mén)絕佳教材。
嵌入式目前主流的處理器架構(gòu)是ARM(以前是ARM7,ARM9,ARM11,現(xiàn)在都Cortex系列了)。手機(jī),平板,大部分開(kāi)發(fā)板都是ARM的天下。所以需要學(xué)一下ARM架構(gòu),有個(gè)了解。
一開(kāi)始對(duì)ARM不需要太深入,視以后情況而定。ARM的集成開(kāi)發(fā)環(huán)境有ADS(ARM Developer Suite), 是ARM處理器下主要的開(kāi)發(fā)工具。
可以去買(mǎi)一塊便宜的開(kāi)發(fā)板來(lái)開(kāi)始學(xué)習(xí)(我覺(jué)得自學(xué)嵌入式唯一比較花錢(qián)之處。也就幾百元就很好了),現(xiàn)在什么樹(shù)莓派(https://www.raspberrypi.org/ ; http://www.raspberrypi.com.tw/ )有點(diǎn)貴,Arduino什么也可以。
也可以買(mǎi)國(guó)內(nèi)一些廠(chǎng)商自己的開(kāi)發(fā)板,不要買(mǎi)太差的就行。
如果你買(mǎi)了開(kāi)發(fā)板的話(huà),可以去開(kāi)發(fā)板對(duì)應(yīng)的論壇。
比如我以前2011年買(mǎi)的是天嵌的TQ2440(現(xiàn)在早就升級(jí)到不知道什么了吧,天嵌的論壇有很多不錯(cuò)的資料。
還有參加法國(guó)2012嵌入式Linux競(jìng)賽獲得的一塊Mini2440(德國(guó)的友善之臂FriendlyArm,論壇可以去看看。中文論壇是http://www.arm9home.net/ )。
國(guó)嵌的論壇。
嵌入式Linux論壇。
華清遠(yuǎn)見(jiàn)的論壇。
電子工程世界論壇。
當(dāng)然了國(guó)內(nèi)最大的IT社區(qū)CSDN的論壇和博客也都是不錯(cuò)的學(xué)習(xí)區(qū),51CTO也不錯(cuò),ChinaUnix也不錯(cuò)。
實(shí)驗(yàn)樓有很好的在線(xiàn)實(shí)驗(yàn)環(huán)境,使用的實(shí)驗(yàn)環(huán)境是Ubuntu這個(gè)Linux發(fā)行版。
把英語(yǔ)學(xué)好,對(duì)編程很有裨益。所以千萬(wàn)不要荒廢英語(yǔ)。
還有, 數(shù)學(xué)也需要還過(guò)得去吧, 畢竟底層有很多位移, 與或非運(yùn)算, 十六進(jìn)制, 二進(jìn)制, 十進(jìn)制轉(zhuǎn)換, 等等。
可以參看我的這篇文章: 對(duì)于程序員, 為什么英語(yǔ)比數(shù)學(xué)更重要? 如何學(xué)習(xí)
可以看的書(shū)很多,主要要選好書(shū),看得有效率。
最好買(mǎi)紙質(zhì)版的, 當(dāng)然我當(dāng)年自學(xué)時(shí), 因?yàn)槭窃诜▏?guó), 買(mǎi)國(guó)內(nèi)的書(shū)不方便, 因此都是看的PDF。
深入理解計(jì)算機(jī)系統(tǒng)非常好,算是入門(mén)的。其他也有很多嵌入式書(shū)籍。慢慢來(lái),先把基礎(chǔ)打好了。
嵌入式這個(gè)領(lǐng)域太廣了,可以學(xué)的東西太多,現(xiàn)在技術(shù)又日新月異,把基礎(chǔ)打好學(xué)什么新知識(shí)都快。
有一本Orange\’S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)的書(shū)很推薦,跟著作者一步步寫(xiě)自己的操作系統(tǒng),帥到掉渣,熱血沸騰。
假如你以后學(xué)更有難度的嵌入式實(shí)時(shí)(Real Time)系統(tǒng)(VxWorks,ecos,ucos,等等。驅(qū)動(dòng)開(kāi)發(fā)之類(lèi)的,那就要C(和匯編)的功底比較強(qiáng),要看更深入的書(shū)。不過(guò)暫時(shí)先入門(mén)嵌入式,這些更艱深的領(lǐng)域看興趣,不學(xué)也可以。
需要什么編程書(shū)的PDF可以來(lái)加入程序員聯(lián)盟(我一路以來(lái)在電腦里收集了很多編程的PDF,很多都上傳到了程序員聯(lián)盟的QQ群文件,還有程序員聯(lián)盟的百度云盤(pán)(2T容量)中)。
至于程序員聯(lián)盟的信息, 在我的個(gè)人信息里。
不要害怕, 當(dāng)年我也是從對(duì)嵌入式一竅不通努力自學(xué), 到現(xiàn)在只\”通了一竅\”的。
自學(xué), 從來(lái)沒(méi)有像現(xiàn)在這個(gè)時(shí)代這般容易。
所以, 站在這么多巨人(網(wǎng)上有很多大牛的博客)的肩膀上, 你還怕入門(mén)不了嗎?
少年, 你離成功只差逼一下自己。
暫時(shí)只想到這么多,有些點(diǎn)可能沒(méi)談到。希望不要誤導(dǎo)。
有什么問(wèn)題歡迎在留言區(qū)交流, 指教。
聲明: 文章中提到的公司或產(chǎn)品, 絕無(wú)廣告之意。
我是謝恩銘,在法國(guó)巴黎奮斗的嵌入式軟件工程師。
目前工作是Android嵌入式和app開(kāi)發(fā)。
熱愛(ài)生活, 喜歡游泳,略懂烹飪。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀(guān)點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。