1. 程式人生 > >2017嵌入式軟體行業現狀及概述

2017嵌入式軟體行業現狀及概述

導讀:
本文章介紹了截止2017年為止的嵌入式軟體行業現狀,包括就業方向,行業產品型別,待遇等等。另外還簡單概述了下嵌入式軟體所需的知識技能以及未來可能的技能發展走向。本文章遠不如專業的行業報告一般精準、專業,僅僅是根據個人見聞來提供一個比較整體的嵌入式軟體行業印象,拋磚引玉,以供參考。(文末有2017年積體電路行業薪資表哦)。

嵌入式軟體定義

嵌入式軟體

其實嵌入式軟體這個名詞還是比較難以準確定義的,一般把“用於控制、監視或者輔助操作機器和裝置的裝置”稱為嵌入式系統,系統包括一系列軟硬體設施等,而嵌入式軟體姑且可以認為是嵌入式系統的軟體開發這部分。比如:手機的系統開發(Android、IOS等),無人機的系統控制軟體、驅動開發,路由器的軟體系統開發等等。廣義上,可以把微控制器(STM32)、SOC等等硬體構成的控制系統中軟體開發部分都稱之為嵌入式軟體開發。

嵌入式系統架構

硬體

硬體架構以ARM為主,有很多人可能分不清ARM這個單詞到底代表什麼意思。感覺好像很多地方都有ARM這個詞,而且意思還不甚一致,這裡稍微解釋下。

  • ARM公司
    首先ARM是一家英國公司(全名Advanced RISC Machines),於1991年成立英國劍橋,由蘋果、諾基亞等等合資成立,主要業務是出售晶片設計技術的授權,也就是常說的IP,它的盈利方式有點類似於高通,但是高通有很大一部分收入來自於專利牆,從這點來說ARM還是差了不少。ARM的IP包括物理IP(嵌入式記憶體IP、邏輯IP、介面IP等),影象與多媒體(熟悉的Mali系列GPU以及video、顯示等),其它還有系統IP(CoreLink(核心)連線記憶體控制器、CoreLink(核心)連線系統控制器、TrustZone安全IP),無線IP等等。
  • ARM處理器
    一顆SOC包括處理器核心、GPU(可選)、各種片上外設(USB、I2C、ISP等等),嵌入式領域的SOC處理器核心主要就是ARM、高通(Kyro等)、還有蘋果的。前期ARM的處理器型號有ARM7/9/11,例如熟悉的三星的S3C2440就是ARM9的處理器核心,這是比較早期的架構了,從ARM11開始就分出了三個不同的分支,現在我們最熟悉的是ARM公司的三種不同系列的處理器,Cortex-A/R/M系列。
    • Cortex-A:主打高效能,為各大嵌入式作業系統(Linux、Android等)提供基礎硬體,常見於手機、平板、IPC等嵌入式裝置。最新有A75、A53等等,再往前有A7等,像聯發科的最新X30處理器用的就是雙核A75、四核A53、四核A35。高通的處理器晶片早期是Krait,從820開始轉為Kryo架構,與ARM的處理器架構有所區別,不過其指令集用的還是ARM指令集。
    • Cortex-R:主打快速響應,用於實時性要求強的場合。這一系列並不像M/A系列那樣為人熟知,它通常用於硬碟控制器、網路裝置或印表機、汽車控制系統等。
    • Cortex-M:更小、更低功耗,用於離散處理與微控制器。常見的使用該系列處理器核心的有K60(飛思卡爾用的較多,有Cortex-M3/M4等),STM32(工業控制用的較多,有Cortex-M0/M3/M4等),像有些比較熟悉的產品中都用到了STM32,比如米家的小米掃地機器人(全志R16-CortexA7,STM32F103-CortexM3),大疆無人機(很多個STM32聯合使用)。
  • ARM指令集
    ARM指令集是ARM平臺處理器的操作指令系統,指令集定義了資料處理、載入、處理與儲存等等一些系列指令,有了指令集,處理器才能按照特定的要求去執行相關的動作,完成指定的操作。ARM的部分指令集版本與部分處理器版本的對應關係表如下表:
指令集版本 處理器版本
ARMv1 ARM1
ARMv2 ARM2,ARM3
ARMv3 ARM6,ARM7
ARMv4 ARM7TDMI,ARM9TDMI
ARMv5 ARM9E,ARM10E
ARMv6 ARM11,Cortex-M
ARMv7 Cortex-A/R/M
ARMv8 Cortex-A50
  • 架構

    • 哈佛架構
      一種將程式指令儲存和資料儲存分開的儲存器結構,它的主要特點是將程式和資料儲存在不同的儲存空間中,即程式儲存器和資料儲存器是兩個獨立的儲存器,每個儲存器獨立編址、獨立訪問。用到哈佛架構的處理器有ARM9/10/11以及之後。

      哈佛架構

      哈佛架構
    • 馮諾依曼(普林斯頓架構)
      一種將程式指令儲存器和資料儲存器合併在一起的儲存器結構。取指令和取運算元都在同一總線上,指令與程式碼在統一地址空間分佈,也就是說有時候並分不出來某段地址上面是放的資料還是命令,通過分時複用的方式進行;缺點是在高速執行時,不能達到同時取指令和取運算元,從而形成了傳輸過程的瓶頸。由於程式指令儲存地址和資料儲存地址指向同一個儲存器的不同物理位置,因此程式指令和資料的寬度相同。用到馮諾依曼架構的處理器有ARM7及之前的。

      馮諾依曼架構

      馮諾依曼架構

