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