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

##嵌入式可以說是目前涵蓋面最廣、最火的職業之一

幾天前,在微信里經人介紹新認識了一位朋友,是在法國的學生,目前在找實習,學嵌入式和工業信息的。加了好友之後回復了一些問題。

因為我是嵌入式軟體專業的, 目前的工作是Android嵌入式和app開發。以前也有人專門發郵件問過我關於嵌入式學習的問題。

我覺得把這些回復整合起來,也許對大家有那麼一點點用,就寫出來看看。

不過我自己還很不夠呢,還望讀者不吝賜教和補充指正,彼此學習~

##什麼是嵌入式?

這個問題三言兩語還真說不清楚。

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

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

網上對嵌入式系統的中文定義實在是不好理解,比較官方的中文定義是:

嵌入式系統是:以應用為中心,以計算機技術為基礎,軟硬體可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。

我個人感覺:

如果是從來沒接觸過嵌入式的朋友,看了上面這段定義,估計跟沒看差不多,還是一頭霧水。當年我剛開始學習嵌入式時看到這段解釋也是這般感受。

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

那麼如何來給嵌入式系統一個接地氣的定義呢?

我可以先列舉目前用到嵌入式系統的IT領域:

  • Android嵌入式開發。
  • Linux嵌入式開發。
  • 智能手機,平板,智能手錶。
  • 可穿戴設備,例如Google眼鏡,小米手環。
  • 微軟的Xbox和Kinect。
  • 無人機。
  • VR頭盔。
  • 無線路由器。
  • 還有很多~

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

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

未來,也許我們可以有一身輕便的可穿戴設備,衣食住行都用得到。甚至未來可以穿一身輕薄的"飛行衣", 想去哪都行。

嵌入式編程,最近幾年越來越火,雖然入門門檻比較高,但是學好了薪資水平不錯哦。例如Linux嵌入式的高級工程師。

而且如果你能啃下嵌入式這個"硬柿子", 學了很多方面的知識, 那麼其他一些編程領域, 也許就能比較輕鬆地掌握了。就好比你如果熟練掌握了C語言和C++, 那麼其他一些編程語言一般都可以輕鬆駕馭了。

我覺得原版英語的定義應該會更便於理解,因此我將維基百科上對嵌入式系統的定義翻譯如下 (不才, 若翻譯有誤請補充指正):

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.嵌入式系統首先是一個具備特定功用的計算機系統, 是包含在更大的機械或電子系統裡面的, 通常有實時的計算約束。嵌入式系統作為一個部件被嵌入在一個完整的設備里(小編補充: 這也是"嵌入式"的名字由來), 這個設備通常有硬體和機械的部分。當今時代, 嵌入式系統控制了很多通用設備。98%的微處理器被生產用來作為嵌入式系統的部件。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.嵌入式系統和通常的系統有區別, 主要體現在以下特性 :低能耗小尺寸受限的計算範圍單元成本較低這些特性是以有限的處理資源為代價的,使得嵌入式系統更難以編程和交互。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).現代嵌入式系統通常基於微控制器(即具有集成內存或外圍介面的CPU(中央處理器)),但是普通微處理器(使用用於存儲器和外圍介面電路的外部晶元)也是常見的,特別是在更複雜的系統中。 在任一情況下,所使用的處理器可以是從通用的到專門用於某些計算類別的那些類型,或者甚至是針對當前應用而定製的類型。 數字信號處理器(DSP)就是一種通用標準類別的專用處理器。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.由於嵌入式系統專用於特定任務,設計工程師可以對其進行優化,以減小產品的尺寸和成本,並提高可靠性和性能。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.嵌入式系統存在於當今的很多設備里, 小到數碼手錶, mp3播放器, 大到交通燈, 工業控制器, 混合汽車, 航空航天設備。嵌入式系統的複雜性也千差萬別, 簡單的嵌入式系統可能只有一個微控制器晶元 ; 複雜的則有很多個計算單元, 外設, 網路, 這些都被"鑲焊"在一個大"底板"上。