軟體

嵌入式行業的軟體系統眾多,包含作業系統、圖形UI系統等等,其中較為常見的有Linux、RTOS類、Android、QT等等,下面根據不同的型別選取幾個較為常見的軟體系統進行簡要概述。

  • 作業系統

    • 非實時作業系統

      1. linux:也有實時的linux系統,這裡不做介紹。嵌入式裡面應用最廣泛的非實時作業系統非linux莫屬,小到智慧手錶,大到汽車電子等等都有linux的身影。該系統於1991年由芬蘭的linus torvalds實現,經過多年的發展已經成為功能極為強大的成熟的作業系統,並且原始碼完全公開,商用完全免費。
      2. WinCE:(Windows Embedded Compact),微軟出品,有著比較強大的圖形使用者介面,專門為掌上電腦以及嵌入式裝置設計。WinCE的實時性比linux更好一些,但是相比linux來說,它的可裁減、可移植性都弱了不少,並且linux擁有來自全球黑客的共同協作開發,從某方面來講它的開發支援力度要比WinCE大。核心原始碼開放,但是GUI不開放,商業使用需要一定費用。

      現在在嵌入式消費電子領域,linux的佔用量比WinCE要大,linux的開發者也比WinCE要多,相對來說,linux的職位、市場需求比WinCE要大,也就是說,學linux更容易找到工作哈。

    • 嵌入式實時作業系統(RTOS)

      1. FreeRTOS:創始人RichardBarry,該作業系統是一個輕量級的實時作業系統,功能包括任務管理、記憶體管理、訊號量、佇列、軟體定時器、協程等,在FreeRTOS官網http://www.freertos.org/,這裡可以找到任何FreeRTOS的學習資料與原始碼。
      2. μC/OS:(Micro-Controller Operating System)截至目前,最新版本出到III,該系統前兩個版本是完全開源的,第三個版本不完全開源,雖說原始碼是開源的,但是如果要用於商業用途的話是要收費的(但是據說個人創業者免費,這個都要跟官網的協議進行同步確認),不過目前來說該系統的最新版本還是比FreeRTOS的功能更加強大一點,不過沒有前者更加輕量。該系統是一個可以基於ROM執行的、可裁剪的、搶佔式、實時多工核心,具有高度可移植性,適用於微處理器與控制器。
      3. VxWorks:該系統其實在消費類的嵌入式產品中並不是很常見,但是在軍工、航天、自動化系統中比較常見,該系統擁有強大的開發套件與開發除錯環境,其嚴格的測試流程保證了系統有著較高的穩定性,實時性較linux強太多。不過該系統的授權費用極為昂貴,各種元件都是單獨拆開分別進行授權。該系統的入門較linux更為簡單,但是網路上的資料極其少(估計是不開源的緣故),所以普通的智慧家居、安防、消費電子產品領域,還是linux佔大頭,該系統則用於一些實時性、穩定性要求更高、對成本不是過於敏感的場合,比如航空航天、軍工之類的裝置上面。

      上述前兩個系統都可以執行在類似STM32以及ARM7/9核心處理器上面,從商業角度來講,如果追求免費輕量可以使用FreeRTOS,如果追求功能的完備性,可以使用μC/OS。當然也可以作為個人學習使用,對於個人來說,兩者都有可供獲取的完整的原始碼,並且免費使用,網路上(包括各自的官網)也有很多的學習資料可供選擇,嵌入式學習是FreeRTOS以及μC/OS會是個非常不錯的選擇。有些四軸飛行器上面就有用到FreeRTOS,前兩個實時作業系統對硬體的要求沒有VxWorks高,在一些較為簡單的、低成本硬體系統中使用前兩者是一個不錯的選擇。

  • UI

    • QT:跨平臺的C++圖形使用者介面應用程式開發框架,於1991年由QT Company開發,可以用於開發GUI程式,先後被諾基亞與Digia收購。具有強大的跨平臺普適性,可以支援windows、mac、ios、android等。在傳統軟體與企業應用領域用的較多。
    • Android:Android是基於linux核心開發的一套GUI系統,由google公司完成,目前為止出到Android O(8),現在有非常多的平板、盒子、手機都用到該系統,如果說以前的Android系統還不是那麼好用,那麼從6.0開始,到最新的版本已經非常好用了,當然,這個跟很多因素也有關,不僅僅是系統本身的進步。該系統是開源免費用於商業的,同時不是跟linux核心一樣使用GPL協議,通過HAL將linux核心與上層framework隔開,既使用了linux核心,同時又保證了android相關的廠商不受GPL協議(產品用擁有到GPL協議的程式碼,則產品的程式碼也必須完全永久開源免費)的傳染性所影響,保證了商家的利益,也為該系統的推廣普及鋪平道路。

