聽說嵌入式學習很難,對嗎?門檻也比較高
簡單回答:對。===============================================================具體解釋:
【具體解釋1】
把我剛寫的,用於解釋嵌入式領域的內容,貼出來,或許可以幫你你看的更清楚:對於嵌入式領域中會聽到,見到的,涉及到如此眾多的領域,技術,晶元,公司,開發工具,軟體平台等等名稱,很多人在開始接觸的時候,都會很暈。而這裡,嘗試用初學者所能聽得懂的方式去解釋一些常見的名詞,所處的地位和作用-&>由此也驗證了那句:搞嵌入式開發,尤其是底層開發,相對來說,難度還是要比上層軟體要難的接下來,我熟悉的嵌入式Linux中Nand Flash驅動開發為例來解釋說明具體過程和所涉及到的內容:假如你是個普通的嵌入式驅動軟體開發者,你的老闆給你安排一個嵌入式Linux中Nand Flash驅動開發的任務的時候,就會直接或間接接觸到很多東西:嵌入式Linux中Nand Flash驅動開發期間
直接涉及到的
間接相關的,類似的,類比的
備註
首先,此處所從事的開發領域,是一個消費類數碼產品,比如電子書,
於此對應的,同級別的,其他開發領域有:工業控制,醫療器械,汽車電子等等行業
-&>其他不同行業內,所要接觸到的開發任務,往往又是完全不同的任務
-&>比如工業控制領域所涉及到的現場匯流排Fieldbus,對於搞消費類數碼的人來說,甚至可以說很多名詞和概念都沒聽過。
-&>更別說,讓你去折騰HART,FF(Foundation
Fieldbus),Profibus,了,其和消費類數碼領域,很多技術都是完全不同和不相關的
相關內容:
現場匯流排Fieldbus簡析
其次,此處的操作系統用的是嵌入式Linux系統-&>目前在嵌入式領域內使用可以說是最廣泛的
與此對應的,同級別的,其他的,嵌入式操作系統也有很多,比如:ucOS/II,VxWorks,等等。
而對於Nand Flash,作為其中一種設備,一種介面,與此對應的也有其他很多協議/設備/介面,比如:Nor Flash,Bluetooth,USB,RS232,SD/MMC等等;
-&>換句話說,有可能過些天,你的老闆讓你去實現Linux中的SD/MMC驅動。
而接著你就開始去折騰Linux下面的Nand Flash晶元驅動的開發了,然後你可能就會接觸到很多很多相關知識了:假如所用的硬體,先是嵌入式開發板,所用SoC晶元是S3C2440,是基於ARM的ARM920T內核的晶元:
嵌入式開發板
-&>網上也有很多其他開發板,就是用來賣給你們,用來折騰的,用來搞嵌入式開發的-&>比如你可以花點錢,買個對應到板子,用於練手,練習各種驅動的或應用的開發;
SoC
-&>此處的嵌入式CPU,很多時候,用的是另外一個標準叫法,SoC,而與SoC類似(但不相同的)概念還有MCU,DSP,ASIC,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
-&>類似的內核系列還有ARM922T,ARM926EJS等等,以及後來出來的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環境構成等等
交叉編譯環境
使用交叉編譯工具鏈:已有交叉編譯器,配置好環境就可以用來交叉編譯了;
製作交叉工具鏈:沒有交叉編譯器,則需要自己去製作交叉編譯器,比如用Buildroot,crosstool-ng等等去製作
相關內容:
交叉編譯詳解
crosstool-ng詳解
整套的嵌入式Linux環境:uboot+kernel+rootfs
典型的嵌入式Linux開發環境主要構成就是:uboot+kernel+rootfs
-&>與嵌入式Linux對應的有,WinCE,其又是不一樣的,自己一套的開發環境
-&>期間就可能會涉及到,用ARM自己的開發工具去在Windows主機上面交叉編譯了,ARM的相關開發工具有ADS,RVDS等等
Uboot
叫做bootloader,類似Uboot的還有vivi,Redboot,(WinCE下的)Eboot等等
Kernel==Linux Kernel
指的是Linux的內核,類似的,就是完全另外一套的WinCE環境了。
Rootfs
rootfs內容:各種製作rootfs的工具,手動製作,用工具製作(比如用Buildroot生產的rootfs)
rootfs格式:用哪種文件系統,此處假如用yaffs2
Yaffs2
類似的,適用於Nand Flash的文件系統還有JFFS2,YAFFS,UBIFS
對應著,還要有製作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的內部結構的Block,Page,OOB,數據需要用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等等
瀉藥, @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歲,沒工作,沒人愛,未來的路怎麼走?