在嵌入式編程中還有一個交叉編譯的概念: 什麼是交叉編譯呢?

簡單來說, 就是"在一個平台上生成另一個平台上的可執行代碼"。

普通的軟體開發過程中, 如果是編譯型的編程語言, 例如C語言, C++, Java, 等等, 你想要運行你寫的程序, 需要用編譯器將代碼編譯成可執行程序 (當然, 中間還有幾個步驟, 比如彙編, 鏈接, 在此就不提了)。

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

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

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

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

但是光看這些解釋是不可能瞭然於胸的, 還必須要學習, 在實踐當中你就會更深入理解嵌入式編程是什麼了。

##入門和提高嵌入式

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

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

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

開發工具也沒什麼固定的,一般也不一定要IDE,用文本編輯器就可以寫代碼(比如Vim,Emacs, nano, Sublime)了。

編譯一般用GCC的變種。

  1. 嵌入式一般要學C語言(去看看我的C語言探索之旅, 以及C語言深度解剖,C程序設計語言這兩本書。

也可以繼續深入看C語言專家編程等等)。

C++不一定會用到, 但也可以學一下。

  1. Linux是要學習的。因為交叉編譯經常要用到Linux系統,即使在Windows下也要用到Cygwin這類的。

可以看Linux探索之旅入門,當然要更深入提高須要看來自台灣的鳥哥的鳥哥的Linux私房菜 。

可以逛逛中國Linux公社 。

看Unix環境高級編程這本書。

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

  1. 最好花點時間學一下彙編,對理解計算機的原理,特別是內存,指針,二進位,十六進位都有很好幫助,不需要學很深。
  2. 嵌入式目前主流的處理器架構是ARM(以前是ARM7,ARM9,ARM11,現在都Cortex系列了)。手機,平板,大部分開發板都是ARM的天下。所以需要學一下ARM架構,有個了解。
  3. 一開始對ARM不需要太深入,視以後情況而定。ARM的集成開發環境有ADS(ARM Developer Suite), 是ARM處理器下主要的開發工具。

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

可以去開發板對應的論壇。

國嵌的論壇。

嵌入式Linux論壇。

華清遠見的論壇。

電子工程世界論

當然了國內最大的IT社區CSDN的論壇和博客也都是不錯的學習區,51CTO也不錯,ChinaUnix也不錯。

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

  1. 把英語學好,對編程很有裨益。所以千萬不要荒廢英語。

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

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

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

最好買紙質版的, 當然我當年自學時, 因為是在法國, 買國內的書不方便, 因此都是看的PDF。

深入理解計算機系統非常好,算是入門的。其他也有很多嵌入式書籍。慢慢來,先把基礎打好了。

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

有一本OrangeS:一個操作系統的實現的書很推薦,跟著作者一步步寫自己的操作系統,帥到掉渣,熱血沸騰。

  1. 假如你以後學更有難度的嵌入式實時(Real Time)系統(VxWorks,ecos,ucos,等等。驅動開發之類的,那就要C(和彙編)的功底比較強,要看更深入的書。不過暫時先入門嵌入式,這些更艱深的領域看興趣,不學也可以。
  2. 需要什麼編程書的PDF可以來加入程序員聯盟(我一路以來在電腦里收集了很多編程的PDF,,還有程序員聯盟的百度雲盤(2T容量)中)。

至於程序員交流的信息, 在我的個人信息里。

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

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

所以, 站在這麼多巨人(網上有很多大牛的博客)的肩膀上, 你還怕入門不了嗎?

少年, 你離成功只差逼一下自己。

這篇文章分享之前我還是要推薦下我自己的JAVA裙:472052538,不管你是小白還是大牛,小編我都挺歡迎,不定期分享乾貨,包括我自己整理的一份2017最新JAVA資料和零基礎入門教程!,歡迎初學和進階中的小夥伴


推薦閱讀:

一晚上糊出一個語言「前端」
html5可以做什麼?HTML5市場需求有哪些?
PHP是最好的語言么?
AppleScript類自然語言與非英語語法設計

TAG:編程語言 | Linux開發 | 軟體開發 |