關於Android系統:在初始的時候是google搞出來跟ios相愛相殺的,話說google有時候就是喜歡搞事情,谷歌做的很多專案起初完全就是沒有奔著賺錢去的(谷歌公司的特性決定了它可以這麼任性),android起初可能就是這樣一個專案,只不過最後成功了。早期的android系統都說比較卡,這與幾個方面有關:
1. android的策略:android對螢幕的響應級別是比較低的,ios是優先響應螢幕事件。
2. 系統碎片化嚴重:這個碎片化不是指記憶體碎片化,由於使用android系統的廠商眾多,如小米、華為、三星等等,還不算無數“山寨廠商”,它們的螢幕大小,硬體都不甚一致,所以一個android程式或者android系統本身就需要適配如此多的硬體平臺,這就註定要犧牲某些效能而導致系統的不流暢,更不用說有些廠商的硬體配置本身就跟不上,不像ios一樣,硬體配置高,並且硬體風格極為統一。
3. APP參差不齊:android系統本身的開放性,使得大量質量不合格的app執行與系統當中,而有的app乾脆用常駐後臺,開它個7、8個後臺執行緒來滿足自己的“特殊需求”,這也是跟國內用不了谷歌有關,ios的app有統一的釋出渠道、統一的稽核,這些都要比android規範很多。

不過現在android已經比以前好多了,系統碎片化的問題雖然還有,但是在慢慢規範,這個也與國內手機廠商的崛起有關,硬體配置慢慢跟上,app慢慢規範化、統一化。

IC設計

嵌入式有一個完整的上下游產業鏈,以手機為例,整個產業鏈的簡要圖示如下所示(當然省略了很多中間步驟,簡化說明):

手機產業鏈

手機上下游產業鏈

上圖少了很多的東西,比如IP提供者不僅ARM,ARM提供處理器核心,還有別的IP也有其它的公司提供,比如方案不僅只有匯頂科技的指紋識別,也有其它方面的方案等等。嵌入式軟體工程師主要的職位需求基本就在黃色區域圈出來的部分,這裡簡要介紹下IC設計方面的知識。

公司

IC設計類的公司基本分為三類,分別是IDM,Fabless,Foundry。

IP:智慧財產權,例如ARM核,A53之類。
SOC:片上系統,比如驍龍835、聯發科X30、全志A20這些。
IC:積體電路,通常指一個行業,積體電路行業。

  • IDM
    全稱Integrated Device Manufacturer,整合元件製造廠商,這種廠商的整個技術實力非常強大,技術領域橫跨機械製造、軟體開發、硬體架構設計、光學電子等等,放眼全世界也就那麼幾個。這種公司從IP開發,SOC晶片設計、晶片代工、封裝測試再到銷售全部囊括在內,屬於垂直整合設計類公司,比較熟悉的有三星、英特爾這些牛氣的大廠。由於整個的晶片製造過程涉及到的工業製造技術非常複雜,技術種類繁多,所以這種型別的公司通常具有很深的技術背景,門檻非常高,並且比較難以複製。
  • Fabless
    這類公司一般只管部分IP設計開發以及整個的SOC設計,技術實力弱點的公司可能用到的IP是購買的多,而技術實力強一點的,IP自己設計的較多,但不管怎樣,最終的SOC設計肯定是公司自己完成的。這類公司就比較多了,比如:高通、聯發科、海思、全志等等。這類公司的技術實力也不差,不要以為SOC設計僅僅是買幾個IP,然後像搭積木一樣毫不費力,其中涉及到各種功耗控制,IP協調等等技術,同樣一些IP,有些公司出的SOC功耗就是低,有的公司就不行,晶片可以實現更加高階的製程。這類公司沒有自己的代工廠,設計出來的SOC需要送到代工廠加工成晶片實體。
  • Foundry
    這類公司就負責晶片的代工,不做SOC的設計工作,這類公司的工業製造技術實力比較強大,代表著尖端的機械設計製造水平。這類公司也比較少,比如:中國臺灣有臺積電,大陸有中芯國際這些,都屬於Foundry類的IC公司。這種公司不同於一般的類似服裝加工這類勞動密集型的工廠,由於本身行業產品的特殊性,使得加工製造一顆晶片與加工製造一件衣服的難度完全不是在同一等級,納米級的微觀尺度加工製造本身就帶來了很多技術難題。不過這類公司的重點不在於我們通常理解的軟體設計,而在於機械製造上面,如何去製造更加低功耗的、更高階工藝的晶片是它們關注的重點。

