什么是嵌入式編程?如何入門和提高?(嵌入式編程是什么意思)
— 作者 謝恩銘 轉(zhuǎn)載請注明出處
##嵌入式可以說是目前涵蓋面最廣、最火的職業(yè)之一
幾天前,在微信里經(jīng)人介紹新認(rèn)識了一位朋友,是在法國的學(xué)生,目前在找實習(xí),學(xué)嵌入式和工業(yè)信息的。加了好友之后回復(fù)了一些問題。
因為我是嵌入式軟件專業(yè)的, 目前的工作是Android嵌入式和app開發(fā)。以前也有人專門發(fā)郵件問過我關(guān)于嵌入式學(xué)習(xí)的問題。
我覺得把這些回復(fù)整合起來,也許對大家有那么一點點用,就寫出來看看。
不過我自己還很不夠呢,還望讀者不吝賜教和補(bǔ)充指正,彼此學(xué)習(xí)~
##什么是嵌入式?
這個問題三言兩語還真說不清楚。
因為首先,嵌入式有不少組合名詞,例如嵌入式系統(tǒng),嵌入式軟件,Linux嵌入式,Android嵌入式,嵌入式Web,等等。
通常對嵌入式的定義其實是對\”嵌入式系統(tǒng)\”的定義。
網(wǎng)上對嵌入式系統(tǒng)的中文定義實在是不好理解,比較官方的中文定義是:
嵌入式系統(tǒng)是:以應(yīng)用為中心,以計算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗等嚴(yán)格要求的專用計算機(jī)系統(tǒng)。
我個人感覺:
如果是從來沒接觸過嵌入式的朋友,看了上面這段定義,估計跟沒看差不多,還是一頭霧水。當(dāng)年我剛開始學(xué)習(xí)嵌入式時看到這段解釋也是這般感受。
當(dāng)然了,這段定義是正確的,不過就是有點學(xué)究味,不夠形象, 不夠\”接地氣\”。
那么如何來給嵌入式系統(tǒng)一個接地氣的定義呢?
我可以先列舉目前用到嵌入式系統(tǒng)的IT領(lǐng)域:
-
Android嵌入式開發(fā)。
Linux嵌入式開發(fā)。
智能手機(jī),平板,智能手表。
可穿戴設(shè)備,例如Google眼鏡,小米手環(huán)。
微軟的Xbox和Kinect。
無人機(jī)。
VR頭盔。
無線路由器。
還有很多~
我想不必再列舉也已經(jīng)感覺到了吧 : 是的,嵌入式正在滲透到我們生活的方方面面, 而且會越來越多地被使用。
但是, 例如Android, iOS純app開發(fā)的話一般就不能算是嵌入式了吧, 只能算軟件開發(fā)。
未來,也許我們可以有一身輕便的可穿戴設(shè)備,衣食住行都用得到。甚至未來可以穿一身輕薄的\”飛行衣\”, 想去哪都行。
嵌入式編程,最近幾年越來越火,雖然入門門檻比較高,但是學(xué)好了薪資水平不錯哦。例如Linux嵌入式的高級工程師。
而且如果你能啃下嵌入式這個\”硬柿子\”, 學(xué)了很多方面的知識, 那么其他一些編程領(lǐng)域, 也許就能比較輕松地掌握了。就好比你如果熟練掌握了C語言和C , 那么其他一些編程語言一般都可以輕松駕馭了。
我覺得原版英語的定義應(yīng)該會更便于理解,因此我將維基百科上對嵌入式系統(tǒ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)首先是一個具備特定功用的計算機(jī)系統(tǒng), 是包含在更大的機(jī)械或電子系統(tǒng)里面的, 通常有實時的計算約束。嵌入式系統(tǒng)作為一個部件被嵌入在一個完整的設(shè)備里(小編補(bǔ)充: 這也是\”嵌入式\”的名字由來), 這個設(shè)備通常有硬件和機(jī)械的部分。當(dāng)今時代, 嵌入式系統(tǒng)控制了很多通用設(shè)備。98%的微處理器被生產(chǎn)用來作為嵌入式系統(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)在以下特性 :
低能耗
小尺寸
受限的計算范圍
單元成本較低
這些特性是以有限的處理資源為代價的,使得嵌入式系統(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(中央處理器)),但是普通微處理器(使用用于存儲器和外圍接口電路的外部芯片)也是常見的,特別是在更復(fù)雜的系統(tǒng)中。 在任一情況下,所使用的處理器可以是從通用的到專門用于某些計算類別的那些類型,或者甚至是針對當(dāng)前應(yīng)用而定制的類型。 數(shù)字信號處理器(DSP)就是一種通用標(biāo)準(zhǔ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)專用于特定任務(wù),設(shè)計工程師可以對其進(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è)控制器, 混合汽車, 航空航天設(shè)備。嵌入式系統(tǒng)的復(fù)雜性也千差萬別, 簡單的嵌入式系統(tǒng)可能只有一個微控制器芯片 ; 復(fù)雜的則有很多個計算單元, 外設(shè), 網(wǎng)絡(luò), 這些都被\”鑲焊\”在一個大\”底板\”上。
在嵌入式編程中還有一個交叉編譯的概念: 什么是交叉編譯呢?
簡單來說, 就是\”在一個平臺上生成另一個平臺上的可執(zhí)行代碼\”。
普通的軟件開發(fā)過程中, 如果是編譯型的編程語言, 例如C語言, C , Java, 等等, 你想要運(yùn)行你寫的程序, 需要用編譯器將代碼編譯成可執(zhí)行程序 (當(dāng)然, 中間還有幾個步驟, 比如匯編, 鏈接, 在此就不提了)。
但是嵌入式系統(tǒng)的計算能力有限, 內(nèi)存有限, 儲存空間有限, 因此無法完成比較需要資源和速度的編譯過程。
比如在Android嵌入式開發(fā)中, 你不可能在Android手機(jī)里直接讓它編譯自己的系統(tǒng)或軟件吧 (臣妾做不到啊)。
因此, 我們會先在普通電腦(比Android手機(jī)的計算能力更強(qiáng), 內(nèi)存更大, 儲存空間更大) 里將程序編譯 (需要不同于我們編譯普通軟件的編譯器, 稱為\”交叉編譯器/軟件\”, 比較常見的有arm-linux-gcc一族) 成適配Android手機(jī)的特定可執(zhí)行文件(一般會打包成鏡像文件), 然后通過專門的工具\(yùn)”燒錄\”到Android手機(jī)里。
相信經(jīng)過這些解釋, 大家對嵌入式有了一個初步的了解了吧。
但是光看這些解釋是不可能了然于胸的, 還必須要學(xué)習(xí), 在實踐當(dāng)中你就會更深入理解嵌入式編程是什么了。
##入門和提高嵌入式
現(xiàn)代這個匆忙時代, 假如你不好好利用網(wǎng)上那么多的優(yōu)秀資源(大多數(shù)是免費(fèi)的)來自學(xué)的話, 就有點虧了。
如果花大錢去讀培訓(xùn)班,就更虧了(假如沒有自制的能力,去了培訓(xùn)機(jī)構(gòu)基本也是\”浪費(fèi)\”)。
-
嵌入式軟件的話不一定需要學(xué)很多硬件知識的(有的話當(dāng)然是多多益善)。
會用一些燒寫工具,編譯,調(diào)試工具(比如JTAG)就可以了,到時候要用了現(xiàn)學(xué)。
開發(fā)工具也沒什么固定的,一般也不一定要IDE,用文本編輯器就可以寫代碼(比如Vim,Emacs, nano, Sublime)了。
編譯一般用GCC的變種。
嵌入式一般要學(xué)C語言(去看看我的C語言探索之旅, 以及C語言深度解剖,C程序設(shè)計語言這兩本書。
也可以繼續(xù)深入看C語言專家編程等等)。
C 不一定會用到, 但也可以學(xué)一下。
Linux是要學(xué)習(xí)的。因為交叉編譯經(jīng)常要用到Linux系統(tǒng),即使在Windows下也要用到Cygwin這類的。
可以看小編的Linux探索之旅入門,當(dāng)然要更深入提高須要看來自臺灣的鳥哥的鳥哥的Linux私房菜 。
可以逛逛中國Linux公社 。
看Unix環(huán)境高級編程這本書。
豬哥的嵌入式Linux公房菜還行,我沒看完,感覺有點亂(當(dāng)然作者比我厲害多了),沒有鳥哥的文筆那么流暢清晰。
最好花點時間學(xué)一下匯編,對理解計算機(jī)的原理,特別是內(nèi)存,指針,二進(jìn)制,十六進(jìn)制都有很好幫助,不需要學(xué)很深。
推薦王爽老師的匯編語言一書, 是入門絕佳教材。
嵌入式目前主流的處理器架構(gòu)是ARM(以前是ARM7,ARM9,ARM11,現(xiàn)在都Cortex系列了)。手機(jī),平板,大部分開發(fā)板都是ARM的天下。所以需要學(xué)一下ARM架構(gòu),有個了解。
一開始對ARM不需要太深入,視以后情況而定。ARM的集成開發(fā)環(huán)境有ADS(ARM Developer Suite), 是ARM處理器下主要的開發(fā)工具。
可以去買一塊便宜的開發(fā)板來開始學(xué)習(xí)(我覺得自學(xué)嵌入式唯一比較花錢之處。也就幾百元就很好了),現(xiàn)在什么樹莓派(https://www.raspberrypi.org/ ; http://www.raspberrypi.com.tw/ )有點貴,Arduino什么也可以。
也可以買國內(nèi)一些廠商自己的開發(fā)板,不要買太差的就行。
如果你買了開發(fā)板的話,可以去開發(fā)板對應(yīng)的論壇。
比如我以前2011年買的是天嵌的TQ2440(現(xiàn)在早就升級到不知道什么了吧,天嵌的論壇有很多不錯的資料。
還有參加法國2012嵌入式Linux競賽獲得的一塊Mini2440(德國的友善之臂FriendlyArm,論壇可以去看看。中文論壇是http://www.arm9home.net/ )。
國嵌的論壇。
嵌入式Linux論壇。
華清遠(yuǎn)見的論壇。
電子工程世界論壇。
當(dāng)然了國內(nèi)最大的IT社區(qū)CSDN的論壇和博客也都是不錯的學(xué)習(xí)區(qū),51CTO也不錯,ChinaUnix也不錯。
實驗樓有很好的在線實驗環(huán)境,使用的實驗環(huán)境是Ubuntu這個Linux發(fā)行版。
把英語學(xué)好,對編程很有裨益。所以千萬不要荒廢英語。
還有, 數(shù)學(xué)也需要還過得去吧, 畢竟底層有很多位移, 與或非運(yùn)算, 十六進(jìn)制, 二進(jìn)制, 十進(jìn)制轉(zhuǎn)換, 等等。
可以參看我的這篇文章: 對于程序員, 為什么英語比數(shù)學(xué)更重要? 如何學(xué)習(xí)
可以看的書很多,主要要選好書,看得有效率。
最好買紙質(zhì)版的, 當(dāng)然我當(dāng)年自學(xué)時, 因為是在法國, 買國內(nèi)的書不方便, 因此都是看的PDF。
深入理解計算機(jī)系統(tǒng)非常好,算是入門的。其他也有很多嵌入式書籍。慢慢來,先把基礎(chǔ)打好了。
嵌入式這個領(lǐng)域太廣了,可以學(xué)的東西太多,現(xiàn)在技術(shù)又日新月異,把基礎(chǔ)打好學(xué)什么新知識都快。
有一本Orange\’S:一個操作系統(tǒng)的實現(xiàn)的書很推薦,跟著作者一步步寫自己的操作系統(tǒng),帥到掉渣,熱血沸騰。
假如你以后學(xué)更有難度的嵌入式實時(Real Time)系統(tǒng)(VxWorks,ecos,ucos,等等。驅(qū)動開發(fā)之類的,那就要C(和匯編)的功底比較強(qiáng),要看更深入的書。不過暫時先入門嵌入式,這些更艱深的領(lǐng)域看興趣,不學(xué)也可以。
需要什么編程書的PDF可以來加入程序員聯(lián)盟(我一路以來在電腦里收集了很多編程的PDF,很多都上傳到了程序員聯(lián)盟的QQ群文件,還有程序員聯(lián)盟的百度云盤(2T容量)中)。
至于程序員聯(lián)盟的信息, 在我的個人信息里。
不要害怕, 當(dāng)年我也是從對嵌入式一竅不通努力自學(xué), 到現(xiàn)在只\”通了一竅\”的。
自學(xué), 從來沒有像現(xiàn)在這個時代這般容易。
所以, 站在這么多巨人(網(wǎng)上有很多大牛的博客)的肩膀上, 你還怕入門不了嗎?
少年, 你離成功只差逼一下自己。
暫時只想到這么多,有些點可能沒談到。希望不要誤導(dǎo)。
有什么問題歡迎在留言區(qū)交流, 指教。
聲明: 文章中提到的公司或產(chǎn)品, 絕無廣告之意。
我是謝恩銘,在法國巴黎奮斗的嵌入式軟件工程師。
目前工作是Android嵌入式和app開發(fā)。
熱愛生活, 喜歡游泳,略懂烹飪。