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