什麼是嵌入式程式設計?如何入門和提高?

文章推薦指數: 80 %
投票人數:10人

嵌入式,英語是embedded,表示“嵌入式的,植入的,內含的”。

因為首先,嵌入式有不少組合名詞,例如嵌入式系統,嵌入式軟體,Linux 嵌入式,Android 嵌入 ... MdEditor 什麼是嵌入式程式設計?如何入門和提高? 語言:CN/TW/HK 時間 2020-06-2308:03:51 主題: 嵌入式 內容簡介 什麼是嵌入式 什麼是交叉編譯 入門和提高嵌入式 1.什麼是嵌入式 嵌入式可以說是目前涵蓋面最廣、最火的職業之一。

那麼,什麼是嵌入式呢? 這個問題三言兩語還真說不清楚。

嵌入式,英語是embedded,表示“嵌入式的,植入的,內含的”。

因為首先,嵌入式有不少組合名詞,例如嵌入式系統,嵌入式軟體,Linux嵌入式,Android嵌入式,嵌入式Web,等等。

通常對嵌入式的定義其實是對"嵌入式系統"的定義。

網上對嵌入式系統的中文定義實在是不好理解,比較官方的中文定義是: 嵌入式系統是:以應用為中心,以計算機技術為基礎,軟硬體可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。

我個人感覺:如果是從來沒接觸過嵌入式的朋友,看了上面這段定義,估計跟沒看差不多,還是一頭霧水。

當年我剛開始學習嵌入式時看到這段解釋也是這般感受。

當然了,這段定義是正確的,不過就是有點學究味,不夠形象,不夠"接地氣"。

那麼如何給嵌入式系統一個接地氣的定義呢? 我可以先列舉目前用到嵌入式系統的IT領域: 物聯網 Android嵌入式開發。

Linux嵌入式開發。

智慧手機,平板,智慧手錶。

可穿戴裝置,例如Google眼鏡,小米手環。

微軟的Xbox和Kinect。

無人機。

VR頭盔。

無線路由器。

等等 我想不必再列舉也已經感覺到了吧:是的,嵌入式正在滲透到我們生活的方方面面,而且會越來越多地被使用。

但是,例如Android和iOS的純app開發的話一般就不能算是嵌入式了,只能算軟體開發。

未來,也許我們可以有一身輕便的可穿戴裝置,衣食住行都用得到。

甚至未來可以穿一身輕薄的“飛行衣”,想去哪都行。

嵌入式程式設計,雖然入門門檻比較高,但是如果你能啃下嵌入式這個“硬柿子”,學了很多方面的知識,那麼其他一些程式設計領域,也許就能比較輕鬆地掌握了。

就好比你如果熟練掌握了C語言和C++,那麼其他一些程式語言一般都可以輕鬆駕馭了。

我覺得原版英語的定義應該會更便於理解,因此我將維基百科上對嵌入式系統的定義翻譯如下(不才,若翻譯有誤請補充指正): Anembeddedsystemisacomputersystemwithadedicatedfunctionwithinalargermechanicalorelectricalsystem,oftenwithreal-timecomputingconstraints.Itisembeddedaspartofacompletedeviceoftenincludinghardwareandmechanicalparts.Embeddedsystemscontrolmanydevicesincommonusetoday.Ninety-eightpercentofallmicroprocessorsaremanufacturedascomponentsofembeddedsystems.嵌入式系統首先是一個具備特定功用的計算機系統,是包含在更大的機械或電子系統裡面的,通常有實時的計算約束。

嵌入式系統作為一個部件被嵌入在一個完整的裝置裡(補充:這也是“嵌入式”的名字由來),這個裝置通常有硬體和機械的部分。

當今時代,嵌入式系統控制了很多通用裝置。

98%的微處理器被生產用來作為嵌入式系統的部件。

Examplesofpropertiesoftypicallyembeddedcomputerswhencomparedwithgeneral-purposecounterpartsarelowpowerconsumption,smallsize,ruggedoperatingranges,andlowper-unitcost.Thiscomesatthepriceoflimitedprocessingresources,whichmakethemsignificantlymoredifficulttoprogramandtointeractwith.嵌入式系統和通常的系統有區別,主要體現在以下特性:低能耗,小尺寸,受限的計算範圍,單元成本較低。

這些特性是以有限的處理資源為代價的,使得嵌入式系統更難以程式設計和互動。

