嵌入式老師傅告訴你單片機6年想轉嵌入式Linux值不值得

2022-04-15     大方老師單片機

原標題:嵌入式老師傅告訴你單片機6年想轉嵌入式Linux值不值得

嵌入式老師傅告訴你單片6年想轉嵌入Linux值不值得

一、你真的決定要轉嵌入Linux嗎?

要不要從單片機轉嵌入Linux是一個影響到職業開展的嚴肅決策,我不能幫你拿主見,只能幫你列出利弊,你須要依據自身的各種環(假如所在城Linux嵌入式相關崗位多嗎?是否決定背井離鄉去北上深開展等)做出最有利的決策。

我的觀點並不Linux嵌入式絕比照單片機開發職業開展好,只是依據自身的一些經歷,給出一些看法。

1.單片機開發相對Linux嵌入式最大的劣勢在於基層的打工崗位平均薪資偏低

我想這是大局部單片機工程師想轉嵌入Linux的最主要的理由。技術自身各有優劣,但是就基層打工而言,在同一座城市,就打工而言,單片機的薪資比嵌入Linux30%50%

興許很多有會拿某些做單片機的高薪的老(假如野火的我,周立功)或者一些公司高管的薪資和做嵌入Linux打工的工程師比照,證明單片機也能夠拿高薪。

但是他們都犯了田忌賽馬的錯誤,拿別人的上等馬和自己的中等馬比照,我認為這種田忌賽馬的比較非常不切實際,基層打工的就應該和基層打工的的比照。

目前我調查到情況來看,在深圳的基層就業市場,單片(RTOS)開發的起步薪資6K-7K,一般人15K就是高薪,很難突破。

20K以上的單片offer也有,但是很少,最多也見25K的單片offer,但是那都是有名企,名校或者其他業務背景換來的,一般人真拿不到。嵌入Linux/Android這塊,薪資相對高不少,起步12K很正常,工2年一般都能突15K3-5年突20K甚至25K也是很多的5年以上去一線土豪大(華為OPPOVIVO)能夠30K,假如在手機大廠做到模owner專家,突40K也是能夠有,但是在往上就有點難了。

整體來看,同檔次的基層打工者,嵌入Linux薪資比單片機開發還是高不少,單片15K就會遇到瓶頸,突20K就很難了,嵌入Linux20K並不是難事,25K以上才遇到瓶頸。

2.你所在的城市嵌入Linux崗位多嗎?

我覺得這是影響你做決定的另一個大問題。我們學嵌入Linux這門技術,絕大局部人是為了從事相關的工作,而不是陶冶情操。但是依據我統計來看,嵌入Linux的普遍薪資雖然高於單片機,但是就業崗位並沒有單片機那麼多。

深圳目測是嵌入Linux就業時機最多的城市,但是單片機時機看起來似乎更多,在深圳,單片機Linux崗位數量比照大64

從嵌入Linux城市的崗位數量來看,依次是深 > > > = = >(華為加)>= >= = = =西 = = > = = = >其它在其它城市我就很少了解到做嵌入Linux開發相關的崗位。

所以假如你要考慮轉行,首先考慮是否願意背景離鄉去以上幾個城市工作。否則哪怕你學了牛逼Linux技術,可能也會在當地找不到對口不得不繼續從事單片機開發。

3.單片機雖然待遇較低,但是就業時機更多,對大齡求職者相對友好

這點其實並不矛盾,做單片機各行各業的小公司特別(當然像格力,美的這種傳統家電大廠也有,但是華為、商湯等新興高科技大廠很少招單片),業務多種多樣,須要的人更多,但是一般小廠可能資金並不充裕,給不起人才高價,加上單片機開發門檻較(不考慮產品穩定性EMC等有工作經歷自然會知道的概念,僅指進修使用單片機幹活編程的造就門),造就周期比較(大二學生一個暑假的功),所以導致中低端能幹活的人還是挺多,拉低平均薪資。

但這就像富士康一樣,招人多,但埋怨缺少人,老闆就是不想把待遇提上去,要控制老本,這是缺少人但是待遇低之間一種永遠存在的矛盾。但是對大齡求職者來說,由於單片機崗位實在是多,很多小廠真的很難以高的性價比招到優秀的人,在小廠也沒HR插手做人力資源布局、年齡梯隊建設,反而在年齡上卡的不嚴,大齡求職者只有薪資不挑,也能找到一份工作,所以相對於Linux的大廠,對年齡問題比較寬容一(可能由於單片機有點歷史了,大齡從業者也)