晶片製程

晶片製程早期有微米級別,到近期最常見的有28nm,22nm,16nm,14nm,10nm。截至目前,最新有高通的10nm製程的SOC。那個XXnm可以理解為大規模積體電路中電晶體的尺寸,為什麼要追求更小的尺寸呢?簡單說就是由於電晶體的作用,電子傳遞時間隨尺寸的減少而減少(22nm之前的可以看作簡單的正比例關係),所以尺寸越小,整體晶片的CPU時鐘頻率就越高,效能就越好。另外尺寸更小,就表明了在晶圓面積一定的情況下可以容納更多的電晶體(更多的功能電路),同時整體的功耗也會降低,成本隨之下降,這也是為什麼各大SOC廠商、晶片代工廠都追求更低尺寸的製造工藝的原因。

題外話:我們經常看到的黑色晶片並不是真正的晶圓電路部分,那些黑色的是外面的樹脂(常用環氧樹脂)封裝,引出的管腳內部才接到真正的“晶片”上面,通常情況下,內部的晶圓電路要比經過環氧樹脂封裝之後的體積要小得多。

行業

職位方向

通常來講,嵌入式軟體主要有幾個方向:應用,驅動,演算法,系統。

  • 應用
    有協議開發,UI開發、業務邏輯開發等等。比如使用QT開發一個汽車智慧中控的圖形使用者介面程式,使用安卓開發一個OTT盒子的應用程式。我們常說的嵌入式應用開發並不包括安卓APP或者IOS APP這些,那些屬於移動開發範疇,一般不把這些看作嵌入式的應用開發。比如一款運動相機,它上面有錄影、截圖、回放等等功能,而這些功能可以分為一個個的應用(也可能這些都是同一個應用),這些功能常常基於linux系統應用程式設計實現,實現這些應用的過程就是嵌入式中的應用開發。其餘的還有像GPS導航終端裝置中的導航程式開發,藍芽裝置上面的連線程式,古時候MP3/MP4播放器的播控程式等等都屬於嵌入式應用開發的範疇。有些常見的協議開發也屬於應用範疇,比如藍芽協議開發,TCP/IP應用層協議開發,Zigbee模組開發等等。
  • 驅動
    驅動常見於晶片原廠,說的比較多的是linux驅動開發工程師。一般驅動開發主要工作是做BSP(板級支援包,圍繞SOC片上系統硬體來做),也有做外設驅動的(sensor-攝像頭,網絡卡等等),對於一家晶片原廠(Fabless型別的公司)來說,一個新出的晶片是需要開發人員做從bootloader到linux核心的適配的,其中包含有USB、flash、I2C、Camera、Framebuffer、SPI、串列埠、DMA、網絡卡等等模組的驅動,不管是在bootloader下的驅動還是整合到linux核心裡面的驅動的開發都可以說是驅動開發。這些要求要對硬體的各種時序協議有較多的開發經驗,比如USB協議、I2C時序、MIPI/CSI(屏、Camera)等等協議與時序要求。還需要對linux核心的架構熟練掌握,一個驅動要想適配到linux核心裡面,最好還是按照核心相關模組的框架來實現的好,完全按照自己的方式來實現相關的驅動的話易用性、擴充套件性、相容性都可能比較差。核心裡面有I2C子系統,SPI子系統,輸入子系統,V4L2視訊框架,USB子系統,網路等塊裝置驅動框架等等,每個驅動工程師需要對其中的某一塊或者某幾塊非常熟悉才能夠勝任驅動開發的工作。
  • 演算法
    一款嵌入式產品可能會包含有很多的演算法,比如對一款運動相機來說,它需要有視訊編解碼演算法、影象處理演算法(ISP)、防抖演算法。而在AI人工智慧興起之後,一些嵌入式產品如安防相機也需要整合人臉識別、車牌識別、運動檢測、景深識別等等演算法。更多的時候,演算法工程師的工作不是去設計一個新的演算法,比如視訊編解碼中的H264、H265演算法已經比較成熟了,不需要自己再去費老大勁搞出來一個性能並不如已有演算法好的演算法,況且大部分公司的財力、技術並不允許自行實現某些高效能演算法。更多的時候,演算法工程師要做的是在某一個平臺上面去實現一個演算法,針對某一個平臺去優化某個演算法,這些是軟體層面的,而有些晶片是直接將編解碼模組做成硬體放在晶片內部的,這部分我倒不清楚具體是軟體還是硬體的職能,亦或是兩者結合。人工智慧潮流的到來讓嵌入式領域也需要更多的優秀演算法工程是參與,比如語音識別(常用語智慧音箱,智慧家居等等),小米的掃地機器人,京東的叮咚音箱,未來還有更多的空調家電類也會整合語音識別功能,而語音識別需要多種音訊有關的演算法工程師通力協作來共同完成一款功能齊全、優秀的產品。安防產業中就更不用說了,大量的視訊演算法相關的工程師都是急缺職位。隨著人工智慧的逐漸發展普及,嵌入式領域的演算法工程師需求量會越來越大,而且工資也一定不會低。
  • 系統
    這個瞭解的不多,理解比較淺顯,舉一個瞭解過的簡單的例子,就拿一款安防產品來說:產品的功能以及規格由產品經理等確定,然後整個系統的設計需要系統工程師的框架規劃,比如採用什麼作業系統?如何建立程式碼工程(包括版本管理工具的選擇、編譯系統的搭建、程式碼框架的構思),整個產品使用什麼框架進行設計(視訊類的開源框架有OpenMAX,OpenGL等等,也可自行設計),開發語言的選擇(什麼時候用C,什麼時候用C++),功能模組的劃分(去耦合)等等。

