嵌入式真的沒前途嗎?
大家好,我是小麥。
從事嵌入式相關行業,差不多快有10年時間了,走過很多彎路,踩過很多坑。
很多人會問,嵌入式真的沒有前途嗎?這個我其實也無法回答。用發展的眼光來看,萬物都有周期。
這個和嵌入式無關,和行業有關,一個行業的增長有關,和資本有關,和郭嘉發展有關。所以只有天時地利人和,而這個人和,就是你自己的選擇。
對此這是我的看法,也歡迎大家發表自己的看法。
如果打算入門嵌入式學習,那就和大家聊聊嵌入式學習路線。
嵌入式即嵌入式系統,IEEE(美國電氣和電子工程師協會)對其定義是用于控制、監視或者輔助操作機器和設備的裝置,是一種專用的計算機系統。
國內普遍認同的嵌入式系統定義是以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。
嵌入式是一個比較多學科綜合的方向,有很多細分的方向。其實可以直接切入某個細分的領域,然后介紹一下學習路線,比如單片機開發,Linux應用開發,Linux驅動開發。
但是不難發現,雖然是很多細分,但是需要學習的知識有所交叉,有的又相互獨立。
嵌入式的相****聘崗位,基礎技能樹要求其實相差不大,不過有很多對行業綁定比較深的崗位,會要求有行業經驗和這個行業沉淀的相關技能;
- 比如汽車電子要求can,autosar;
- 物聯網要求網絡協議,單片機,RTOS,WiFi,Bluetooth等等;
- BSP工程師要求掌握Linux內核和各種子系統;
- 機器人相關要求掌握ROS;
崗位還有很多,這里就不過多列舉了,下面分享一下我認為的比較萬金油的學習路線。
下面是我整理的思維導圖。簡單來說一下傳統的學習路線。
這是必須要精通的。C語言非常靈活,可以進行單片機開發,驅動開發,固件開發,內核開發,應用開發,幾乎都可以用到。
比如著名的操作系統Linux,主要就是C語言實現的,當然還有很多基于C語言的項目,這里就不一一介紹了。
學習C語言,我比較喜歡浙大翁愷老師的課程。
C++C++在嵌入式中更多是應用開發方向,因為對C有較好的兼容,所以在硬件方面仍然使用C進行編程,而較為復雜的業務邏輯部分,則使用面向對象的C++進行封裝和實現。
C++和C的混編也是非常實用的。
數據結構與算法合理地使用數據結構,它會讓的開發事半功倍,常用的數據結構,比如隊列,鏈表其實在嵌入式的開發中十分常見,當然還有hashmap,二叉樹等等。
如果編程語言是武器,那么數據結構就是招式。什么樣的場景,使用什么樣的招式,數據結構里大致都寫了。
其他編程語言還有很多其他的編程語言,我這里列舉幾個。
shell這是腳本語言,在Linux上比較常見,一般來說,掌握shell,可以大大提高工作效率,這個是強烈建議熟練掌握的,遇到不懂的可以多看man page;
python很方便,大大提高效率。用于驗證一些算法功能,或者辦公自動化。
硬件知識這里的硬件知識并不是對于做純硬件開發的路線,而是做嵌入式軟件開發,需要掌握哪些硬件知識,下面詳細來說一說;
具備最基礎的硬件知識素養,如果是做驅動的開發,比如BSP工程師,必須具備最關鍵的兩點,可以看懂芯片的Datasheet,可以看懂原理圖,因為要做板機的開發。
常見的通訊協議比如UART,I2C,SPI協議等等,這三個比較常見,也相對比較簡單。其他還有很多通信協議,這里就不再介紹了。
常見的片上外設比如gpio,adc,dac,watchdog,timer,pwm這些,原理都是一樣的,但是一般的SOC基本也都是類似的外設。
常見工具的使用示波器,萬用表,電源的使用,至少不能經常把正負極接錯。示波器便于用來查看時序,開發的時候方便排查問題。
嵌入式系統嵌入式操作系統的話,通常看具體的需求進行劃分,常用的實時系統有ucos,freertos,rtthread,vxworks等等,而Linux系統也十分常用;
實時系統通常來說,實時系統大多用于用于控制的場合,比如ucos,freertos,rtthread,vxworks等等,都是實時系統。
Linux系統Linux系統應用比較廣泛,智能硬件,監控設備,路由器,手機,汽車等等,都有它的身影。大致方向主要分為Linux驅動和Linux應用,兩者的界限已經模糊不清。技術架構上分為用戶空間和內核空間,如下圖所示;
Linux
如果是應用開發,其實和純軟件開發差不多了。
基礎內容,其實前面也有一部分提及,Linux系統編程,多線程,操作系統層面的基本知識,互斥,信號量,網絡編程等等。
具體應用,比如音視頻的開發,運動控制,機器人開發等等;
推薦看《Unix環境高級編程》,這是基礎。
驅動對于底層知識的掌握要求比較高,至少板機Linux的編譯,剪裁,移植等內容。
可以根據具體硬件需求,添加相應的驅動到系統中,因為系統已經規定好相應的驅動框架,因此需要了解各種內核子系統和各種類型的驅動。比如字符設備驅動,塊設備驅動,設備樹的使用等等。
深入學習子系統也是一個難點,可以幫忙更好地了解Linux,例如進程調度(SCHED)、內存管理(MM)、虛擬文件系統(VFS)、網絡接口(NET)和進程間通信(IPC)。
比較推薦的學習資源,宋寶華老師的Linux內核4.0驅動書籍,韋東山老師的驅動視頻,互聯網時代,搜一下就有了。
總之,技術在于積累。
其他上面說了這么多,如果要保持技術的精進,需要保證持續學習,多看優秀的源代碼,找優秀的開源項目。
非常規學習路線在掌握部分基礎知識之后,也可以嘗試這種學習路線,按照項目的形式進行學習。
定一個目標項目,例如;
在Linux系統上實現一個程序,如果非得和硬件沾邊,比如做一個人臉識別的門禁系統;
比如要在一個板子上移植Linux系統,并添加驅動;
用單片機開發一個小項目,完成軟硬件的設計;
以上完全是三個不同的方向了,因為每個人的具體情況都不相同,可以根據自己的技術棧和興趣愛好來做,想不到做什么的,找一些開源的項目,自己復刻一下,也是很好的。
有了目標之后,將任務拆解,這中間會遇到很多知識盲區,會用到上面我提到過的很多知識,這時候你就要去學習,去吸收,帶著目的去學習和實踐,效果反而會更好。
總結這篇文章總體上介紹了嵌入式的學習路線,相對寬泛和簡略,由于嵌入式的知識體系確實很龐大,單純從個人角度去寫,還有很多片面和局限的地方。
希望對一些想要加入這個方向的同學有所幫助,如果本文存在錯誤或者需要改進的地方,歡迎您的建議。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂) 攝像頭相關文章:攝像頭原理