4.單片機也有一些較高薪職位

在單片機工程師眼中20k以上就算是高薪,以這個為規範,我也見過一些較高薪的職位,但是這裡面有些特殊的要求。

某家做智能門STM32 RTOS的公司給我開20Koffer,主要是由於公司希望招的技術人員都985 211以上學歷背景,這樣溝通起來可能觀念比較一致,所以薪資能給20k

另外還有一家明星獨角獸創業公司給25K的單片offer,但是前提要求是能Linux環境下開發單片機,而且面試難度較高,原25K要價超出他們預期了,他們不願意給這麼多,後來我吊著他們一個星期,謊稱拿到華為同等價格offer,他們才最終容許25Koffer

剩下我還了解到有年80w的單片機高級工程(掌握某些行業特殊的認證規)。但是整體來說,單片機較高薪offer的確不容易拿到,而且拿到也不僅僅是由於你的單片機技術好,bug才能強,而是由於你的背景,學歷,有其offer抬價,掌握特殊的業務競爭力等(關於嵌入式業務競爭力能夠讀讀我上一篇關於嵌入式競爭力的文),這些特殊業務和文憑,背景都不是能靠當下自己砸時長努力看書進修寫代碼就能輕易獲取的。假如能單單靠自己砸時長努力就能獲取的技術就不是啥門檻性的技術。

列舉了以上這幾點,要不要從單片機開發轉嵌入Linux相信你也應該能夠下決定了。

單片機和嵌入Linux開發到底有什麼異同

1.單片機轉嵌入Linux保留的優勢主要在於熟練C語言編程才能以及豐盛的底層軟體與硬體接口的調試經歷。

Linux內核自身就C語言編寫的Linux底層應用程式大局部也C語言的,一般有單片機開發經歷的C語言應該不是問題,所以在切換的過程中,不須要考慮語言的切換,當然假如沒有系統學過數據構(我認為數據構造是熟C語言必不可少的內容,哪怕單片機也要懂數據構),可能須要補補。

另外uCOS FreeRTOS這類的實時作業系統開發經歷就更好,至少在看大規C語言代碼的時候不(其實uCOS內核也不代表能馬上掌Linux內核Linux內核真的複雜太多,設計理念也很不一)

另外豐盛的單片機底層調試與寄存器配置經歷,可能幫助你在進Linux嵌入式開發的時候能快捷定位底層的一些問題,節約時長。

2.單片機Linux嵌入式須要熟悉一套格調迥異的開發環境

對於大局部單片機工程師而言,都是WindowsIDE環境開發單片機程序為(不排除有些公司已經使Linux開發單片機)UbuntuLinux系統接觸比較少,所以你們要越過的第一關並不Linux內核源碼,而是如何使UbuntuLinux系統。

由於Debian Ubuntu CentOS等各Linux系統做軟體開發,主要都是通過命令行操作,而不是滑鼠介面點擊。並Linux系統裡面的應用軟體不Windows裡面IDE這樣給你集成好了,點擊就能用Linux裡面很Makefile之類的編譯腳本以Samba, SSH Server等各種效勞arm-linux-gcc等各種編譯連結工具,就IDE軟體裡面的各個組件,須要自己重新組裝使用,並且用的時候可能有各種環境甚至編譯問(開源軟體猛糙快就是這),須要自己折騰花費不少時長。

所以對Linux入門者,哪怕你有豐盛的單片C語言經歷,折騰起來也挺耗時長,須要克服心理的障礙Linux系統開發環境就像一匹不聽話的烈馬,馴服他才能發揮出它的價值,Windows系統開發環境更像一匹聽話的普通馬。

3.嵌入Linux開發代碼的掌控程度遠低於單片機開發,單片機Linux須要適應如何在這種低掌控度的不安全感中進行開發

做單片機開發,包RTOS,一般代碼量最多幾萬行,哪怕不是每行代碼都讀過,也根本能夠精確掌控每個模塊,大略哪裡出bug,作為開發者很容易定位。

而做嵌入Linux開發,單Linux內核就有幾百萬甚至上千萬行,還不包括各種你不熟悉的應用層的開源庫,這導致大局部代碼都不可能掌控。

