聽說嵌入式學習很難,對嗎?門檻也比較高


簡單回答:

對。

===============================================================

具體解釋:

【具體解釋1】

把我剛寫的,用於解釋嵌入式領域的內容,貼出來,或許可以幫你你看的更清楚:

對於嵌入式領域中會聽到,見到的,涉及到如此眾多的領域,技術,晶元,公司,開發工具,軟體平台等等名稱,很多人在開始接觸的時候,都會很暈。

而這裡,嘗試用初學者所能聽得懂的方式去解釋一些常見的名詞,所處的地位和作用

-&>由此也驗證了那句:搞嵌入式開發,尤其是底層開發,相對來說,難度還是要比上層軟體要難的

接下來,我熟悉的嵌入式Linux中Nand Flash驅動開發為例來解釋說明具體過程和所涉及到的內容:

假如你是個普通的嵌入式驅動軟體開發者,你的老闆給你安排一個嵌入式Linux中Nand Flash驅動開發的任務的時候,就會直接或間接接觸到很多東西:

嵌入式Linux中Nand Flash驅動開發期間

直接涉及到的

間接相關的,類似的,類比的

備註

首先,此處所從事的開發領域,是一個消費類數碼產品,比如電子書,

於此對應的,同級別的,其他開發領域有:工業控制醫療器械汽車電子等等行業

-&>其他不同行業內,所要接觸到的開發任務,往往又是完全不同的任務

-&>比如工業控制領域所涉及到的現場匯流排Fieldbus,對於搞消費類數碼的人來說,甚至可以說很多名詞和概念都沒聽過。

-&>更別說,讓你去折騰HARTFF(Foundation
Fieldbus),Profibus,了,其和消費類數碼領域,很多技術都是完全不同和不相關的

相關內容:

現場匯流排Fieldbus簡析

其次,此處的操作系統用的是嵌入式Linux系統-&>目前在嵌入式領域內使用可以說是最廣泛的

與此對應的,同級別的,其他的,嵌入式操作系統也有很多,比如:ucOS/IIVxWorks,等等。

而對於Nand Flash,作為其中一種設備,一種介面,與此對應的也有其他很多協議/設備/介面,比如:Nor FlashBluetoothUSBRS232SD/MMC等等;

-&>換句話說,有可能過些天,你的老闆讓你去實現Linux中的SD/MMC驅動。

而接著你就開始去折騰Linux下面的Nand Flash晶元驅動的開發了,然後你可能就會接觸到很多很多相關知識了:假如所用的硬體,先是嵌入式開發板,所用SoC晶元是S3C2440,是基於ARMARM920T內核的晶元:

嵌入式開發板

-&>網上也有很多其他開發板,就是用來賣給你們,用來折騰的,用來搞嵌入式開發的-&>比如你可以花點錢,買個對應到板子,用於練手,練習各種驅動的或應用的開發;

SoC

-&>此處的嵌入式CPU,很多時候,用的是另外一個標準叫法,SoC,而與SoC類似(但不相同的)概念還有MCUDSPASIC,FPGA等等;

S3C2440

-&>此處是三星的晶元S3C2440,三星自己家的其他基於ARM內核的晶元還有很多,比如S3C2441,S3C6410等等。而與此類似的

-&>類似三星的,也還有其他廠商,可以有能力自己去設計MCU,SoC,比如常見的意法半導體ST Microelectronics的STM32系列的晶元,比如STM32F103VGT6,其是ARM的Cortex-M3內核的,所以全稱一般叫做:

STM32F103VGT6 ARM Cortex-M3 MCU

ARM

-&>ARM是一家IP公司,專門設計CPU內核,所謂的IP Core,但不生產。

-&>其他晶元設計公司,比如三星Samsung飛思卡爾Freescale等等去用ARM的內核設計自己的SoC或MCU。

-&>與此相對的,另外也有一家做IP的公司叫MIPS

ARM920T

-&>類似的內核系列還有ARM922TARM926EJS等等,以及後來出來的ARM
Cortex系列,Cortex-M3是比較流行的一個系列

