嵌入式開發須要學習哪些東西

本文轉自迅爲開發板iTOP-4412開發板實戰手冊:http://www.topeetboard.com算法


剛剛讀到這篇文章,對於剛入門嵌入式來講挺有用的,獻給向我同樣正在迷茫,苦於沒有頭緒,沒人指引的學習朋友們。
主要討論下嵌入式技術學習方法,主要是針對嵌入式軟件。
嵌入式技術是一門邊緣科學(又稱交叉科學),涉及的內容很是普遍,前幾年不少學校,包括一流的大學都在討論要不要設置這個專業。不是說設置這個專業自己有什麼問題,而是由於課程設置不容易安排,若是偏硬件的話那就成了電子工程一類的專業,若是偏軟的話就成了計算機專業。
正由於如此,不少人在學習嵌入式技術的時候,不知道從哪裏方面入手,由於知識體系很是龐雜,若是沒有指導,極可能會長時間不得要領,學習效率會不好。
那麼,下面探討一下學習方法,用比較簡潔的方式,讓你們明白嵌入式系統知識體系,以及它的整個脈絡。
1嵌入式開發學習方法-框架學習法
嵌入式系統的學習方法不少人都講過,相信你們在網上或者其餘渠道接觸過一些思路和方法,在這裏講一下我的的體會。
首先來講,學習有沒有捷徑呢?一種說法是能夠速成,幾天就能夠學會,我認爲速成的說法太誇張了,那是不可能的事情。
有些人講學習沒有捷徑,你必須通過長期的努力,所謂功到天然成。可是學習嵌入式技術,若是說沒有好的方法那也是不對的,學習一門新的知識體系確定是要下工夫,可是也須要有好的指引,也就是捷徑,實際上這裏是講的就是學習方法。
方法很重要,若是沒有方法,閉着眼亂學亂撞,確定是不行的。就像咱們去找一個沒有去過的地方,本身跟着感受去找,找到的但願很小,若是手裏面有張地圖,而且還有指南針,那就快不少;若是咱們有導航,天然是更快更方便了。實際上,這就是方法的重要性。
那麼在這裏,咱們來介紹一種學習方法,這種方法也是迅爲公司多年培訓和產品開發經驗所總結出來的。
你們可能會問了,迅爲也作過嵌入式培訓?實際上咱們有很豐富的培訓經驗。
咱們以爲,‘框架學習法’是最適合初學者採用的一種方法,這裏麪包含了快速原型的思想;也就是框架學習,快速原型。那麼這裏面的主導思想呢,就是從一開始就要看到嵌入式系統知識領域的全貌,而後逐漸深刻!編程