嵌入Linux的開發模式就是在這種大局部代碼都不是你開發的,你也掌控不了大局部代碼的情況下開發驅動或者應用,你經常會遇到不熟悉的東西須要各種搜索問人,這種開發模式,會把人置於一種不安之谷當中,很多你使用的函數你並不知道它的實現細節,可能工作機制都只是略懂。

在這種模式下開發須要很好的搜索,溝通,團隊協作才能,不能再像單片機那樣一個人全局掌控,蒙著頭開發了,這種不可掌控的不安全感是單片機工程師Linux嵌入式工程師開展過程中最須要適應的。

4.嵌入Linux開發須要有大局觀,不用迷失在細節的叢林找不到方向和出口

很多單片機工程師有個思維習慣,編程時喜愛細摳到每個寄存器的工作原理,每個功能的實現細節邏輯,每if else都不放過。

Linux嵌入式進修中將非常耗費時長,是事倍功半的做法。注重細節固然好,但是當系統龐大到一種程度的時候,過於注重細節的人,往往很難駕馭這個系統。

我看到很多初學者,每個寄存器,連結腳本的每種寫法都要去糾結很久,假如晶片啟動方式,生搬硬套2440的啟動流程作為晶片啟動的唯一真諦,處處往其他晶片套。殊不知很多東西都是人為約定的一些習慣性做法,每家公司的晶片有自己的特點,流程是死的,人是活的。

掌握大局觀,讓自己迅速熟悉整個系統的知識,很多細節上習慣性的東西自然而然就明白了,對整個系統的掌控力度就高了,遇到詳細妨礙你前進的細節問題,再去嘗試處理。掌控並不意味著你知道每行代碼每個寄存器的意思,但是你能讓整個系統依照你的想法去運行。

單片機轉嵌入Linux大略須要學哪些根本的知識

吹了這麼多水,到了真正上乾貨的時候了,從單片機Linux嵌入式到底須要學些啥。假如沒有這一段,我真怕你下定轉行決心之後,馬上拿起一Linux內核架構與實現的書,以為像uCOSRTOS系統一樣,都C語言代碼,然後看得雲里霧裡,從入門到放棄。其實我在剛進Linux嵌入式的,也犯過類似的錯誤,因而總結了一些經歷教訓。

1.你須要花一定時長熟悉如何使Linux系統進行編程開發

相信很多童鞋都是從小使Windows電腦長大的,在學計算機編程之前,應該沒有接觸UbuntuLinux系統,而這個系統又不Windows那樣點點滑鼠就聽話,須要各種命令行操作。而且系統裡面有各種效勞和應用工具須要你自己依照需求去配置。

所以進修嵌入Linux開發不是急於鑽Linux內核代碼的海洋中,而是先用Linux系統。

你能夠參照《鳥哥Linux私房菜》Linux系統如何安裝使用等書籍,學會使用命令行。但是我認為進修要有宗旨性,假如對著《鳥哥Linux私房菜》一頁一頁每個命令學下去,看幾天就會枯草乏味了。

所以我建議由單片機開發經歷的童鞋,第一個宗旨就是Linux系統上如何搭建你的單片機開發板交叉環境,編譯出一個裸機Led點燈的程(不須要Linux) ,並通過開發板產商提供的工具燒寫。

這件事情並不難,網上已經有很多如何Linux系統下交叉編譯單片機程序的文章,尤其stm32系列的,你能夠參照別人的文章做一遍,在這過程中你將會熟悉各種常用的命令shell, arm-linux-gcc交叉編譯工具鏈Makefile(能夠單獨參照陳皓的文)Linux編程環境相關的知識,從而初始進Linux的世界。

2.你須要知道嵌入Linux系統是怎麼跑起來的,一般由哪些組成局部

相信大局部人轉行嵌入Linux開發並不是為了Linux系統上開發單片機程序,而是想Linux驅動或者應用開發。在走完入門第一步之後,就不要太糾結那些編譯,連結腳本那些文件格式怎麼寫,而是儘快把精力專注Linux系統開發。

進修嵌入Linux系統開發,首先就得知道一Linux系統如何跑起來,如何把一Linux系統環境在開發板上搭起來。這牽涉bootrom, bootloader, uboot, dts, Linux內核cmdline, rootfs等一系列組件,以nand啟動nor啟動等各種不同的方式,知道一Linux嵌入式系統如何工作,再進一步修改添加自己的驅動和應用。