產品類別

嵌入式領域的產品眾多,列舉部分進行簡介:

  • OTT盒子
    Over The Top。作用是獲取網路視訊資訊,在終端進行顯示播放。不同於老式的IPTV機頂盒,老式的機頂盒連線的不是網際網路,而是電視網,相當於一個區域網,老式的機頂盒僅顯示終端限於電視,而OTT盒子直接連線到網際網路,顯示終端可以是通過wifi或者藍芽等協議連線的顯示裝置,並且有的還可以支援多屏顯示,目前為止國內對OTT盒子的管控比較嚴格,比如OTT在國內不允許觀看直播節目,以及不允許通過USB等媒介安裝應用等,不過OTT盒子的總體需求量是在逐年上升的,在國外OTT盒子算是比較大的一個市場了。國內常見的盒子晶片廠商有海思、全志、瑞芯微、炬力等。盒子終端裝置廠商有天貓、京東、三大電信運營商等。
  • 路由器
    這個都很熟悉了,現在幾乎每家都需要,屬於硬性需求,路由器的開發對網路這塊的要求比較高。
  • IPC
    IP Camera(網路錄影機),常見於安防類產品,比如小區監控,交通燈以及大街小巷無處不在的攝像頭等等,主體功能是實時採集視像、音訊資訊並通過網際網路網路發往伺服器進行儲存,有的也可以進行音訊雙向傳播。老式的模擬錄影機已經逐漸被淘汰,取代代之的是數字、智慧錄相機,現在主流的IPC都在往4K解析度發展,也已經有8K解析度的解決方案了。隨著人工智慧的發展,現在IPC裡面逐漸集成了人臉識別,車牌識別,移動偵測,景深探測等等AI智慧演算法。在最新2017年的深圳安博會現場,有多家安防相關的公司進行展覽。有做智慧演算法的,如商湯、曠視、雲從,商湯之前在深圳的文博會現場採集了20萬人次的人像資料,同時比對出了20多個有前科的人員,這幾個公司的智慧演算法都是國內甚至國際前列,屬於獨角獸級別的創業公司。有做晶片方案的,比如海思、全志,它們提供IPC的晶片以及軟體解決方案,現在的晶片大都支援4K錄影,整合人工智慧演算法。也有做終端IPC產品的,如海康、大華、宇視(合稱海大宇,市場佔有率80%以上)等等,海康的市值從2016年9月到目前為止已經上漲了千億以上,側面也說明了有人工智慧加持的安防產品需求增長迅速。隨著智慧城市的提出以及不斷建設,安防產品的需求量將會進一步加大,有預測,到2022年,安防產品的市場規模會達到萬億人民幣級別(現在已經接近6000億了)。
  • 智慧音箱
    亞馬遜不一定是最早做智慧音箱的,但是它的echo音箱的的確確帶了一波潮流,echo釋出於2014年,經過幾年的發展,已經成為最火的智慧家居產品之一。在國內比較知名的智慧音箱產品有京東的叮咚音箱,小米的智慧音箱,國內銷量最大的是叮咚音箱。智慧音箱開始的時候乍一看並不覺得有多大的市場需求量,當然這個跟多方面有關:一個是它還顯得不夠“智慧”,能做的事情還比較少,也就是產品做的不夠好;另一方面也是由於現在智慧家居的產品普及率還遠沒有手機那麼廣,換言之,就是智慧家居這個氛圍、意識在國內還沒有完全形成。但是隨著技術的發展,生活水平的提高,生活習慣的改變,智慧音箱的普及率以及需求也會越來越高。目前智慧音箱主要的技術模組有:語音識別(包括硬體模組與軟體語音識別演算法),主控晶片,音箱產品終端平臺設計。語音識別模組知名的有科大訊飛、思必馳等;主控晶片知名提供商有聯發科(亞馬遜echo)、全志科技(京東叮咚音箱)、瑞芯微等;音箱廠家漫步者、Doss等。
  • 掃地機器人
    這個也算是未來家庭必備了吧(懶人必備)。掃地機器人看起來好像並沒有什麼技術含量,不就掃個地麼?其實掃地機器人有許多方面的規格要達成,並且不同廠家不同價位的掃地機器人的各方面規格達成與實際表現也不同。最容易想得到的就是路徑規劃能力了,不同公司的機器人路徑規劃演算法種類不同,優劣程度也不同,常見的有兩種,一種可以稱之為隨機規劃,也就是走到哪掃到哪,完全沒有精確的路徑規劃,清潔力度隨著時間的增加而非線性增加。還有一種是有較為合理的路徑規劃的,它首先會對整個室內做一次佈局掃描,然後根據室內佈局進行路徑規劃,一般是U型環回前進的,這樣不會出現愣頭愣腦瞎撞一氣的低效清潔的狀況。另外障礙物的檢測也是比較重要的模組,有的機器檢測到障礙物直接懟上去才知道轉彎,而有的則是離障礙物還有一段距離就轉彎(會導致清掃有死角,不乾淨),有的是遇到障礙物提前減速,然後輕輕撞上之後再轉彎(清掃無死角,不會損壞傢俱機器)。有的機器面對有坡的地方會清掃不力,別的還有狹小空間的清掃能力,遇到纏繞物體(電線、繩子)的逃脫能力等等都是衡量其優秀與否的標準。而這些都需要優秀的演算法作為支撐。掃地機器人的品牌有iRobot、科沃斯、小米等等。
  • 行車記錄儀、後視鏡、汽車中控
    對於有車人士來說是剛需。近年來碰瓷事件頻發,有時候有個行車記錄儀少了很多麻煩,不僅是這個(畢竟小概率),行車記錄儀重點還是在於交通事故等等的錄影備份,有車人士必不可少。行車記錄儀的主要幾個引數就是照片解析度、鏡頭視場寬度、幀率與噪聲。主流的視場角在130~170度之間,因為事故發生時前撞和側撞的概率比較大,需要比較廣角的鏡頭才能夠滿足需求。解析度與幀率啥的就不用說了。做汽車電子比較著名的晶片廠商有海思、安霸、全志、聯詠等。終端產品也有非常多的公司,不太瞭解就不多說了。
  • SDV
    也即運動相機,比如GoPro、小米、小蟻等等。現在主流的運動相機都往4K30幀/60幀這個配置發展,其實運動相機在國內的需求並不是太大,因為大家大部分都忙著上班、上學,再說國內的運動風氣還是遠沒有那些歐美髮達國家那麼濃厚,所以SDV在國外的市場需求還是可以的。現在的SDV大都要整合防抖功能,不管是軟體防抖還是光學防抖,如果是軟體防抖的話對處理器的效能以及軟體演算法的要求會比較高,否則軟體防抖根本沒有視覺上的效果。