現在很多開發板,都是採用比較新的,流行的SoC,而也是基於ARM內核的,比如最新一點的ARM11,ARM Cortex-M3等等;

然後再接著說工作細節中涉及到的Nand Flash晶元方面的知識,此處假設用的Nand
Flash晶元是三星的K9GAG08U0M

Nand Flash

-&>和Nand Flash對應的Flash技術還有Nor Flash,以及其他更進一步的封裝後的LBA Nand Flash,eMMC等等。

三星的Nand Flash

-&>與此對應的是,其他還有很多Nand
Flash晶元廠商,比如Micron鎂光,東芝Toshiba,Hynix海力士,閃迪SanDisk等等,Intel因特爾

K9GAG08U0M

-&>其他還有很多常用的三星的Nand
Flash晶元,比如K9LBG08UXD等等。

然後再說開發所涉及到的軟體,包含很多方面,一個個說:交叉編譯環境,嵌入式Linux環境構成等等

交叉編譯環境

使用交叉編譯工具鏈:已有交叉編譯器,配置好環境就可以用來交叉編譯了;

製作交叉工具鏈:沒有交叉編譯器,則需要自己去製作交叉編譯器,比如用Buildrootcrosstool-ng等等去製作

相關內容:

交叉編譯詳解

crosstool-ng詳解

整套的嵌入式Linux環境:uboot+kernel+rootfs

典型的嵌入式Linux開發環境主要構成就是:uboot+kernel+rootfs


-&>與嵌入式Linux對應的有,WinCE,其又是不一樣的,自己一套的開發環境

-&>期間就可能會涉及到,用ARM自己的開發工具去在Windows主機上面交叉編譯了,ARM的相關開發工具有ADSRVDS等等

Uboot

叫做bootloader,類似Uboot的還有viviRedboot,(WinCE下的)Eboot等等

Kernel==Linux Kernel

指的是Linux的內核,類似的,就是完全另外一套的WinCE環境了。

Rootfs

rootfs內容:各種製作rootfs的工具,手動製作,用工具製作(比如用Buildroot生產的rootfs)


rootfs格式:用哪種文件系統,此處假如用yaffs2

Yaffs2

類似的,適用於Nand Flash的文件系統還有JFFS2YAFFSUBIFS

對應著,還要有製作yaffs2的rootfs的工具:mkyaffs2image

真正開始涉及到嵌入式Linux底層的Nand Flash驅動的開發的話,又會接觸到很多技術和框架,名詞

Linux驅動框架

不論你是實現哪個設備的驅動,都需要先搞懂本身Linux系統下的驅動框架和模型是什麼樣的

-&>然後才能搞懂,框架幫你實現了哪些通用的功能,需要自己實現餘下的設備相關的功能

MTD

Linux中對於Nand Flash等設備所設計的框架,如果寫Nand Flash驅動,就是基於該框架下去實現自己晶元的驅動


-&>於此相對的,其他Linux中還有其他很多技術框架,比如針對音效卡音頻的ALSA等等。

Nand Flash的技術細節:Block,Page,OOB,ECC,Wear Leveling

真正開始學習和了解Nand Flash驅動的話,會涉及到很多技術細節,比如Nand
Flash的內部結構的BlockPageOOB,數據需要用ECC演算法校驗保證數據無誤(硬體還是軟體ECC,ECC演算法是BCH的話支持4位還是8位),為了延長使用壽命而去實現負載平衡Wear Leveling,等等需要考慮很多

相關內容:

【詳解】如何編寫Linux下Nand Flash驅動

Linux的使用和操作

在具體驅動開發期間,不可避免的要涉及到常見的Linux的使用,包括各種命令的用法,Linux系統基本原理和目錄結構,都是避不開,要了解的。

-&>比如常見的ls,mkdir,rm,pwd,chmod,chown,ln等等。

Makefile

在開發期間,也會遇到用make命令,執行Makefile文件

-&>嵌入式Linux中,往往都是用Makefile去管理項目的

-&>為了了解項目代碼的編譯過程,也需要學習和了解make的機制

-&>於此對應的,Windows系統下的很多軟體,項目,代碼的開發,往往都是集成了IDE,可以使很多人避開Makefile