好比說,咱們想了解北京這座城市,若是在衚衕裏轉來轉去,可能幾年都搞不清楚這個城市是什麼狀況,若是咱們先經過北京地圖學習一下,瞭解下天安門在什麼地方,鳥巢在什麼地方,香山八達嶺在哪裏。再加上咱們到這些地方去看一看,可能很快就掌握了這座城市的全貌。
在這裏須要注意的是,即使是咱們有了地圖,也須要有一些基礎,好比咱們要知道什麼是天安門,知道鳥巢的來歷,明白八達嶺是怎麼回事,實際上這些就是基礎知識。也就是說咱們在學習系統框架以前要具有必定的基礎,不然這張地圖也是看不懂的。
學習嵌入式技術也是須要必定的基礎的,一下子咱們專門講須要什麼樣的基礎。
接下來若是咱們想進一步的瞭解這座城市,就要去研究這座城市的歷史,甚至是中國的歷史。更細一步呢,還能夠進一步研究故宮自己的地圖。
那麼這樣一環套一環。通過不斷的研究,逐漸就會掌握這座城市的地理、文化、政治經濟等特色。
經過了解北京城這個簡要的例子,運用框架學習法,在對不一樣層次的框架的學習過程當中,逐漸瞭解和掌握整個系統。
若是咱們不注意方法,天天在衚衕裏面來回轉悠,確定是事倍功半,將在很長時間不得要領。
2嵌入式系統學習的框架
學習嵌入式也是這樣。必須掌握必定的方法,才能比較快速有效的學習。
那麼這個方法就是框架學習法,剛纔咱們也講了,首先在瞭解這個基礎框架以前咱們要有必定的基礎,那麼這個基礎呢就是單片機和C語言,不須要你掌握的有多好,但必定要具有必定的C語言編程能力。像其餘有些課程,好比計算機專業的編譯原理、數據結構,計算機系統體系結構,這些知識實際上還不太須要,瞭解一下就能夠了。
有了C語言編程基礎,而且學過單片機,這個時候就能夠學習一下嵌入式Linux的基本框架了,很簡單,那就是要搞清楚bootloader、Kernel、和文件系統,接下來簡單介紹一下。
什麼是BootLoader呢?
實際上它是個引導程序,也就是硬件復位之後第一個要執行的程序,它主要工做就是初始化操做系統運行的環境,好比說內存、定時器、緩衝器等,當這個工做作完之後,再把操做系統的代碼加載到內存,而後操做系統就能夠啓動並執行,到此爲止,bootloader的任務就完成了。
那麼有人問了,沒有bootloader行不行呢,能夠的!可是呢,由於操做系統自己通常是個通用的軟件,它要在不一樣的平臺上運行,好比X86,ARM,POWERPC等等,而不一樣的處理器的初始化操做是不一樣的,若是操做系統的軟硬要考慮在啓動時候各類平臺的差別性,那就顯得過於複雜。除此以外,也有其餘方面的緣由,好比燒寫系統的便捷性考慮等等,這裏暫不作深刻的探討。
經常使用的bootloder有不少種,好比U-BOOT、REDBOOT、LILO等等,咱們開發板用的是Uboot。
什麼是Kernel呢?
Kernel就是Linux的內核,也就是說Linux操做系統自己的代碼。那麼U-BOOT啓動到最後,就是把它加載到內存,而且跳轉到Kernel來執行。
什麼是文件系統呢?
如今咱們來介紹一下文件系統,這裏須要瞭解一個事實,就是說Linux啓動到最後必定要掛載一個文件系統。這個是Linux的一個特色,它不像其餘操做系統,好比像VxWorks,是不須要文件系統的,VxWORKS沒有文件系統也能夠運行。 並且還須要瞭解一點,像QT系統、Android、以及Ubuntu系統它們的底層都是Linux內核,不一樣的是她們的文件系統不同,也就是說,Android系統相關的一些代碼,好比說圖形界面系統、Android的虛擬機,Android的框架代碼都在Linux最後掛的文件系統裏面。 若是你們理解了這點,那麼這幾個系統的基本架構也就清楚了。數組

