1、首先了解 什么是嵌入式? ..
2、什么是嵌入式系統?
嵌入式系統是以應用為中心,以計算機技術為基礎,軟硬件可裁剪,對可靠性、成本、體積、功耗有嚴格要求的專用計算機系統。
關鍵詞 :以應用為中心、軟硬件可裁剪、有嚴格要求、專用計算機系統
典型代表:手機
3、學習嵌入式都是學些什么?
很多人對嵌入式應該學些什么說的很復雜或者很簡單,我以主流的linux操作系統為例,并借助一張圖大致幫大家理一下這部分的內容(以下內容按圖中由外到內展開),
很多人只能做單片機開發,比如C51或者STM32(比較常見)等,當然了他們也可以跑一些小型的操作系統比如μC/OS-II或μC/OS-III等,當然了這些也是基于C語言的學習,也是和硬件在打交道,屬于C語言直接調用庫函數或者直接操作寄存器,也能夠讓硬件正常的工作,沒錯,會這些你也能有一份工作,學的深入的也會有不錯的工作,正所謂360行行行出狀元嘛,但是當你在這個方向工作三五年之后你會發現你進入到了瓶頸期,為什么呢?因為你會發現你的技術處于某個高度,很難得到提升,而且有很多東西感覺屬于這個行業,想嘗試著去做,但是就是沒有能力去做,這個時候不是你能力不夠,而是你的技術儲備不夠了。你需要去打通一下任督二脈,那么這個時候建議你上手真正的嵌入式開發。
大家通過上面那張圖可以明顯的看到,在C語言和硬件之間有很多的東西需要我們去克服,這個就是嵌入式門檻的學習比較高的原因,因為中間需要很多的技術儲備,如果不能打通中間環節,那么你就只能停留在單片機開發的層面。那么接下來我大致的幫大家理一下這一塊的一個思路,小弟入坑不久,錯誤和漏洞肯定是有的,希望大家能稍稍包涵一下,在此謝過。
學習嵌入式開發首先你需要有一個良好的C語言功底,你需要對C語言可以說是熟練掌握,當然了各種運算符和表達式以及類型的范圍是基礎中的基礎,判斷選擇循環的語句肯定不能用錯,static、extern,const,等的用法和對變量函數的作用域等的影響都是基礎,typedef,struct,union,#define的各種用法和坑肯定要掌握,說實話掌握上面這些再加上指針和數組的用法基本上做單片機開發就沒有問題了,但是如果是嵌入式開發,對C語言你還需要對各種數組,指針,數組指針,指針數組,函數指針,回調函數的用法熟練掌握,為什么呢?因為驅動的部分基本上都是函數指針和回調函數來實現對各種接口的支持。這個是對C部分的一個要求,相對來說要求較高,不過貴在應用嘛,快速掌握這些和通過幾年時間掌握這些其實就是時間的問題,相信多數人事耗不起這個時間的。
第二個你需要掌握的內容是數據結構,數據結構是對數據的組織結構(鄙人陋見),那么這個時候鏈表的強大就會出現在你的面前,很多人感覺數據結構的學習很難,的確很難,我給大家簡單的說下小弟以為的難點在哪里,難點在于他需要你去梳理數據與數據之間的關系,以前咱們是直接遍歷,現在要實現對數據的增刪改查加排序等功能,同時還要把這些數據當做一個節點栓在一根(單鏈表等)或兩根繩子(雙鏈表等)上,那么怎么先給你的數據申請個位置(malloc一個節點,按照你定義的節點形式)然后在鏈表上遍歷找到合適的位置插入就可以的,同時后面的繩子還不能斷對吧,保證數據的完整性。一本不錯的書是《大話數據結構》(我沒看完,不過很不錯)。那么對嵌入式來說,數據結構學到那種程度就可以了呢?我相信這個是大家關注的問題,因為數據結構那么多東西,都學完還不累死了啊。我這里簡單的發表一下建議,數據結構將前面的單鏈表,雙鏈表,循環鏈表,棧,隊列全部拿下(能自己畫畫節點的圖,最好能獨立實現代碼)就夠了,樹的話了解樹的遞歸創建和遍歷就可以的了,再內核中出現最多的就是鏈表,希望大家好好掌握,為后面打下堅實的基礎。而對于圖的話,那是算法工程師的事了,因為圖的多數應用都位于算法中,這里就不做過多的介紹了。不過還是要給大家強調一下,如果想深入學習嵌入式開發,那么C語言的掌握還有數據結構部分的思想是重重之中。
拿下C和數據結構之后其實你發現你還是停留在裸機的開發,要想進入嵌入式的開發,那么你需要切入到Ubuntu的學習,當然了個人建議前面的C語言和數據結構也在Ubuntu下開發會更好,因為嵌入式開發目前Ubuntu環境是最好上手的。(這里做個廣告,華清遠見創客學院的整套嵌入式課程都是在Ubuntu的環境下學習的。)要想進入Ubuntu的學習那么你需要一把鑰匙,熟悉shell命令,能實現像windows下那樣復制粘貼拷貝重命名查找….,當然了都是通過命令實現的,此外你還需要熟悉vi編輯器,這款最強大的ide,可以百度一下vi的配置,把在vi環境下的代碼編輯作為你初入嵌入式必須攻克的一個門檻(很重要),當你基本的shell命令和vi使用拿下了之后,你就拿到了這把鑰匙(估計突擊這一塊也就兩三天就能拿下)。
后面你可以看到要想與內核打交道你需要拿下文件IO和庫函數,為什么呢 ,你會發現之前的C和數據結構基本上都沒有對文件進行過操作,而linux當中號稱是”一切皆文件”,因為在驅動開發中不管你是什么設備對我來說都是一樣的,都只是一個文件而已,linux下有七種文件類型,bcd-lsp,大家可以自己去擴展一下,那么在linux下將你所有的設備都抽象成各種文件,字符設備文件,塊設備文件,網絡設備文件,普通文件等等,這也就是說要想學習linux,學習驅動,你必須掌握linux下對各種文件的操作,比如對文件的打開,讀,寫,ioctl,關閉以及問目錄的打開關閉等。linux下提供了兩套標準,一個是文件IO,一個是標準IO,區別簡單說就是是否有流緩沖區(具體可以自己去擴展),這里區別一下linux下支持的是文件IO,其實這個難度也不大,基礎較好的人不用一周就能掌握,當然應用的熟練度肯定是有待斟酌的了。
那么拿下了文件IO和標準IO就萬事大吉了嗎?不是的,這里我們稍稍談一下linux內核是怎么工作的,它是通過對進程和線程的調度來完成各種任務的,那么這個時候你想一想,你該做什么啊?是的,沒猜錯,你需要把linux下7中進程間通信方式給拿下,比如無名管道,有名管道,信號,信號量,共享內存和消息隊列以及網絡通信,不過由于進程的資源消耗可能稍大,所以引入了線程,那么你需要掌握線程的同步和互斥的機制,同時再深入理解一下調度的概念以及與進程線程間的關系,做個小項目練練手,那么恭喜你,學到這里已經可以找到一份應用層的工作了,比如網絡開發等等。
不過俗話說學無止境嘛,一條路走到黑,索性把驅動也拿下吧,只有拿下驅動,你才能夠從最底層的硬件一直到最上層的應用然后再從最上層的應用到最底層的驅動打通整個閉環,你會發現很多東西對你來說都是小case的了,驅動開發首選的硬件肯定是ARM的了,如果你有51和STM32等硬件基礎,恭喜你這一塊很快就能突破,如果你是軟件出身不懂硬件,沒關系,有好的指導(比如說華清遠見創客學院:又打廣告了,哈哈~~)你也可以快速上手,其實我們以前也想把路走好,但是就是不知道走那條路,所以走了很多彎路,說白了就是少個人引導你前進。不過嘛,做技術的都喜歡按照自己的想法,自己認為正確的方向前進,我也是,哈哈。說了很多廢話,簡單的說一下如何上手學習驅動,首先你需要將環境搭建起來,你需要知道如何編譯內核,如何將內核在板子上跑起來,這個是第一步。當然了學驅動寫的第一個驅動肯定也是點燈(點燈大法好),然后慢慢的接觸一下linux下如果去寫一個簡單的字符設備驅動,學到后面你會發現驅動基本上就是在套框架,比如字符設備框架,Platform框架,IIC框架,SPI框架,INPUT輸入子系統框架,misc,USB等等框架,那么驅動到底是做什么的呢?驅動向下操作硬件,向上提供接口,簡單點說就是你以前配置硬件寄存器讓硬件正常工作,那么你先在驅動中也去相同方式配置硬件,只不過是要將配置硬件的過程何時的套入驅動的框架當中,同時向外面提供你對硬件的操作接口,比如open,read,write,ioctl的接口等,說白了就是在應用層通過io操作去調用驅動的接口然后再驅動提供的接口中去修改硬件的狀態,實現對硬件的控制。當然了一些基礎知識如自旋鎖,互斥體,中斷底半部等等大家可以自行去了解。
上面那張圖其實就解釋完了,但是我們再想一下嵌入式系統是什么,以應用為中心,對吧,那么我們需要在實戰中去應用我們的知識和技術去解決實際的問題,這個時候有兩套框架,一個是CS,一個是BS,那么在這些基礎上你想往哪個方向發展都是可以的。因為任督二脈已通,修煉何種神功就看你的選擇了。
當然了上面這些吃幾年是沒什么問題的,不過熱愛技術的大哥們一般都會再學兩個東東,一個叫做高級語言,可以選擇C++,JAVA,PYTHON三選一,一個叫做界面,可以選擇QT、android或者web等,這些都是增值哇,以上為小弟愚見。
4、學習嵌入式以后可以做些什么?(職業發展方向)
4.1、成為某個方向技術方面的核心,領域內的一專多才的專家;
4.2、另一個是從項目中鍛煉起來,成為項目主管或是管理型人才;
4.3、再有就是因為嵌入式開發的門檻相對較高,技術的附加值較高,可以利用自己的技術及行業經驗去創業。
4.4、可以做很多自己想做的事;