開發輔助工具:SourceInsight,BeyondCompare,虛擬機VirtualBox,Ubuntu,。。。

典型的開放期間,也往往會用到,用於查看Linux內核源碼的SourceInsight,用於比較文件差別的BeyondCompare,用於搭建編譯環境的虛擬機VirtualBox+Ubuntu,等等等等。

總結:

1.搞嵌入式開發,更多的時候,需要先搞懂所涉及的技術所處的層次:

哪個行業,哪套硬體和軟體平台,哪個軟體平台下的什麼框架,最終才是某個具體的技術

只有這樣,才能知道自己在幹嘛,而不是完全一頭霧水的埋頭寫代碼。

2.正因為嵌入式開發涉及到的概念,軟體,硬體,平台,比較多,需要的背景知識比較多,所以才會有那個結論

-&>總體來說,搞嵌入式軟體開發,入門比較難

-&>至少比其他上層純軟體的入門要難不少

===============================================================

【具體解釋2】

如果你說的嵌入式指的是傳統的嵌入式,尤其是那種嵌入式linux環境(如uboot+kernel+rootfs)的話,往往需要了解很多的背景知識,包括但不限於:

  • 硬體
    • 各種硬體介面或協議
      • 如Nand Flash,RS232,USB,Wireless,Video,Camera,GPIO,Keyboard

  • 軟體
    • (某個設備的)驅動的基本工作原理
      • 比如Nand Flash的基本的工作原理

    • 在Linux平台下的對應的驅動框架
      • 比如Linux下面的MTD框架
    • 自己給某設備寫驅動時需要了解具體設備的特性
      • 比如某個開發板中的Nand Flash的控制器(Controller)的特性,以及Nand Flash晶元的參數
        • -&> 如此,才能去做嵌入式Linux下的Nand Flash的驅動開發。
    • 以及其他上層的軟體框架
      • 包括不同的操作系統,比如Linux,ucOS/II,VxWorks等等

總之:

做嵌入式Linux開發,往往是需要了解硬體工作原理,以及軟體的系統和框架,和具體的某技術的細節,才能去開發對應的功能,驅動。

並且和純軟體相比,還要去買對應的開發板去練習。

所以說,嵌入式開發相對門檻要高些:

不僅僅要掌握的相關的軟體知識,還要掌握基本的硬體知識,其次還要有硬體設備供你開發和調試。

而上層軟體,純軟體的學習和入門,往往只需要基本的入門知識和一台電腦足以。

更多相關內容,可以參考我給其他問題的回答:

嵌入式學習?

關於嵌入式驅動的學習?

自學嵌入式軟體開發(驅動方向),是否應該先學一下STM32?如何達到企業招聘要求?


瀉藥, @Keal 很難,很高,不對複雜問題因果關係分類,就用籠統的很難,門檻很高來回答,就是耍流氓。說的好像學校裡面老師都是這麼回答問題的。

那麼為什麼很難,很高呢?原因分類吧,這個難和高都是一個相對和模糊的概念,具體有這麼幾點。

---------------------------------------------------------------------------------------分割線-------------------------------

1、專業知識體系結構不全

可以做嵌入式開發的專業比較多,大概有計算機(包括軟工、網工),通信、電子、自動化、微電子、數學,機械工程等待(或許我還有忽略的)。

可是知識體系要求

(1)較深的計算機底層基礎(軟體基礎):

C語言、數據結構、操作系統、網路、組成原理(包括單片機)

(2)較好的電子技術基礎(硬體基礎):

電路,模擬電子,數字電子技術,電磁兼容(EMC)

(3)相關的理論背景(根據項目實際方向可選):

射頻電子技術,通信原理,信號與系統,自動控制原理,無線通信,音視頻技術,圖像處理技術,電力系統分析,電力電子技術,機械原理,數控技術…………數不清了。

