一個(gè)剛讀研一,從本科開(kāi)始學(xué)了四年嵌入式的渣渣,來(lái)嘮嗑兩句。
先談?wù)勎业哪感5漠厴I(yè)生情況吧。
我的母校是一個(gè)普通二本,許多本科就出去工作的學(xué)長(cháng)或者同級生,從事嵌入式方向,至少也是6K+,做STM32,linux,PCB的都有。
先談?wù)勄度胧绞巧?/p>
嵌入式計算機系統,英文名embedded computer system,指的就是就是一個(gè)相對微小的設備,植入了計算機。換句話(huà)說(shuō),簡(jiǎn)單的像電子表,鬧鐘,復雜點(diǎn)的像POS機,自動(dòng)販賣(mài)機,ATM等,都屬于嵌入式設備。
我的嵌入式之路
由于本科四年的學(xué)校屬于師范學(xué)校,在工科領(lǐng)域較弱,本科期間學(xué)習方向基本都是自己在找。
大一,大約是四年前的11月初吧,我當時(shí)就買(mǎi)了一套亞博智能的資料。大約50塊錢(qián),1本書(shū)+1個(gè)51開(kāi)發(fā)板,大一那會(huì )兒剛好在學(xué)C語(yǔ)言,恰好51就成了*好的C語(yǔ)言訓練平臺。
借助51,也學(xué)了一些硬件基礎知識,什么上下拉電阻,濾波電容,施密特觸發(fā)器等等。這也為后面學(xué)習電路原理,數字電路,模擬電路三大基礎*打了一定的基礎。
51*有意思的項目無(wú)疑就是做智能小車(chē)了,一對小電機,配合L298N控制,紅外對管尋跡。
*次接觸STM32是在大一下學(xué)期,做小平衡車(chē)的時(shí)候,是為智能車(chē)比賽打基礎,當時(shí)要兩個(gè)模塊,一個(gè)是陀螺儀MPU6050,另一個(gè)是攝像頭OV7670。前者用51還是調的出來(lái),后者實(shí)在是沒(méi)有辦法,做是做出來(lái)了,但是。。??ǔ蒔PT,TFT屏幕讀取攝像頭數據是一下一下的。關(guān)于小車(chē)的文章推薦:做一個(gè)STM32小車(chē)很簡(jiǎn)單嗎。
之后我便接觸到了STM32。攝像頭,陀螺儀這些在51上讓人很是頭疼的外設,頓時(shí)變得簡(jiǎn)單易用。外部中斷,定時(shí)器這些資源也不像51那樣寶貴,大把的外設可以用。。。等等
簡(jiǎn)單設備用8位機,復雜設備用32位機,設計電路板用DXP,這個(gè)想法維持了很久,直到18-19年的智能車(chē)競賽。
這兩年的智能車(chē)競賽發(fā)生了兩件有意思的事情。
一個(gè)是調試新的元素,比如環(huán)島,橫斷。
另一個(gè)是新的環(huán)境,賽道不再遮光。
前者標志位已經(jīng)顯得不夠了,后來(lái)查詢(xún)資料,使用上了有限狀態(tài)機FSM。
后者短時(shí)間內也沒(méi)有什么好思路,直到接觸到了OpenMV和OpenCV。
FSM整出來(lái)以后,我在想是否有更高級,更強大的處理方法。
linux告訴了我答案,包括OpenCV。
我才發(fā)現,原來(lái)嵌入式開(kāi)發(fā)和JAVA,前后端開(kāi)發(fā)一樣,是可以有操作系統的。
原來(lái)中斷,DMA這些東西,在操作系統看來(lái),就是進(jìn)程,線(xiàn)程的底層表現。
目前,嵌入式仍在學(xué)習中,跟著(zhù)老師學(xué)習2440,裸機開(kāi)發(fā),驅動(dòng)開(kāi)發(fā),系統開(kāi)發(fā)。
同時(shí)在整機器學(xué)習,模式識別,圖像處理這些東西,希望有朝一日,能和嵌入式聯(lián)動(dòng)起來(lái)。
就像本科那時(shí)51聯(lián)動(dòng)C語(yǔ)言,STM32聯(lián)動(dòng)PID,卡爾曼濾波等等一樣。
嵌入式行業(yè)定義
說(shuō)了這么多,感覺(jué)有些偏題哈,回到主題吧。
首先,嵌入式行業(yè)是很廣的,看你怎么定義。
只是8位機8051算嵌入式加上RTOS,RT Thread的單片機系統開(kāi)發(fā)算嵌入式linux系統API開(kāi)發(fā),驅動(dòng)開(kāi)發(fā)算嵌入式SOC(片上系統)+Linux+OpenCV+CNN+YOLO也叫嵌入式。上述內容都是嵌入式,同樣是嵌入式,你覺(jué)得薪酬會(huì )一樣嗎?
其次,上述的內容,個(gè)人覺(jué)得是個(gè)層層遞進(jìn)的關(guān)系,而不是站在對立面的關(guān)系,因此,我不同意單片機很low,linux和機器學(xué)習就很高大上的說(shuō)法,畢竟嵌入式技術(shù)中,這幾者都是不可或缺的,區別在于層次不同,我們需要做的不是站在對立面,而是做到因地制宜。
比如你控制個(gè)有刷直流電機,51足矣,但若是三相無(wú)刷電機,可能就需要STM32了。30W像素的攝像頭STM32游刃有余,但200W或更高的像素的攝像頭就可能需要SOC了,如果是做人面識別這樣的東西,大概率要用到SOC,反過(guò)來(lái)SOC雖然性能強,但功耗高,穩定性不如單片機,一些需要穩定控制的設備(比如電機),還是需要單片機的。
嵌入式行業(yè)不夠景氣的可能原因
*后,鄙人淺薄理解,嵌入式?jīng)]前途可能的兩個(gè)原因:人才缺失嚴重,且工資較低。
先說(shuō)人才缺失
純JAVA開(kāi)發(fā)或是純電源,傳感器開(kāi)發(fā),又或者是Solidworks做模具等一般只需要寫(xiě)代碼或者只需要動(dòng)烙鐵或者畫(huà)圖就行了,但是嵌入式基本是要求軟硬兼備。而且往往也得會(huì )畫(huà)圖(PCB)。
JAVA Python這些語(yǔ)言高級特點(diǎn)也很明顯,類(lèi)和對象處理功能都很強大,后臺也能聯(lián)動(dòng)(比如JAVA的JDBC聯(lián)動(dòng)MySQL等等)。但嵌入式的語(yǔ)言主要是相對傳統的C/C++,甚至要寫(xiě)匯編代碼,開(kāi)發(fā)難度比JAVA,Python個(gè)人覺(jué)得都要高一些。
嵌入式嚴格歸類(lèi)是在計算機里,但是目前國內計算機依然是以軟件為主(BAT三巨頭都是純軟件公司)。以硬件為根基的嵌入式,自然發(fā)展艱難一些,這也是為什么電子或者自動(dòng)化出身的學(xué)生,學(xué)嵌入式比例比計算機科班反而高一些的原因之一。
可見(jiàn)嵌入式開(kāi)發(fā)的門(mén)檻還是不低的(目前個(gè)人認為IT行業(yè)中*入門(mén)難度高于嵌入式的,恐怕只有圖像,計算機視覺(jué),機器學(xué)習這些東西了)。
嵌入式物聯(lián)網(wǎng)需要學(xué)的東西真的非常多,千萬(wàn)不要學(xué)錯了路線(xiàn)和內容,導致工資要不上去!
無(wú)償分享大家一個(gè)資料包,差不多150多G。里面學(xué)習內容、面經(jīng)、項目都比較新也比較全!某魚(yú)上買(mǎi)估計至少要好幾十。
再說(shuō)薪酬低的問(wèn)題
正如前文所言,嵌入式入門(mén)門(mén)檻不低,因此大多數涉獵嵌入式行業(yè)并入職的,還是集中在單片機領(lǐng)域,這部分拉低了嵌入式的平均薪酬,其實(shí)如果能做到linux,甚至做到視覺(jué)領(lǐng)域,個(gè)人覺(jué)得還是會(huì )有不錯的收入的。
這一點(diǎn)軟件,硬件行業(yè)也一樣。軟件只會(huì )前端(HTML5,Vue.js等),做不到全棧。硬件只會(huì )畫(huà)簡(jiǎn)單的信號板,雙層板,畫(huà)不了多層板,高頻信號板,高電流板。機械只會(huì )畫(huà)平面圖,不會(huì )做模具。一樣工資不會(huì )高,我這一屆有一個(gè)同學(xué)畢業(yè)了去做前端,薪酬才三千。。。只能說(shuō)這些入門(mén)門(mén)檻不如嵌入式高,不會(huì )說(shuō)大多數從業(yè)者都集中在低端行業(yè),平均薪酬自然也不會(huì )和嵌入式一樣被低端行業(yè)拉的這么低。
談?wù)勄度胧?值不值得入行?
嵌入式20年等價(jià)于JAVA10年工作?
很不幸,這個(gè)說(shuō)法。沒(méi)有問(wèn)題
為什么?
萬(wàn)變不離其宗,還是門(mén)檻的問(wèn)題。
嵌入式學(xué)習不僅入門(mén)難,整個(gè)流程下來(lái),就沒(méi)有簡(jiǎn)單的。
JAVA專(zhuān)精于網(wǎng)頁(yè),數據庫,服務(wù)器等等。
PCB專(zhuān)注于電路板,區別也大多在于層數,頻率上。
機械制圖也是如此。
嵌入式呢?不好意思,嵌入式涉及范圍比這些廣的多。
軟件硬件基本都要會(huì )整才行玩電機,玩陀螺儀,玩攝像頭,幾乎是必修課。那么控制理論不能缺,PID不能少。模式識別,圖像處理也得跟進(jìn)。到linux,操作系統原理不能少。換句話(huà)說(shuō),論算法,嵌入式從業(yè)可能需要關(guān)注三種算法:
數據結構,控制算法,信號處理。
這些東西,完全掌握,可以說(shuō)20年是不多不少的。換個(gè)說(shuō)法,嵌入式?jīng)]有全棧的說(shuō)法,因為嵌入式本身,就是全棧。
但是20年以后,嵌入式從業(yè)者再和JAVA從業(yè)者,會(huì )怎么樣呢?
哪些人適合入行嵌入式
以下我列出來(lái)的情況,如果大部分都中了,這些仁兄就不推薦入坑嵌入式了:
不想做硬件的,打死不做電路的不想寫(xiě)代碼的,看見(jiàn)代碼就想吐的不想整操作系統,覺(jué)得裸機單片機就是一切的想短時(shí)間內賺錢(qián),車(chē)房一體化全部到位的先說(shuō)不像寫(xiě)代碼或者不想做電路的情況吧。
嵌入式兩者都有,即便是*簡(jiǎn)單的8051,不寫(xiě)代碼或者不弄電路,根本進(jìn)行不下去??梢哉f(shuō)一開(kāi)始的路就被堵死了。
再說(shuō)不整操作系統的。
無(wú)OS的單片機設備,簡(jiǎn)單處理完全可以處理,但更復雜的設備,更復雜的功能呢?比如WIFI?攝像頭?激光雷達?
不想整操作系統,嵌入式就已經(jīng)被大大限制住發(fā)展潛力了。產(chǎn)品以后可能集中在相對低端的產(chǎn)品里,自動(dòng)販賣(mài)機,POS機,付款機,公交,地鐵的刷卡機等等設備幾乎無(wú)一例外的搭載了操作系統。
薪酬的問(wèn)題
眾所周知,嵌入式是個(gè)潛力股。
前期工資一般較低,這也確實(shí)是事實(shí)。
因此短時(shí)間急著(zhù)賺錢(qián)的話(huà),嵌入式可能還真的不太合適。
來(lái)錢(qián)快的,技術(shù)崗還是JAVA強。
*后說(shuō)說(shuō)嵌入式的學(xué)習問(wèn)題吧,大家也一起交流交流。
小白的話(huà)建議還是先想好入不入嵌入式這個(gè)坑,畢竟不論怎么說(shuō),嵌入式都是一條苦行僧路。如果完全沒(méi)有興趣趨使,還是建議轉行??聪麓宋?一位嵌入式工程師的成長(cháng)之路。
從嵌入式小白到大神
階段一:從數電、模電、C語(yǔ)言入坑嵌入式
硬件方面電子系的電路+數電+模電是肯定要學(xué)的,特別是數電,不說(shuō)爐火純青,至少也得做到了然于胸。
軟件方面,C語(yǔ)言不能少的。我看知乎都推薦C Primer Plus這樣的教材,但本人不推薦小白去看,畢竟確實(shí)不太容易啃下來(lái),譚浩強教授的紅皮書(shū)就可以了,畢竟入門(mén)容易。
階段二:51單片機實(shí)戰
C語(yǔ)言和電路基礎有了以后,就開(kāi)始整51單片機,中間穿插一些外設。LED 按鍵 蜂鳴器 電機等等,再去整整通信協(xié)議UART IIC SPI,再用這些協(xié)議去玩一些模塊,比如MPU6050,OLED,HC05藍牙等等。
階段三:STM32單片機進(jìn)階
如果是自動(dòng)化科班的
建議調調PID控制電機什么的。
到攝像頭等復雜傳感器,升級到STM32這類(lèi)32位單片機以后,再進(jìn)行深入學(xué)習。
學(xué)習更復雜的信號處理方法,比如LKF,EKF,再加一點(diǎn)基礎的圖像處理方法。同時(shí)把CubeMX這樣的代碼生成器也盡量用熟,提高開(kāi)發(fā)效率。
再到后面,開(kāi)始上一些實(shí)時(shí)操作系統,比如RTOS RT Thread ucos啥的,把整個(gè)開(kāi)發(fā)的層次再次提高。
階段四:SOC+linux
嵌入式遠未結束,以linux為平臺入門(mén)SOC開(kāi)發(fā)。
小結
如果以后做自動(dòng)化科班方向,計劃就是嵌入式SOC聯(lián)動(dòng)圖像處理,機器學(xué)習這些東西,再底層聯(lián)動(dòng)單片機,驅動(dòng)電機。完成完整的工控機,機床,機器人等設備的開(kāi)發(fā)工作。如果是這樣,個(gè)人目前覺(jué)得*好的入門(mén)坑是OpenCV,然后再深入,方為上策。
如果以后做軟件方向,聯(lián)動(dòng)安卓框架,安卓HAL。借助JAVA C++這類(lèi)面向對象語(yǔ)言,做安卓音視頻的開(kāi)發(fā)和處理,要么搞視頻監控,要么搞藍牙耳機什么的。