搞清楚了這幾個概念,實際咱們就瞭解了Linux系統最基本的框架,而後呢咱們根據開發板配套的資料,去學習如何編譯這幾個文件,由於像Uboot、Kernel、文件系統,最後編譯生成出來分別是一個獨立的文件,就是說會生成三個文件,最後咱們要學會把這幾個文件燒寫到板子上。
學會了編譯和燒寫,接下來呢,咱們在這個框架的基礎上,去學習如何作Linux上面的應用程序。
什麼是應用程序(APP)呢?這也是框架的內容,它是跑在操做系統上面,經過調用操做系統的資源去工做,是最終的業務邏輯,好比咱們Windows上面有不少的應用程序,好比QQ、暴風影音、WORD、EXEL等,各類各樣APP有不少。
根據咱們後期的視頻教程,你們應該很快就能學會,好比說串口程序、網絡程序等等,這些都是應用程序,咱們不須要作太多,學習幾個加深一下對框架的認識就能夠了。
再接下來,咱們就須要學習Linux驅動方面的一些知識了,這也是在基礎框架裏面的,驅動程序能夠當作是操做系統的一部分,它在底層專門和硬件打交道。那麼你們稍微瞭解一下,就會知道Linux的驅動包括有三種:字符設備、塊設備以及網絡設備。
這個時候呢,你們要注意,只須要學習字符類設備驅動,其餘兩種先不要去管。必定要記住,最初學習嵌入式技術的時候不要去研究塊設備和網絡設備。也就是說,把字符類設備搞明白就能夠了。由於通常的公司開發嵌入式的產品僅限於字符設備的開發,掌握字符設備的框架思想和開發步驟就可以勝任了。至於塊設備和網絡設備,直接用開發板或者某個開發平臺自己提供的驅動就足夠了,這些是一線處理器廠家作的事情,通常狀況下不須要咱們去完成,這些處理器研發的廠家在爲處理器開發配套BSP的時候纔會涉及這些工做。
固然了,有的同窗可能會講,某某公司就是在作塊設備驅動,個人意思是講,從嵌入式這個行業整體上來說,大多數公司都不須要那麼作,不少技術都是直接拿來用。咱們掌握了字符設備驅動的開發方法,已經可以應付大多數公司的開發要求,對於一個尚未入門的學生來說,必定要按照我說的辦法來學習。
等未來熟練掌握基本技能之後,能夠根據框架學習的方法,再去研究更深刻的編程。這個時候,那些計算機專業的課程,好比數據結構、計算機系統體系結構、各類算法等等就能夠派上用場了,本身的水平也會在學習的過程當中再次昇華。安全

學習字符類設備驅動,請跟着迅爲的視頻去學習LED的驅動編寫方法,以及蜂鳴器、AD轉換等這些跟GPIO相關的驅動開發技巧。
掌握了這些,能夠講,咱們已經成爲了一個比較合格的嵌入式驅動工程師!網絡

這個時候我進一步介紹一下什麼是快速原型,若是學過軟件工程的話,那麼你們會據說過一種自頂向下的產品開發方法,這個方法頗有效,多數產品的開發方法都是遵循這個思想,大概就是從最初的可行性分析,而後概要設計、詳細設計,編碼,測試等等。
除此以外呢,還有一種開發方法就是‘快速原型’,這個是微軟採用的一種方法,簡而言之呢,快速原型是個逐漸迭代的方法,就是說讓產品儘快把雛形開發出來,而後逐漸清晰,一步步走向成熟。
在這裏咱們把快速原型法用到學習上,它原來是種開發方法,咱們這裏借鑑過來,借鑑到框架學習的思想上。
也就是說,咱們掌握必定的基礎之後,就要去學習框架,當這個基礎框架清晰之後,再去學習更新更深刻的框架知識,這樣一環套一環,環環相扣,最終研究愈來愈深刻,進而成爲這個行業的專家。
那麼在嵌入式行業的工程師的職位其實也是這個樣子的,你們看一下:
基本數字電路 + C語言 + 基礎框架知識 -----> 嵌入式驅動工程師
數組結構+編譯原理 ------> 高級嵌入式驅動工程師
計算機系統體系結構 + 操做系統(從抽象到具體)-------> 系統架構工程師數據結構

由於在第一個階段,你會發現,只要會C語言,有良好的編程功底就夠了,在工做的時候不多涉及到編譯原理、數據結構這些方面的知識,那麼不少其餘專業的畢業生,甚至原來學機械設計的同窗均可以成爲嵌入式驅動工程師。
實際也是這樣,在大多數嵌入式技術公司,尤爲是應用產品開發的公司,只要瞭解基本的Linux架構的知識,而且可以編寫字符類的驅動程序就夠了。由於像網絡設備驅動以及塊設備驅動,基本都有個DEMO設計,只要參考這個DEMO作就能夠,根本不須要咱們作什麼,若是說須要作的話,那也是改一下GPIO的設置,修改一下中斷的引腳,僅此而已。
那麼深刻學習的話,分析操做系統源碼的時候就會發現,數據結構的知識逐漸排上用場,尤爲是在某些專業公司,負責某個專用領域的時候,這時候可能會改寫操做系統的某部分代碼,來適應他們本身硬件的各類狀況,將會深刻分析某方面的技術,好比文件系統、網絡協議等,這個時候數據結構等方面知識就顯得頗有用了。架構