Modernembeddedsystemsareoftenbasedonmicrocontrollers(i.e.CPUswithintegratedmemoryorperipheralinterfaces),butordinarymicroprocessors(usingexternalchipsformemoryandperipheralinterfacecircuits)arealsocommon,especiallyinmore-complexsystems.Ineithercase,theprocessor(s)usedmaybetypesrangingfromgeneralpurposetothosespecialisedincertainclassofcomputations,orevencustomdesignedfortheapplicationathand.Acommonstandardclassofdedicatedprocessorsisthedigitalsignalprocessor(DSP).現代嵌入式系統通常基於微控制器(即具有整合記憶體或外圍介面的CPU(中央處理器)),但是普通微處理器(使用用於儲存器和外圍介面電路的外部晶片)也是常見的,特別是在更復雜的系統中。

在任一情況下,所使用的處理器可以是從通用的到專門用於某些計算類別的那些型別,或者甚至是針對當前應用而定製的型別。

數字訊號處理器(DSP)就是一種通用標準類別的專用處理器。

Sincetheembeddedsystemisdedicatedtospecifictasks,designengineerscanoptimizeittoreducethesizeandcostoftheproductandincreasethereliabilityandperformance.由於嵌入式系統專用於特定任務,設計工程師可以對其進行優化,以減小產品的尺寸和成本,並提高可靠性和效能。

EmbeddedsystemsrangefromportabledevicessuchasdigitalwatchesandMP3players,tolargestationaryinstallationsliketrafficlights,factorycontrollers,andlargelycomplexsystemslikehybridvehiclesandavionics.Complexityvariesfromlow,withasinglemicrocontrollerchip,toveryhighwithmultipleunits,peripheralsandnetworksmountedinsidealargechassis.嵌入式系統存在於當今的很多裝置裡,小到數碼手錶、mp3播放器,大到交通燈、工業控制器、混合汽車、航空航天裝置。

嵌入式系統的複雜性也千差萬別,簡單的嵌入式系統可能只有一個微控制器晶片;複雜的則有很多個計算單元、外設、網路,這些都被“鑲焊”在一個大“底板”上。

2.什麼是交叉編譯 在嵌入式程式設計中還有一個交叉編譯的概念。

那麼,什麼是交叉編譯呢? 交叉編譯,英語cross-compiling。

cross表示“交叉”,compiling是compile(表示“編譯”)這個動詞的現在分詞。

簡單來說,就是“在一個平臺上生成另一個平臺上的可執行程式碼”。

普通的軟體開發過程中,如果是編譯型的程式語言,例如C語言,C++,Java,等等。

你想要執行你寫的程式,需要用編譯器將程式碼編譯成可執行程式(當然,中間還有幾個步驟,比如預處理、彙編、連結,在此省略)。

但是嵌入式系統的計算能力有限、記憶體有限、儲存空間有限,因此無法完成比較需要資源和速度的編譯過程。

比如在Android嵌入式開發中,你不可能在Android手機裡直接讓它編譯自己的系統或軟體吧(臣妾做不到啊)。

因此,我們會先在普通電腦(比Android手機的計算能力更強,記憶體更大,儲存空間更大)裡將程式編譯(需要不同於我們編譯普通軟體的編譯器,稱為“交叉編譯器/軟體”,比較常見的有arm-linux-gcc一族)成適配Android手機的特定可執行檔案(一般會打包成映象檔案),然後通過專門的工具“燒錄”到Android手機裡。

相信經過這些解釋,大家對嵌入式應該有一個初步的瞭解了吧。

但是光看這些解釋是不可能瞭然於胸的,還必須要學習。

在實踐當中你就會更深入理解嵌入式程式設計是什麼了。

3.入門和提高嵌入式 現代這個匆忙時代,假如你不好好利用網上那麼多的優秀資源(大多數是免費的)來自學的話,就有點虧了。

如果花大錢去讀培訓班,可能更虧了(如果沒有自制的能力,去了培訓機構基本也是“浪費”)。

嵌入式軟體的話不一定需要學很多硬體知識的(有的話當然是多多益善)。

會用一些燒寫工具,編譯,除錯工具(比如JTAG)就可以了,到時候要用了現學。

開發工具也沒什麼固定的,一般也不一定要用IDE,用文字編輯器(比如Vim,Emacs,Nano,VSCode,等等)就可以寫程式碼。

編譯一般用GCC的變種。

嵌入式一般都要學C語言(可以看我的系列教程C語言探索之旅。

以及《C語言深度解剖》,《C程式設計語言》這兩本書。

也可以繼續深入看《C語言專家程式設計》,等等)。

C++也是常用語言之一。

Linux是必須要學習的。

因為交叉編譯經常要用到Linux系統,即使在Windows下也要用到Cygwin之類的。