可以看出來,上面有很大一部分產品都是需要做視訊支援的,不管是錄影還是播放,所以視訊處理演算法像H264、H265、MJPEG編解碼這些還是非常有應用需求的,所以與之相關的職位也不少,另外對於沒有上安卓系統的產品來說,比如IPC,SDV,行車記錄儀等等(這些都沒有很高的GUI介面要求,所以用不著上安卓系統),還需要在linux系統上面做視訊元件的開發,所以單單視訊這一塊就可以產生巨大的職位需求。

  • 其它
    如共享單車、共享充電寶等一眾共享產品,未來肯定還會有更多的共享電子產品。智慧家居里面的兒童機器人、教育機器人等等。

所需技能

如果是驅動開發的話就需要對linux、RTOS等系統還有硬體的要求就比較高,驅動開發首先需要能夠看得懂各種原理圖、技術手冊,對英文的要求也是比較高。像linux驅動開發就需要對linux核心各種子系統進行深入瞭解,就拿上面那些產品中的涉及到視訊的來說,linux的V4L2架構的熟知是必不可少的,因為這是整個軟體視訊流的源頭,做視訊開發是繞不開這一塊的。

  • 驅動通用技能
    能看懂各種硬體原理圖與技術手冊,包括時序圖、暫存器、管腳接線等等,作為驅動工程師時常要與硬體打交道,免不了調各個模組的時候用到萬用表、示波器、時序分析儀一類的工具,這些也要會用。另外對各種協議(不同的職位方向只要知道不同側重點即可,不必全通)如I2C、SPI、MIPI-CSI、USB、網路棧等等。另外英文水平得要夠好,否則大部分全英的技術手冊,各種spec文件根本看不懂的。就拿一個sensor(比如大名鼎鼎的索尼imx系列攝像頭)驅動工程師來說,就需要掌握如下技能:
    • 不同介面標準與協議的瞭解:sensor的資料介面標準與協議有LVDS、MIPI、Parallel(並口),命令互動介面標準與協議有I2C、SPI、HISPI等。
    • sensor的datasheet閱讀與除錯工具使用:每種介面需要有與之相配的協議時序來驅動,在除錯過程當中難免會出現咋調都沒反應的情況,此時就需要示波器、時序分析儀、萬用表來一步一步排除硬體問題或者時序驅動問題(實際上正確的步驟應該是先確定硬體以及時序,然後再是調試出圖)。
    • linux的V4L2框架:該框架是專門用於linux的視訊流處理框架,幾乎所有執行在linux系統中的sensor都不可避免要用到這個框架,在核心當中omap3isp是一個很好的參考例程。
    • ISP以及影象調優:雖說這部分的工作不一定跟上面一部分是同一個工程師負責,但是ISP驅動框架還是需要掌握的,不同的IC都有自己的ISP模組,大同小異,但是需要知道如何去編寫一個V4L2框架下的ISP模組驅動。