這裡有很多實踐性的東西,可能須要視頻資料帶你跑一遍,才能快捷入門,我之前看的是韋東山教師的嵌入Linux視頻,總共有一二三四期等,有免費試看,也有付費的,直接淘寶聯絡賣家能夠了解,我就不貼廣告連結了。

另外還有其它視頻,我沒有看過的,就不隨便舉薦了,在嵌入Linux進修這塊,理論性的知識須要慢慢看書,但是實踐性的知識還是須要視頻資料帶你操作快捷入門,看書和實踐循環漸進。

3.你能夠嘗試做一些簡略Linux應用和驅動開發了

走完了前面兩個步驟,相信你對嵌入Linux開發有一定專業性認識了。在嵌入Linux進修這塊,我更傾向於在做中學60%+40%理論。由於嵌入Linux裡面很多系統環境相關的東西,並不是書本上那種嚴格的理論公式,通過看書很難找到規律,而且Linux內核裡面有一整GNU(GNU是啥意思自己)世界的行話,那些Linux內核,驅動書籍的技術專家不可能所有行話都給你解釋,所有在沒有使用和開發經歷的前提下就直接翻開Unix環境高級編程》、Linux設備驅動程序》等大牛的典型書籍,容易讓你雲里霧裡。

我建議是,跟著一個視頻教程,假如找一些垂直網站的嵌入Linux視頻,0初始寫一個簡略驅動和應用,讓自己寫的驅動和應用代碼跑起來,點1Led燈,先不用Linux驅動中你調用的那些初始化,註冊等框架函數如何實現。

通過實踐的過程,熟悉整個代碼的運行環境以Linux開發中的各種行(系統調用vfs)。這也是讓你一步一步取得進修正反應,提升成就感和進修自信心的方法。

Linux驅動開發自身並不(難度不會超過你複變函數課本上的公),也並不神秘,只不過它一整套行話術語,容易讓初學者雲里霧裡,熟悉這套行話,擺脫恐懼心理,一個智商正常的普通本科生應該是能夠掌握的。

4.你須要補充一些計算機的理論知識

據我了解,大局部單片機工程師都是電子、通信、自動化、機械等專業出身,很少計算機專業的。這些專業的童鞋,相對會缺少乏計算機專業的根本理論知識,如數據構造,作業系統,計算機組成原理,計算機網絡,算法,編譯連結的根本原理,資料庫等等。

補充理論知識是一個長期的過(可能須2-3),並不是要等到計算機的專業理論都學完才能夠去找工作,你能夠一邊補充根底知識一邊面試一邊找工作,同時檢驗自己的根底知識。這些根底知識不光能提高你的技術功底,也能幫你通過筆試面試,決定你能否在一線城市突20K的薪水。

在有了計算機科班的根底知識,以及有一Linux驅動開發經歷之後Linux內核的進修是有必要的,但是入門的初學者不用急於進Linux內核源碼,內核這塊東西還是挺多的挺艱深的,得花時長邊看書邊看代碼慢慢啃,沒法速成,但Linux內核功底還是能夠提高你的薪資競爭力。

給有工作經歷的轉行者的建議

1.有工作的轉行者,你的優勢是有保底的工作和收入,劣勢是沒有足夠的進修時長自由。有了當前的工作飯碗,不用急著找新工作,你能夠保持一個良好的心態,不驕不躁,能夠邊進修邊騎驢找馬,找到適宜的工作。

當然有工作的人,時長上並不自由,假如你想學的新東西和你當前工作內容並不直接相關,我建議你能夠先選擇一份加班少的工作,這樣能夠騰出下班後的業餘時長來進修嵌入Linux的新知識。

有工作的人,有了一些小積蓄,缺少的是時長,那麼在進修上能夠適當買一些性價比高的付費視頻,加快入門和進修進度,節約寶貴的時長,這也是用金錢換時長。

一般情況下,不須要學精通才出去找工作,學到能self correct(這個詞來源於一TED關於如何快捷自學的演)能夠干一些活的狀態,就能夠出去面試找相關的工作了Linux嵌入式進修以通用根底知識為主,驅動裡面的音視頻,通信協議相關的業務上的知識能夠找到相關的工作再補充。

2.如何在獨有單片機經歷,沒Linux開發經歷的情況下,如何通過社招嵌入Linux開發工作?