主要原因在於,嵌入式技術本身也是個很廣的概念,或許說應該是個通用工具,就像螺絲刀一樣的(難道擰螺絲只有機械專業才能學嗎?),應用的範圍也很廣,其廣度和應用應該是高於伺服器前端開發。所以牽涉到的計算也多,知識集合裡面的東西,估計沒幾個大牛能完全齊全。。。。。。。。。。尤其是剛從學校畢業的學生,更不可能齊全。我們國家的大學教育根本就沒這個專業(主要是因為專業課程結構不合理,課程體系還是八九十年代的老古董,不符合市場需求)。

相關專業中,

計算機類專業:軟體功底或許好一些,硬體基礎薄弱。

電子通信類專業:硬體功底好一些,軟體功底薄弱。

機械,生物醫學等專業:有一定應用背景,但是軟體硬體基礎都相對薄弱。

所以要學嵌入式技術,在學好(1)、(2)兩項基本基礎之上,在學習相關行業應用背景。所以其學習時間較長,積累經驗需要時間,造成了學習門檻高。

2、對所涉及行業板塊概念不清

按照現在的嵌入式技術應用範圍,大概分為如下幾個板塊,每個板塊技術要求會不一樣。同時牽涉到要不要跑操作系統(這是一個大坑,有些行業要跳,有些行業就一輩子)

(1)消費電子板塊

對軟體要求多一些,需要Linux和Android

(2)通訊電子板塊

需要Linux和SMP,通信,無線等背景知識,或者DSP

(3)汽車電子板塊

需要RTOS,自動控制,機械相關知識

(4)醫療電子板塊

需要Linux,信號、圖像,醫學相關背景,或者DSP

(5)工業控制、儀錶與電氣工程板塊

部分需要Linux和RTOS、部分單片機或DSP(可有,可無操作系統內核),自動控制,電力系統,電力電子,信號系統相關知識。

這幾個板塊的市場份額是變化的,曾經(5)板塊是份額最高的,而且單片機在其中應用最廣,也是第一批嵌入式人發家的財富之源。所以他們就覺得不需要操作系統,會單片機,C語言,模數電就行,也造成了現在的誤區。

3、對具體公司要求不清楚

這裡就一句話,大公司流程清晰,分工明確,軟體硬體接線清晰。

小公司分工管理不清,很多東西,軟體硬體都要一個人搞,老闆只管結果和賺錢(東西能動,能用第一位),尤其是一些工程類小公司。

然後考慮到,能進大公司和小公司,是要根據畢業學校牌子的。

而且嵌入式領域,小公司也是很多很多的,所以,紮實的硬體功底,以防不時之需……

大概就這樣吧


嵌入式軟體開發有什麼難的,無非就是要心細加耐心而已。遠沒有學範疇論和Haskell難。

嵌入式軟體開發主要是跨越了軟硬體的邊界,做嵌入式軟體開發的人一般需要對硬體有一定深度的理解,因此有很多人覺得門檻高。越過了軟硬體的邊界後,相對就容易多了。

嵌入式軟體相對是比較簡單的,系統相對是簡化的。其軟體複雜度一般都比起他大系統的系統軟體的複雜度低,比如dbus、sqlite、Android的surfaceflinger、camera service和HAL等。

嵌入式軟體開發的另一個問題是debug麻煩,不像普通軟體一樣有很好的調試工具,特別是調試有些硬體導致的問題的時候。有時解決問題需要冥想。

實際上不管是nucleus、threadx、ucOS還是Linux中的驅動都是一種應用而已,只不過和上層應用相比有著更多的許可權和操作硬體的便利。其本質都是解決問題的邏輯的實現。


恩,對,這個世界上設備太多了。


嵌入式麻煩的地方在要有設備,不容易練習。

另一個就是只能 c/c++ 這種接近機器的語言開發,類庫支持也少,難以寫出高質量代碼。


推薦閱讀:

工作莫名其妙被人罵怎麼辦?
現在在一家數據中心做運維工作,如何向身邊不是這個圈子裡的朋友最簡單的描述自己的工作內容?
年齡30+,沒有特長,學什麼技能可以找到一份年紀再大點都可以繼續做的工作?
如何評價貴州清鎮改革推行連上 22 天休 8 天?
女,30歲,沒工作,沒人愛,未來的路怎麼走?

TAG:學習 | 工作 | 嵌入式軟體開發 |