作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)锐借。
轉(zhuǎn)載請(qǐng)注明出處问麸。
原文:http://www.reibang.com/p/d59378613d15
內(nèi)容簡(jiǎn)介
- 什么是嵌入式
- 什么是交叉編譯
- 入門和提高嵌入式
1. 什么是嵌入式
嵌入式可以說(shuō)是目前涵蓋面最廣、最火的職業(yè)之一钞翔。那么严卖,什么是嵌入式呢?
這個(gè)問(wèn)題三言兩語(yǔ)還真說(shuō)不清楚嗅战。
嵌入式妄田,英語(yǔ)是 embedded俺亮,表示“嵌入式的驮捍,植入的,內(nèi)含的”脚曾。
因?yàn)槭紫榷遥度胧接胁簧俳M合名詞,例如嵌入式系統(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)格要求的專用計(jì)算機(jī)系統(tǒng)。
我個(gè)人感覺(jué):如果是從來(lái)沒(méi)接觸過(guò)嵌入式的朋友狮辽,看了上面這段定義一也,估計(jì)跟沒(méi)看差不多,還是一頭霧水喉脖。當(dāng)年我剛開始學(xué)習(xí)嵌入式時(shí)看到這段解釋也是這般感受塘秦。
當(dāng)然了,這段定義是正確的动看,不過(guò)就是有點(diǎn)學(xué)究味尊剔,不夠形象,不夠"接地氣"菱皆。
那么如何給嵌入式系統(tǒng)一個(gè)接地氣的定義呢须误?
我可以先列舉目前用到嵌入式系統(tǒng)的 IT 領(lǐng)域:
- 物聯(lián)網(wǎng)
- Android 嵌入式開發(fā)。
- Linux 嵌入式開發(fā)仇轻。
- 智能手機(jī)京痢,平板,智能手表篷店。
- 可穿戴設(shè)備祭椰,例如 Google 眼鏡,小米手環(huán)疲陕。
- 微軟的 Xbox 和 Kinect方淤。
- 無(wú)人機(jī)。
- VR 頭盔蹄殃。
- 無(wú)線路由器携茂。
- 等等
我想不必再列舉也已經(jīng)感覺(jué)到了吧:是的,嵌入式正在滲透到我們生活的方方面面, 而且會(huì)越來(lái)越多地被使用诅岩。
但是讳苦,例如 Android 和 iOS 的純 app 開發(fā)的話一般就不能算是嵌入式了,只能算軟件開發(fā)吩谦。
未來(lái)鸳谜,也許我們可以有一身輕便的可穿戴設(shè)備,衣食住行都用得到式廷。甚至未來(lái)可以穿一身輕薄的“飛行衣”咐扭,想去哪都行。
嵌入式編程,雖然入門門檻比較高草描,但是如果你能啃下嵌入式這個(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ǔ)器和外圍接口電路的外部芯片)也是常見的傻丝,特別是在更復(fù)雜的系統(tǒng)中。 在任一情況下廊散,所使用的處理器可以是從通用的到專門用于某些計(jì)算類別的那些類型桑滩,或者甚至是針對(duì)當(dāng)前應(yīng)用而定制的類型梧疲。 數(shù)字信號(hào)處理器(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ì)工程師可以對(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è)控制器蔓搞、混合汽車胰丁、航空航天設(shè)備。嵌入式系統(tǒng)的復(fù)雜性也千差萬(wàn)別喂分,簡(jiǎn)單的嵌入式系統(tǒng)可能只有一個(gè)微控制器芯片锦庸;復(fù)雜的則有很多個(gè)計(jì)算單元、外設(shè)蒲祈、網(wǎng)絡(luò)甘萧,這些都被“鑲焊”在一個(gè)大“底板”上。
2. 什么是交叉編譯
在嵌入式編程中還有一個(gè)交叉編譯的概念梆掸。
那么扬卷,什么是交叉編譯呢?
交叉編譯酸钦,英語(yǔ)是 cross-compiling怪得。cross 表示“交叉”,compiling 是 compile(表示“編譯”)這個(gè)動(dòng)詞的現(xiàn)在分詞卑硫。
簡(jiǎn)單來(lái)說(shuō)汇恤,就是“在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼”。
普通的軟件開發(fā)過(guò)程中拔恰,如果是編譯型的編程語(yǔ)言因谎,例如 C語(yǔ)言,C++颜懊,Java财岔,等等。你想要運(yùn)行你寫的程序河爹,需要用編譯器將代碼編譯成可執(zhí)行程序(當(dāng)然匠璧,中間還有幾個(gè)步驟,比如預(yù)處理咸这、匯編夷恍、鏈接,在此省略)媳维。
但是嵌入式系統(tǒng)的計(jì)算能力有限酿雪、內(nèi)存有限、儲(chǔ)存空間有限侄刽,因此無(wú)法完成比較需要資源和速度的編譯過(guò)程指黎。
比如在 Android 嵌入式開發(fā)中,你不可能在 Android 手機(jī)里直接讓它編譯自己的系統(tǒng)或軟件吧(臣妾做不到爸莸ぁ)醋安。
因此杂彭,我們會(huì)先在普通電腦(比 Android 手機(jī)的計(jì)算能力更強(qiáng),內(nèi)存更大吓揪,儲(chǔ)存空間更大)里將程序編譯(需要不同于我們編譯普通軟件的編譯器亲怠,稱為“交叉編譯器/軟件”,比較常見的有 arm-linux-gcc 一族)成適配 Android 手機(jī)的特定可執(zhí)行文件(一般會(huì)打包成鏡像文件)柠辞,然后通過(guò)專門的工具“燒錄”到 Android 手機(jī)里赁炎。
相信經(jīng)過(guò)這些解釋,大家對(duì)嵌入式應(yīng)該有一個(gè)初步的了解了吧钾腺。
但是光看這些解釋是不可能了然于胸的徙垫,還必須要學(xué)習(xí)。在實(shí)踐當(dāng)中你就會(huì)更深入理解嵌入式編程是什么了放棒。
3. 入門和提高嵌入式
現(xiàn)代這個(gè)匆忙時(shí)代姻报,假如你不好好利用網(wǎng)上那么多的優(yōu)秀資源(大多數(shù)是免費(fèi)的)來(lái)自學(xué)的話,就有點(diǎn)虧了间螟。
如果花大錢去讀培訓(xùn)班吴旋,可能更虧了(如果沒(méi)有自制的能力,去了培訓(xùn)機(jī)構(gòu)基本也是“浪費(fèi)”)厢破。
嵌入式軟件的話不一定需要學(xué)很多硬件知識(shí)的(有的話當(dāng)然是多多益善)荣瑟。會(huì)用一些燒寫工具,編譯摩泪,調(diào)試工具(比如 JTAG)就可以了笆焰,到時(shí)候要用了現(xiàn)學(xué)。開發(fā)工具也沒(méi)什么固定的见坑,一般也不一定要用 IDE嚷掠,用文本編輯器(比如 Vim,Emacs荞驴,Nano不皆,VS Code,等等)就可以寫代碼熊楼。編譯一般用 GCC 的變種霹娄。
嵌入式一般都要學(xué) C語(yǔ)言(可以看我的系列教程 C語(yǔ)言探索之旅 。以及《C語(yǔ)言深度解剖》鲫骗,《C程序設(shè)計(jì)語(yǔ)言》這兩本書犬耻。也可以繼續(xù)深入看《C語(yǔ)言專家編程》,等等)挎峦。C++ 也是常用語(yǔ)言之一香追。
Linux 是必須要學(xué)習(xí)的。因?yàn)榻徊婢幾g經(jīng)常要用到 Linux 系統(tǒng)坦胶,即使在 Windows 下也要用到 Cygwin 之類的。
可以學(xué)習(xí)我在慕課網(wǎng)的實(shí)戰(zhàn)課程《Linux核心技能與應(yīng)用》和專欄《Linux命令行與Shell腳本編程大全》。也可以看來(lái)自臺(tái)灣的鳥哥的 鳥哥的Linux私房菜 顿苇∏椭洌可以逛逛 中國(guó)Linux公社 〖退辏看《Unix環(huán)境高級(jí)編程》這本書凑队。豬哥的嵌入式Linux公房菜 還行,我沒(méi)看完幔翰,感覺(jué)有點(diǎn)亂(當(dāng)然作者比我厲害多了)漩氨,沒(méi)有鳥哥的文筆那么流暢清晰。最好花點(diǎn)時(shí)間學(xué)習(xí)一下匯編遗增,對(duì)理解計(jì)算機(jī)的原理叫惊,特別是內(nèi)存、指針做修、二進(jìn)制霍狰、十六進(jìn)制都有很好幫助,不需要學(xué)很深饰及。推薦王爽老師的《匯編語(yǔ)言》一書, 是入門絕佳教材蔗坯。
嵌入式目前主流的處理器架構(gòu)是 ARM(以前是 ARM7,ARM9燎含,ARM11宾濒,現(xiàn)在都 Cortex 系列了)。手機(jī)屏箍,平板鼎兽,大部分開發(fā)板都是 ARM 的天下。所以需要學(xué)一下 ARM 架構(gòu)铣除,有個(gè)了解谚咬。一開始對(duì) ARM 不需要太深入,視以后情況而定尚粘。ARM 的集成開發(fā)環(huán)境有 ADS(ARM Developer Suite)择卦,是 ARM 處理器主要的開發(fā)工具。
可以去買一塊便宜的開發(fā)板來(lái)開始學(xué)習(xí)(我覺(jué)得自學(xué)嵌入式唯一比較花錢之處郎嫁。幾十秉继,幾百元就很好了)。樹莓派(https://www.raspberrypi.org 泽铛;http://www.raspberrypi.com.tw )尚辑,Arduino ,等等盔腔,都可以杠茬。也可以買國(guó)內(nèi)一些廠商自己的開發(fā)板月褥,不要買太差的就行。
如果你買了開發(fā)板的話瓢喉,可以去開發(fā)板對(duì)應(yīng)的論壇宁赤。比如我以前學(xué)生時(shí)代買的是天嵌的 TQ2440(現(xiàn)在早就升級(jí)到不知道什么了吧,天嵌的論壇 有很多不錯(cuò)的資料栓票。嵌入式Linux論壇 决左。華清遠(yuǎn)見的論壇 。電子工程世界論壇 走贪。當(dāng)然了佛猛,國(guó)內(nèi)最大的 IT 社區(qū) CSDN 的 論壇 和 博客 也都是不錯(cuò)的學(xué)習(xí)區(qū)。51CTO 也不錯(cuò)坠狡,ChinaUnix 也可以继找。實(shí)驗(yà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í) 瘟栖。可以看的書很多,主要要選好書谅阿,看得有效率半哟。
《深入理解計(jì)算機(jī)系統(tǒng)》 非常好,算是入門的签餐。其他也有很多嵌入式書籍寓涨。慢慢來(lái),先把基礎(chǔ)打好了氯檐。嵌入式這個(gè)領(lǐng)域太廣了戒良,可以學(xué)的東西太多,現(xiàn)在技術(shù)又日新月異冠摄,把基礎(chǔ)打好學(xué)什么新知識(shí)都快糯崎。有一本《Orange'S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》的書很推薦几缭,跟著作者一步步寫自己的操作系統(tǒng),熱血沸騰拇颅。假如以后學(xué)更有難度的嵌入式實(shí)時(shí)(Real Time)系統(tǒng)(VxWorks奏司,ecos乔询,ucos樟插,等等。驅(qū)動(dòng)開發(fā)之類的竿刁,那就要 C語(yǔ)言(和匯編)的功底比較強(qiáng)黄锤,要看更深入的書。不過(guò)暫時(shí)先入門嵌入式食拜,這些更艱深的領(lǐng)域看興趣鸵熟,不學(xué)也可以。
需要什么編程的資料负甸,可以關(guān)注我的微信公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)(程序員聯(lián)盟的 QQ 群文件流强,還有程序員聯(lián)盟的百度云盤(2T 容量)中,有非常多編程資料)呻待。
不要害怕打月,當(dāng)年我也是從對(duì)嵌入式一竅不通努力自學(xué),到現(xiàn)在“只通了一竅”的蚕捉。自學(xué)奏篙,從來(lái)沒(méi)有像現(xiàn)在這個(gè)時(shí)代這般容易。所以迫淹,站在這么多巨人(網(wǎng)上有很多大牛的博客)的肩膀上秘通,你還怕入門不了嗎? 少年,你離成功只差逼一下自己敛熬。
有些點(diǎn)可能沒(méi)談到肺稀,希望不要誤導(dǎo)大家。有什么問(wèn)題歡迎在留言區(qū)交流, 指教应民。
聲明:文章中提到的公司或產(chǎn)品话原,絕無(wú)廣告之意。
我是 謝恩銘瑞妇,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)運(yùn)營(yíng)者稿静,慕課網(wǎng)精英講師 Oscar 老師,終生學(xué)習(xí)者辕狰。
熱愛生活改备,喜歡游泳,略懂烹飪蔓倍。
人生格言:「向著標(biāo)桿直跑」