這個對於社招看中相關工作背景的求職者是個頭疼的問題,我有以下幾點建:

首先,看看公司是否Linux相關的部門和開發方案,能夠主動嘗試內部轉崗。

第二,看看能不能建議公司技術負責人把單片機開發的環境遷移Linux系統上,Linux系統環境上開發單片機,這樣至少你在工作中有使Linux系統的時機。

第三,能夠先嘗試面一些Linux環境下開發單片機的公司,面試後詢問面試官是否Linux環境下開發單片機,假如是,能夠先加入Linux開發單片機的公司繼續做一段時長單片機,順便再工作中熟悉一Linux.

第四,嘗試一下面試真正Linux系統開發的公司一Bootloader或者固件開發相關的崗位,由Bootloader和存儲控制器,電管管理等固件代碼和單片機裸rtos開發有很多相關性,甚ARM SOC裡面就有單片機核以及相關的固件,用於控wifi,存儲,電源休眠喚醒等相關的功能,這樣能保證你能夠在新工作中有一定輸出貢獻,而不是完全的進修者。

第四,嘗試面試一些流動性高,離任率高的真正Linux公司。這樣的公司一個詞形容:缺少人。我之前在珠海IC原廠工作,由於珠海相關的從業者基數少,應屆畢業生很多也不願意來小城市開展,再加上公司近年業績不好,離任率高,導致公司缺少人,並且很難招到人,所以後來放開招人規範,願意造就獨有單片機經歷,沒Linux經歷社招者。

當然此時我在的深圳知名大廠,由於從業人口基數大,公司品牌和待遇都很有競爭力,競爭較為激烈,雖然號稱缺少(其實是招人太挑剔),但是一般不會給沒Linux經歷的求職者時機。

最後,在進Linux嵌入式的過程中,遇到的問題和寫的代碼,最好有技術博客GitHub記錄下來,把相關連結貼在簡歷上,這也是像面試官證明你真的對嵌入Linux有一定了解,面試官看完你的博客GitHub,才能對你的技術水平有進一步了解,決定是否給你時機。

///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以~點我頭像黑色字體加我也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比///

給在校生轉行者的建議

對在校生來說,你多的是時長上的自由,缺少的是金錢以及沒有一份保底的工作。

當然時長這東西就像衛生紙,看起來多,但是用著用著就沒有了,所以即便有充裕的時長,也要好好布局,儘量多學一些東西。

在校生既然缺少錢,我就不建議花好幾萬培訓費去參加線下的嵌入式培訓,實際上培訓的內容都是嵌入式入門級知識,質量上可能還比不過幾百塊的韋東山嵌入Linux視頻。而且視頻教程在時長上可能比培訓愈加靈敏。

在校生的優勢在於大家都沒有行業相關經歷,校招的時候,不會考察你行業相關的知識,而愈加註重計算機根底知識的考(我甚至是憑著作業系統C語言,數據構造的筆試成績,根本沒Linux開發經歷的情況下拿ICLinuxoffer,當然校招之後還有大半年,買了韋東山付費視頻狂補相關知),所以在校生應該乘著寶貴的時長,把我上一節提到的4點根底知識打牢固,這樣工作之後就能夠專注業務知識進修,更快升職加薪,不用由於根底知識不牢,回爐重造。

另外,在校生可能有各種單片機嵌入式的競賽,在競賽過程中,可能能夠拿到很多獎,得到教師同學的誇讚。但是切記戒驕戒躁,不要由於比普通的同學多掌2個技術就自以為了不(你們以後面試的競爭對手根本不是這些完全沒有技術的同),不要由於幾個獎狀就飄了,而不能靜下心來進修數據構造,作業系統原理等根底知識。

假如不是在知名期刊發表高水平論文,或者國際上認可ACM, Kaggle, ISLVRC圖像競賽中拿到那種高質量有分數和名次較量結果的獎,其它國內競賽的獎在面試與實際工作中並沒有太多說服力,面試官反而喜愛根本功紮實,可塑性強的學生,而不是國內各種獎一堆,結果對時長複雜度,鍊表堆棧mmu虛擬地址空間等概念一問三不知的學生。

最後,希望這篇文章能夠幫助到正處於迷茫期的你。

文章來源: https://twgreatdaily.com/zh-cn/bced077e3dba0f3b041e013e7a0ca2f8.html