其它的像簡單資料結構如雙向連結串列也是需要掌握的,linux核心裡面有大量的地方用到雙向連結串列資料結構。C語言指標的各種靈活運用也是必須掌握的。

  • 應用
    資料結構、各種應用框架、少量的演算法知識(如排序演算法)、系統級應用程式設計、網路協議程式設計、軟體結構設計、模組化思想、指令碼的靈活運用、linux命令列的使用、編譯器的熟練使用、C/C++,JAVA等語言的掌握等等。拿一個產品舉例,比如IPC(不是針對職位來說,針對這個產品來說):
    • 視訊播控以及使用者介面等框架:比如OpenMAX、OpenGL(用於影象處理)等開源視訊框架,一個IPC產品必不可少的組成部分就是視訊錄製與處理,這些都有可能用得到上面兩個開源框架。使用者介面像QT、MINI GUI等等也是需要掌握的,這個在一些需要圖形使用者介面的產品裡面是必須的。
    • linux應用程式設計與命令列:linux系統環境高階程式設計,包括多執行緒、檔案程式設計、網路程式設計、訊號量等。各種命令列操作如檔案刪除、新建、拷貝、nfs等網路指令、記憶體操作命令、使用者管理等等。
    • 網路協議:IPC通常情況下需要通過網線來進行遠端視訊傳輸,這就要求對各種網路傳輸協議要掌握(包括應用層、傳輸層等),比如TCP/IP、HTTP、RTSP以及ONVIF這種網路傳輸框架等等。
    • 資料結構與演算法:像連結串列、陣列這種就不用說了,還有些設計方法與模型也要掌握,比如最常見的有生產者消費者模型必須得掌握,還有寫雜湊表、快速查詢表等資料結構也是必要的。演算法的話在嵌入式應用上面要求並不是很高,常用的排序、搜尋等演算法掌握就行了。
    • 模組化設計:軟體功能的模組化設計,去耦合,一個好的軟體框架要能夠達到很方便的就能夠增加、減少某個功能而對其它功能不產生影響,要能夠達到對同類型的功能進行聚合歸併管理,減少程式碼量,提高複用率。對於整個軟體結構需要設計的有條例,不能夠說這坨程式碼讓人看上去一臉懵,甚至編寫者過一段時間都理不清軟體邏輯,這樣整個軟體的可維護性、可升級、可重構性都會大打折扣。
    • 各種語言的掌握:像C/C++這些是必須要用到的,不管是應用方案層程式碼還是GUI層程式碼,C++是必不可少的開發語言,像linux系統程式設計就必須得掌握C語言。當然,有些時候也會用到JAVA,比如有的QT程式開發。