有了基礎的原型之後,經過繼續學習新的知識,逐漸使上一個層次,更精深的瞭解嵌入式技術,同時知識體系更加完備,能夠作更高層次的工做了。
應用這樣的學習方法,在學習過程當中,也會使學習過程始終有目標,並且不會感受枯燥,天天都會有成就感,從一開始就能抓住嵌入式系統的脈絡,只要付諸努力,持久學習下去,就能成爲嵌入式行業的專家。框架

最後咱們總結下,咱們要想比較快的掌握嵌入式技術,要應用框架學習的方法,在必定的知識基礎上就開始學習基礎的框架知識,這樣就很容易入門,隨着開發經驗的積累,再去學更深刻的基礎知識,以及更深層次的框架知識。這樣相互迭代,直到可以精通嵌入式技術。
這個方法也充分說明計算機科學是個實驗科學。
那麼在學習過程當中,要注意,不用學習過多的基礎,也就是說有了C語言和單片機的基礎就能夠學習嵌入式的基本框架,而後就可以成爲一個合格的嵌入式工程師; 之後能夠繼續深造,學習數據結構編譯原理操做系統等方面的知識,深刻學習算法,從而再去學習Linux更深層次的框架結構,使得總體水平獲得進一步的昇華。性能

如今咱們總結一下,把學習嵌入式技術的路線圖跟你們澄清一下,那就是:
單片機 + C語言 -----> 學習基礎框架知識(包括bootloadre,Linux內核、文件系統的編譯和燒寫 -----> 再去學習Linux上層應用的編程,以及字符設備的驅動,學完之後你就會以爲入門了,能作一些事情了-----> 再深刻學習計算機系統結構、數據結構、操做系統原理等等一些知識,經過分析Linux系統源碼,直到熟練掌握嵌入式編程技術。
我想你們按照這個學習方法,基於咱們iTOP-4412開發板提供的資料和視頻,就必定可以學好這門技術。
3關於裸機程序和仿真
有些用戶但願經過ARM開發板來學裸機程序,其實咱們不建議這樣作,在ARM上作一些裸機程序,不是不能夠,而是沒有太多價值,由於裸機程序根本發揮不了ARM處理器的性能,只有運行了操做系統纔可以充分挖掘ARM處理器的優點,更可以保證系統運行的安全和穩定性。
若是真的想學習裸機程序,單片機就夠了。從架構上來說,單片機和ARM是同樣的,都是CPU,並且編程思想也沒有多少區別,只不過ARM速度太快了,只有在上面跑操做系統,並使用多任務的編程方法才能最大化的發揮ARM處理器的優點。
在實際產品開發時也是這樣,幾乎沒有拿ARM跑裸機的方式來開發產品的。若是用裸機方式來編程,推薦使用單片機,這樣總體成本也會小不少,事實上也是這樣的。
早期的時候,咱們在ARM上也作過不少裸機程序,而且用仿真器來調試;不少人,尤爲從單片機轉過來的人,都但願學習下這種技術,由於他們感受裸機程序更親切,而直接用操做系統以爲很不踏實,不可以徹底掌握系統的運行狀況;其實呢這種想法是不對的。咱們必須在抽象的層次上來開發產品,逐漸轉變觀念,不能說開發一款產品,就必定要對每一個程序的細節都很是清楚,應該學會在操做系統這個抽象的軟件上來開發產品,這樣作才符合潮流,也是產品發展以及我的發展必須轉變的思路和觀念。
由於咱們看到太多的作單片機開發的工程師很難能轉到嵌入式產品的開發當中來,恐怕觀念的轉變能夠說是最大的障礙,但願引發你們的注意。學習

相關文章
相關標籤/搜索