可以學習我在慕課網的實戰課程《Linux核心技能與應用》(https://coding.imooc.com/class/386.html)和專欄《Linux命令列與Shell指令碼程式設計大全》(https://www.imooc.com/read/39)。

也可以看來自臺灣的鳥哥的鳥哥的Linux私房菜。

可以逛逛中國Linux公社。

看《Unix環境高階程式設計》這本書。

豬哥的嵌入式Linux公房菜還行,我沒看完,感覺有點亂(當然作者比我厲害多了),沒有鳥哥的文筆那麼流暢清晰。

最好花點時間學習一下彙編,對理解計算機的原理,特別是記憶體、指標、二進位制、十六進位制都有很好幫助,不需要學很深。

推薦王爽老師的《組合語言》一書,是入門絕佳教材。

嵌入式目前主流的處理器架構是ARM(以前是ARM7,ARM9,ARM11,現在都Cortex系列了)。

手機,平板,大部分開發板都是ARM的天下。

所以需要學一下ARM架構,有個瞭解。

一開始對ARM不需要太深入,視以後情況而定。

ARM的整合開發環境有ADS(ARMDeveloperSuite),是ARM處理器主要的開發工具。

可以去買一塊便宜的開發板來開始學習(我覺得自學嵌入式唯一比較花錢之處。

幾十,幾百元就很好了)。

樹莓派(https://www.raspberrypi.org;http://www.raspberrypi.com.tw),Arduino,等等,都可以。

也可以買國內一些廠商自己的開發板,不要買太差的就行。

如果你買了開發板的話,可以去開發板對應的論壇。

比如我以前學生時代買的是天嵌的TQ2440(現在早就升級到不知道什麼了吧,天嵌的論壇有很多不錯的資料。

嵌入式Linux論壇。

華清遠見的論壇。

電子工程世界論壇。

當然了,國內最大的IT社群CSDN的論壇和部落格也都是不錯的學習區。

51CTO也不錯,ChinaUnix也可以。

實驗樓有很好的線上實驗環境,使用的實驗環境大多是Ubuntu這個Linux發行版。

把英語學好,對程式設計很有裨益,所以千萬不要荒廢英語。

還有,數學也需要還過得去吧,畢竟底層有很多位移,與或非運算,十六進位制,二進位制,十進位制轉換,等等。

可以參看我的這篇文章:對於程式設計師,為什麼英語比數學更重要?如何學習。

可以看的書很多,主要要選好書,看得有效率。

《深入理解計算機系統》非常好,算是入門的。

其他也有很多嵌入式書籍。

慢慢來,先把基礎打好了。

嵌入式這個領域太廣了,可以學的東西太多,現在技術又日新月異,把基礎打好學什麼新知識都快。

有一本《Orange'S:一個作業系統的實現》的書很推薦,跟著作者一步步寫自己的作業系統,熱血沸騰。

假如以後學更有難度的嵌入式實時(RealTime)系統(VxWorks,ecos,ucos,等等。

驅動開發之類的,那就要C語言(和彙編)的功底比較強,要看更深入的書。

不過暫時先入門嵌入式,這些更艱深的領域看興趣,不學也可以。

需要什麼程式設計的資料,可以關注我的微信公眾號「程式設計師聯盟」(微訊號:coderhub)(程式設計師聯盟的QQ群檔案,還有程式設計師聯盟的百度雲盤(2T容量)中,有非常多程式設計資料)。

不要害怕,當年我也是從對嵌入式一竅不通努力自學,到現在“只通了一竅”的。

自學,從來沒有像現在這個時代這般容易。

所以,站在這麼多巨人(網上有很多大牛的部落格)的肩膀上,你還怕入門不了嗎?少年,你離成功只差逼一下自己。

有些點可能沒談到,希望不要誤導大家。

有什麼問題歡迎在留言區交流,指教。

宣告:文章中提到的公司或產品,絕無廣告之意。

作者:謝恩銘 出處:公眾號「程式設計師聯盟」 原文連結:http://www.jianshu.com/p/d59378613d15 轉載請註明出處,謝謝合作!轉載授權請加我微信frogoscar 喜歡本文的朋友,歡迎關注公眾號 程式設計師聯盟,收看更多精彩內容 點個[在看],是對我最大的支援! 「嵌入式」 痞子衡嵌入式:把玩i.MXRT1062TencentOSTinyEVB_AIoT開發板(1)-開發環境搭建與點燈 嵌入式bootloader跳轉程式實現原理 痞子衡嵌入式:揭祕i.MXRT1170上用J-Link連線復位後PC總是停在0x223104的原因 串列埠傳輸資料時,結構體如何轉換 STM32串列埠中斷及DMA接收常見的幾個問題 如何在現代雲時代更新物聯網裝置 UART串列埠需要使用DMA傳送嗎? 面向通用嵌入式Linux系統 嵌入式軟體發展、開源的這段故事 嵌入式電路設計(外圍模組)



請為這篇文章評分?