其他的演算法這些我就不分類說了,像視訊這塊就需要掌握H264,H265,MJPEG,JPEG的編解碼,ISP的3A演算法,影象識別演算法(人臉檢測、車牌識別等),軟體防抖等等。應用層的各種格式有時候也需要掌握,比如MP4、AVI、RMVB、MKV等等的封裝與解封裝。音訊的話我知道的有音訊編解碼像MPEG編解碼(常見於mp3封裝格式),還有G711,G721系列,AC1系列等等,與音訊質量有關的像音訊濾波降噪,音質增強,杜比音效等等,隨著AI時代的到來,音訊識別演算法也日漸急需。

  • 通用技能
    • git等版本管理:像SVN,git是比較熱門的版本管理工具,對於軟體程式碼工程來說,如果沒有版本管理,那將是一場災難,試想一個數千萬行的程式碼工程如果沒有版本管理,那麼程式碼的合併、程式碼的提交、程式碼的審查、回退等等會多麼困難,整個程式碼工程會變得混亂不堪,光是程式碼版本管理就能耗盡整個團隊的精力。git與SVN不同,前者是分散式的程式碼版本管理協作,無需聯網,從伺服器倉庫下載下來直接在本地編輯,本地提交完了之後同步到伺服器上即可,隨處可用,但是SVN就不行,它是集中式的協作模式,必須依靠中央伺服器版本庫才能夠正常工作。
    • linux命令列操作、指令碼編寫:由於驅動、應用等等開發都有很大一部分時間是在linux機器上完成的,所以linux上面的命令操作必須掌握。指令碼的話是用於自動化工作的,比如編譯過程,有了指令碼可以使得整個編譯過程變得非常方便,如果是單個檔案操作,成千上百個檔案的編譯過程會把人搞死的。另外程式碼工程的編譯系統的建立極度依賴於指令碼以及makefile,而這些又依賴於linux系統,所以這些技能是必須掌握的。
    • 良好的程式設計習慣:包括但不限於良好的變數、函式命名習慣(一致、清晰易懂),讓人看到變數或者函式名就知道這個變數是什麼型別的,主要作用是什麼,這個函式是幹嘛用的。恰到好處的註釋,程式碼的關鍵地方要加上註釋,比如函式作用,引數與返回值必須加以說明,結構體等等變數的作用必須加以說明,函式或者結構體使用時的特別注意事項要加以說明,程式碼中比較難懂的邏輯要加以說明,最好能用函式名或者變數名或者程式碼本身來兼具註釋的功能。良好的邏輯實現,不投機取巧耍花招(雖然看起來很酷,但是程式碼易讀性、易維護性變差)。程式碼風格統一,比如花括號’{‘的位置(if ( i < 0 ) {,換行的都是異教徒哈哈),空格的使用,一行不能夠太長等等。每個公司都有自己的程式設計規範,按照程式設計規範來,有不足向公司提出改進,不要一意孤行。

未來發展方向

嵌入式也算是個比較古老的行業了,可以說在古時候電腦被髮明的時候就有所謂嵌入式這個行業了,隨著不斷地發展,嵌入式軟體有一個比較明顯的趨向:系統化、AI智慧化、物聯網。

  • 系統化
    現在的電子產品都在朝著系統化的道路前進,現在甚至連鐘錶、手環等產品裡面都跑著一個系統,不管是RTOS類的還是linux類的,亦或是自家開發的,總之,嵌入式產品越來越多的使用到了作業系統級別的軟體平臺,而不再是以前的裸機裸跑的情況了。
  • AI智慧化:相比今年來各大行業都被AI刷了一波節奏,有的是噱頭,有的則是實實在在的智慧化,有相關的落地產品。而嵌入式就屬於後者,這裡說的AI話不是指強人工智慧,而是指在嵌入式軟體當中越來越多地用到了人臉識別、語音識別、環境偵測等等智慧演算法,未來還不排除會加入深度學習(實際上智慧手機已經在慢慢加入硬體級別的自主學習演算法)。AI智慧化的產品應用有四旋翼飛行器、智慧音箱、智慧安防、手機、機器人等等。
  • 物聯網:萬物互聯、智慧家居現在看起來還是感覺比較遙遠,但是已經能夠看到方向、摸到入口了。ARM為物聯網時代的到來還專門成立了物聯網平臺以及為物聯網服務的作業系統。而國內的一些行業、廠商也在為物聯網、智慧家居而努力著,比如海爾、格里、美的的智慧家電,小米的掃地機器人,智慧音箱,家庭化小型機器人等等產品的研發與生產

最後,來一張2017積體電路行業薪資表(來源網路,出處見水印),打打雞血,嵌入式的同行們一起努力哇:

2017積體電路行業薪資表

2017積體電路行業薪資表

軼事

我最早接觸嵌入式算是大學二年級,那個時候做過飛思卡爾、全國電賽等等。我參加的是第十屆飛思卡爾智慧車競賽,等到了第十一屆的時候飛思卡爾被恩智浦收購了(那一屆叫恩智浦杯),而等到再往後恩智浦又被高通收購了(又改回飛思卡爾),現在想想也是有點感慨。

git編寫者也是linux系統的創造者linus(太牛逼了),github是基於git的一個程式碼託管網站,linus本人也進駐了,有自己的程式碼倉庫,在裡面可以看到linux、git最新版本的原始碼(程式碼世界的兩大頂樑柱級別的工具),而github也慢慢發展為最受歡迎的開原始碼託管網站以及社群。最初linux是被自由軟體基金會GNU選中作為其開源軟體的一員而慢慢發展壯大(也算是一部分機緣巧合),GNU致力於軟體的開源、免費,是真正的永久開源、免費,這個相比對於各大碼農來說是非常友好的,也是一大部分碼農嚮往的願景,像GCC,Emac,gdb等等牛逼的軟體工具都出自於GNU這個組織。

ARM近年來也在開發一項技術,叫做ACP,這個技術可以使得IC上面的外設可以不通過CPU即可相互訪問對方的記憶體,想下DMA吧,ACP要做到不止於DMA,當然這項技術什麼時候、能否問世還有待商榷。

如果覺得本文章不錯,請關注微信公眾號-YellowMax多多支援,檢視更多文章

歡迎轉發、關注、點贊一波

微信公眾號