單片機 嵌入式 Linux

從單片機轉嵌入式linux風雨過后思考:是否要從單片機轉Linux?

2019-06-27
636次瀏覽

來自嵌入式ARM.png


信息整合自網絡信息


拖著疲憊的身軀回到家,夏天從屋子里蹦噠出來,笑得特別開心:”你回來啦~”男人松了松襯衫的領口,一臉厭惡地躲開:”你又來干什么,我說過吧,我很討厭你。”夏天站在原地,尷尬搓著手:”你也有說過喜歡我的。”男人皺眉:”別自作多情了,什么時候的事。”夏天笑了笑:”嗯……以前,你叫我暑假的時候。”


“不忘初心,方得始終。”只有不忘記自己最初的想法,才能有始有終地去完成自己的夢想。說來簡單,但夢想這東西終歸是華麗而脆弱的,在滾滾紅塵面前,一介凡人想要憑借孱弱的肉身去守護自己的夢想,又談何容易呢。


本人在杭州,我本科畢業后在一家小公司,主要做針對物流監控管理這一塊的硬件系統,主要是電子鎖和配套系統設備,屬于物聯網范疇。工作期間表現不錯也做出了一些成果,得到了總經理和公司其他骨干(主要做技術的)的認可,2014年因股東間糾紛公司不做了,在總經理的策劃下,我們原來幾個核心人員重新注冊了一個公司將原來的產品繼承過來繼續做,因此我成了合伙人。公司開了差不多一年到現在,我因為技術方向問題和經濟壓力太大而退出了,現在開始自學linux這一塊準備轉職。


之前3年多的工作經歷,大概是這樣的。剛畢業準備找工作時,成績一般般,硬件方面不太會,板子沒畫過(現在也沒畫過),因為大學的時候搞過那個飛思卡爾智能車競賽,所以對單片機的編程比較熟一點。然后準備考研,因復習時間不夠加上心靜不下來,考研失敗,遂決定工作,其實畢業想從事嵌入式Linux方面的工作,但是苦于沒那方面技能,基本不會被錄取(還有可能會上培訓機構的當)。后來我到了這家公司,面試時和總經理聊的挺開心的,關于技術方面的東西也沒有聊特別多,就大概說了下當時在學校搗鼓那個智能車具體有些什么東西,后來就要我了,當時還面了一個中型公司,初次面試和技術筆試都過了,就剩最后一輪了,后來想了想那個中型公司主要做汽車儀表的,搞單片機的,然后這個小公司做物聯網相關的,而且以后可能會接觸linux,看總經理這么大誠意我就去了這家了。


畢業頭兩年是我的技術成長期,最開始做單片機+RF模塊這一塊,拿的是電子鎖的半成品程序,功能比較簡單,機械解鎖然后通過無線將數據傳到配套的采集節點上,無線通訊也是單向的(節點到采集端),沒多久總經理決定研發功能更多的鎖,主要特點在保證低功耗的情況下能夠實現節點和采集主機AP的雙向通信,以便實現遠程指令解鎖,然后這個任務就由我承擔了,花了2個多月吧,把硬件WOR(Wake On Radio)這個技術自己琢磨出來并開發調試出來了,主要就是節點平常都是低功耗狀態,當主機有指令下發時會發送一些特殊的數據把節點喚醒,然后節點在很短時間內接收主機的指令并執行。后來經過和前輩交流,把這個硬件WOR又升級成了軟件WOR,硬件WOR依托RF芯片的一些寄存器和集成在里面的WOR功能,而軟件WOR則完全使用軟件控制。因為我是一個比較喜歡做成架構的人,也為了以后功能拓展或移植方便,在那段時間我也在看TI公開的一個simpkiciTI無線協議棧來學習下國外人是怎么寫代碼的,就把simpliciTI的關于操作RF底層的MRFI層移植了過來,再根據自己產品的技術需求,設計了以星型拓撲為基礎的網絡層,最后形成了一個小的協議棧。該協議棧相對于TI的simpliciTI相比優勢在于能夠實現低功耗下的雙向通訊,主要是把WOR集成了進去,通過調用API就能夠實現所有功能,而且應用層不需要干預RF的底層操作,完全由協議棧控制;還有比如在發送數據時可以通過傳入的API參數選擇發送功能,比如發送數據是否需要接收方確認回復,如果是的話,協議棧會自動完成一些工作,上層只需要看API返回值就可以判斷接受方是否確認收到等。這個協議棧是專門針對某一款比較老的RF芯片設計的,不過對一些新的性能更好的RF芯片,也可以用,只是需要硬件移植,這個我一直沒做過,因為公司一直沒有更換RF芯片的打算。


說了這個協議棧這么多,我只是想說明下這個是我最拿得出手的東西,也是對我的技術成長中貢獻最大的東西,因為從那時開始,總經理對我編程這方面已經放心了,之前寫的代碼還要給他看過,現在他也不用看了。協議棧做出來基本穩定是在13年初了,之前都是自己偷偷寫的,大概花了2~3個月時間,然后調試優化了一段時間。最后提出來的時候感覺總經理還有硬件主管還是眼前一亮的。


其實在此期間我也同時在做無線主機方面的開發工作,最開始用的單片機和節點的是一樣的,后來因為主機功能定義修改,使用了NXP的芯片,我終于開始接觸ARM架構Cortex-M3和OS有關的東西了——u/Cos。其實公司還有車載定位主機和平臺,當時我不是負責那一塊(后來也一直沒有負責那一塊,因為主機的代碼不是我寫的,編程規范不符合我的風格,缺少框架,很難看懂,其實自己也不想看,后來因為一些項目需求,我曾經兩次看懂了然后一段時間全忘了),但是每天都看在眼里,也很想嘗試下。之后,我從ARM官網下載文檔把CM3架構弄懂了(當然現在都忘了),然后把u/Cos作者自己寫的u/Cos英文文檔也看了一遍,關于uCos大部分都比較熟悉了(有些沒用到的就沒怎么看),自己還根據文檔寫匯編語言移植過ucos系統。后來主機升級成跑ucos,然后移植了自己寫的協議棧。產品在應用層上花的功夫,其實要比協議棧多蠻多,但畢竟是應用層的東西,也沒什么好說的。


到了2014年,公司換了一個比較大的地方,說大股東準備增加投資,公司要擴大規模,當時總經理說準備讓我接觸linux,公司準備把一些產品進行升級跑linux,以便擴展更復雜的應用,我自然是欣喜,因為搞了單片機,又有一些os還有arm的基礎,學起來應該不會費力,但是linux內容比較多,還是要花很多時間慢慢去啃。因為擴大規模,公司要招一些新員工,13年年底到14年年初,總經理讓我去給應聘者面試,之后我接觸過本科的,研究生的,見過牛人,也見過一般般的,也見過來到公司面試后自己主動說無法勝任而離開的;關于linux方面的,因為我不懂,也只是順帶提一提,但是我發現要是做linux的,很多都是培訓機構出來的,而且很多也只是草草學了下,不太像做技術的料,不過也見過一個牛人,應屆本科畢業,畢業前Linux已經玩得很熟了,說想去培訓機構深造下,最后跟我說在培訓機構也沒有學到太多的東西。其實當時我想讓公司招一個linux牛人,然后帶帶我,因為這東西自己學彎路會走很多,但是事與愿違,想要的人都不來(不知道是公司給太低還是覺得我們小公司沒啥希望),結果招了一個應屆的渣渣(反正每個月交給他的任務一個都沒完成,都是應付式地工作,而且明知道任務沒完成,還每天按時下班的那種),我想我是被欺騙了,但是總經理似乎也被欺騙了,最后再次證明了便宜沒好貨的真理。初次招聘這么難招到人,當時我開始有點懷疑總經理的想法和公司的財力了(我的工資也是比較偏低的,只是一直抱著某種期盼一直堅持著,不過從13年年中開始每個月遞增)。到13年年底,事與愿違,總經理后來決定智能鎖要和app結合起來,當時安卓已經很流行了,于是我開始接觸的新東西不是Linux,而是支持低功耗硬件的藍牙BLE4。


我們用的是TI的BLE4.0,然后我負責做藍牙的智能鎖。關于TI的BLE4.0,如果要鉆的深,挺需要時間,但如果不是用到很復雜的功能,你也不想對藍牙協議棧了解太多的話,相對來說2~3個月差不多了,不過我對這個熱情不是很大,因為這個其實就是TI基于自己硬件平臺上搭建的支持BLE4.0協議的軟件架構,你只要讀懂最上層的架構就行了,不需要去理解藍牙更深層的協議,但是在開發過程中也遇到很多問題,因為當時這個東西剛出來沒多久,而且到目前為止也是基于TI公布的示例工程的基礎上進行修改和添加的,因此它無法滿足各式各樣的硬件需求,而且TI軟件架構自帶的驅動還有些問題,比如DMA支持的UART下在大流量數據下會出現數據不完整或篡改;再比如自己項目用到的串口不是示例工程的串口1而是串口2,那么你必須要去修改底層,這個花了我挺多時間,因為為了搞定這個,我花了很多時間去讀底層代碼和看相關資料還有調試;再比如,你的應用層代碼不能占用MCU太多的時間,因為藍牙協議棧底層需要充足的MCU時間,否則你的藍牙連接就會斷開而且不可恢復(只能重啟)。因為這個東西比較新,兼容性還不太好,靈活性太差,最關鍵一點是,它還是單片機,總之,我實在不怎么感興趣!


這個時候,公司內部開始鬧矛盾了,主要是利益和權力的糾紛,總經理向讓我和一個同事能夠持有股份,一方面要掌握公司的實權,和一個股東搞僵了(是女股東),最后的結果是公司不做了,在總經理策劃下,我先辭職,然后幾個核心人員都辭職了,我和總經理先到寧波另外一家公司上班(總經理帶我過去的,在我看來,那家公司雖然是小公司,但是那個公司還是挺有錢的而且環境不錯),之前說好我們暫時過去的,等這家公司在杭州成立子公司后再過去由我們總經理管理,但后來發現我們總經理被忽悠了,后來我們也就離職了。期間盡力了蠻多東西這里就不說了,總之我在那邊待了一個月不到就回來了。


到最后,原來幾個核心人員在杭州注冊了一家公司,繼續做原來的產品。也就四五個人,做硬件的只有一個,原來的硬件主管。從公司成立后,硬件主管工作了一個多月就開始生病,他身體不好,因為我不會硬件,我只看得懂原理圖,因此項目就被嚴重耽誤了,15年初,原來做的智能鎖系統因為故障率比較大,加上商業上關系和客戶處理的不好,把這個客戶給丟掉了,公司比較大的利潤來源沒有了,到了今年5、6月份,公司把14年賺的錢也開銷光了,已經快沒錢,因為當初股東有協定:資金不夠時為了優先保證普通員工的工資的發放,股東是沒有工資的。到6月底,我已經有2個月沒拿到工資。因為13年年底,在家里人的支持下,我在杭州買了房,過起了房奴的生活,每個月5K多的房貸中,家里承擔一半,我承擔一半,自己也已經成了家。因為自己的工資本來就不高,而且成立公司的時候我把之前工作的一點點積蓄再加上老婆的繼續都拿出來投到公司了。所以,我鑒于公司前景、自己的技術前景和經濟壓力,自己最終選擇退出,目前無業在家,自學linux準備轉職。


其實硬件主管生病影響確實挺大,我離開的時候只留下藍牙鎖半成品(支持低功耗、集成了GPS和GPRS模塊),軟件還沒有最終定型和穩定測試,硬件還有些問題沒解決。硬件主管后來因為比較嚴重的肺炎到我走之前為止都沒有來公司正常上班過,只是偶爾過來幫我們解決下問題就回去了。我自己其實不喜歡放棄,但是現實情況的確十分糟糕:


1.總經理對公司產品定位目前就是藍牙方向,和我技術期望方向不一致,而且目前做的東西對我技術方面的提高已經快到上限了,另外我也一直等著我能搞Linux的那一天(現在覺得我太單純了,其實在公司組建之初就應該好好想想的,當時只是憑著和總經理的感情和創業的心情,實在不好意思拒絕);


2.公司近況堪憂,因為硬件沒人做了,人手不夠,團隊也不是很和諧,原來的產品生產加工又復雜,成本大,到最后我基本淪為產品的生產者,做著一些和研發不相關的事情,比如焊接板子,排查解決不符合質量的硬件板子,總經理還讓我負責和客戶間聯系生產安裝的事宜,讓我鍛煉下比如溝通方面的能力,這都是現階段我不喜歡做的事情,至此我的研發的心態已經蕩然無存,再加上公司沒錢,發不了工資,為了維持開支,公司慢慢淪為倒買倒賣的性質,公司研發幾乎已經退化殆盡,感覺我這個研發的已經沒有什么存在的價值了;


3.團隊凝聚力不夠,氣氛不太好,幾個股東,一個我的同事,一個我的上級,一個硬件的(一直生病),所以打交道最多的是我那個同事(和總經理打交道基本都是研發上的),他主要負責公司雜七雜八的事情,之前他進原來的公司比我晚一年,但年齡比我大一點,剛進公司是技術支持。以前還好的,一起工作挺開心,可能因為他只是員工,并沒有表現更多的東西出來。我們自己成立公司的時候因為一些原因總經理讓他作為企業法人(實際上總經理是老大,股份本來他比我少,后來總經理說為了公平一點讓我和我那個同事股份一樣,我也同意了),加上之前做的產品故障率較高,給他增添了很多麻煩,感覺現在他對我的態度是越來越差,慢慢的他身上一些和我不太和諧的特征也慢慢體現出來,自己感覺和他一起工作不開心。另外,我記得原來總經理找我單獨談話時說過一句話:現在你們研發為公司做的貢獻還是0,因為產品研發進度慢,問題多,無法作為產品公布,都是靠安裝人員和業務人員跑一些其他單子很少的產品還有倒賣的一些產品賺的錢來養你們研發的(這不是原話,但是意思是這個意思),雖然這句話沒錯,但是覺得對自己的打擊很大;


4.個人經濟問題,的確是沒錢了,再這樣下去兩三個月,房貸我已經還不起了。


其實公司成立之后,自己慢慢對總經理的看法也變了,變的不是那么好了,慢慢不再對他充滿信任了。另外,自己的思路和總經理也不一樣,曾經在產品設計上提出的意見幾乎沒有被采納,而自己也不屬于那種很強硬的人,總之公司還是他說的算,我們只能提意見,接不接受是他的問題;至于我那個同事,我覺得他好像對總經理唯命是從,遇到我和總經理有分歧也是站在總經理那邊,很多的無奈與委屈也只能默默承受。


總結起來,自己在最后快離開的時候自己做的不太好,在最后一兩個月里,因為我想退出又不知道如何開口,最后把自己內心摧殘的比較消極,給公司其他人也帶來了消極的影響,最后沒有把自己分內的事情負責好。但是在這2年技術成長期和1年多的社會經驗體驗期還是經歷了其他同年齡人沒經歷到的東西,社會閱歷也豐富了些,也明白了自己的一些缺點和認識到以后一些需要引以為戒的地方。目前,我決定還是按照自己的規劃去走。


自己咨詢過一些同學和朋友,關于linux,目前做驅動的話,一般都是移植別人的驅動然后再改一改,相對來說做應用沒那么枯燥,目前安卓業發展起來了,關于以后做不做安卓我現在還沒有什么看法,目前把linux弄懂了再說。另外,自己屬于那種如果不深入了解某個東西就很不舒服的人,所以我現在主要是在研讀《understanding the linux kernel》這本書,教學視頻還有自己動手實踐沒有太多去做,之前零零散散也實踐過一些,但是也都只知道用而不明白更深的原理。以前看過一個大牛說自己辭職半年學linux,一開始也是先看內核的東西,關于linux的學習方法,還希望前輩多提提意見,個人覺得學習方法因人而異。


最后,自己覺得事業的開局是糟糕的,而且技術上自己和厲害的人比起來還是差了許多,很多東西因為工作的局限性我都沒弄過,這段日子感覺也耽誤了很多東西,把老婆也連累了,也讓家人擔心了,和其他同屆的同僚們比起來自我覺得很苦逼,目前壓力也比較大,留給我的時間也不多,總之相信事情會變的好起來。


自己目前的感悟是:


1.創業不是那么容易的;

2.有時候不能考慮太多,該果斷就果斷,關鍵問題要冷靜思考不能被某些因素沖昏頭腦

3.腳踏實地,穩扎穩打

4.最后,自己的命運把握在自己手中,不能過于把希望和幻想放在別人身上


那么嵌入式Linux、單片機待遇又如何呢?


首先說一下嵌入式的標準定義——?


“用于控制、監視或者輔助操作機器和設備的裝置”。


由定義可知實際上很廣泛,廣泛到單片機、PLC、工控電腦等很多東西實際上都是歸屬于嵌入式范疇。


但國內教育一般是將可編程控制芯片按照功能強弱進行分層,功能較強的歸類給嵌入式,特別是適合跑WINCE、安卓之類輕量級系統的處理器或FPGA、DSP、CPLD等可編程集成電路。能效差、主跑裸機特定程序、應用比較低端的歸給單片機。而無論是什么層次的單片機為核心,只要是加強了穩定性和針對工業環境設計、使用語句表和圖形化快速編程方式編輯工作邏輯的IO控制系統歸類為PLC。


從面向工資的角度來說,假設題主不升學歷的話,推薦優先選擇序列如下:


1、嵌入式(ARM+Linux):可對接工業機器人、物聯網、高端3C產品設計,但要去補課,主要是補充信號處理方面的知識,可不追求精深,但要了解。工資水平根據選擇企業和行業特點決定,相比3、4要好點。


2、嵌入式(FPGA、CPLD等集成電路設計):這條路基本上是走信號處理的道路,對數學、信號、模電理論等有很深的功底要求,一般能順利工作的起點多為碩士,但若有興趣喜歡做,本科能做好的也有。理論上,薪水是第一位,但工作難度也是第一位。


3、單片機:相關產品舉例——電飯鍋、豆漿機、智能化程度不高的家用電器之類的,同質化嚴重,能干的人也不少,競爭相對激烈,產品利潤低,導致薪水以及未來薪水漲幅都不是太好。但比PLC強一點。


4、PLC:悲催的PLC,最不推薦做的一個方向。搞PLC的一般都在各地的中小自動化公司或大公司的設備部,加班是常事,薪水不會太高,因為中專水平開始就可以搶你飯碗,技術附加值現在很低,跳槽也沒啥好發展。


------

對此也有人反對:


@江南一條魚魚


PLC那一條有點扯淡。 待遇這塊。。。有幾個同學開了自動化小公司,反正有房有車的,車是豪車房是大房。

大公司的設備部,奇瑞的設備部和廣本的設備部,都是設備部,可待遇不是差一點半點。

大型自動化公司,民營的,國企,歐美的,日韓的,或者上市沒上市的待遇也是都有很大區別。

技術這塊。。。你真以為plc就是寫兩步程序電機轉起來就完事??福特,通用,豐田等等對于自己的生產設備都有一套嚴格的標準,從圖紙設計,到程序編寫,仿真,器件選型,都要嚴格按照要求來,最傷頭的是這些標準都是英文編寫,隨便一個中專的能吃透么??


任何一行都有高端低端之分,路邊攤也算飯店,米其林餐廳也是飯店,他們能混為一談呢。


那么究竟是否要從單片機轉嵌入式Linux?


著名嵌入式工程師火哥這樣說:(來自嵌入式老鳥的職場之道)


盡管火哥目前從事Linux/Android方面的嵌入式開發工作,但是讀書的時候也有5年左右單片機裸機和RTOS經驗,之前面試也拿過一些做單片機stm32開發的offer,所以今天分享一些關于單片機是否要轉嵌入式Linux的一些觀點。


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


要不要從單片機轉嵌入式Linux是一個影響到職業發展的嚴肅決策,火哥不能幫你拿主意,只能幫你列出利弊,你需要根據自身的各種環境(比如所在城市Linux嵌入式相關崗位多嗎?是否決定背井離鄉去北上深發展等等)做出最有利的決策。火哥的觀點并不是Linux嵌入式絕對比單片機開發職業發展好,只是根據自身的一些經歷,給出一些看法。


1. 單片機開發相對于Linux嵌入式最大的劣勢在于基層的打工崗位平均薪資偏低。我想這是大部分單片機工程師想轉嵌入式Linux的最主要的原因。技術本身各有優劣,但是就基層打工而言,在同一座城市,就打工而言,單片機的薪資比嵌入式Linux低30%到50%。也許很多有會拿某些做單片機的高薪的老板(比如野火的火哥,周立功等)或者一些公司高管的薪資和做嵌入式Linux打工的工程師對比,證明單片機也可以拿高收入。但是他們都犯了田忌賽馬的錯誤,拿別人的上等馬和你的中等馬對比,火哥認為這種田忌賽馬的比較非常不切實際,基層打工的就應該和基層打工的這個水平的對比。目前火哥調查到情況來看,在深圳的基層就業市場,單片機(含RTOS)開發的起步薪資在6K-7K, 一般人到15K就是高薪,很難突破。20K以上的單片機offer也有,但是很少,最多也見過25K的單片機offer,但是那都是有名企,名校或者其他業務背景換來的,一般人真拿不到。嵌入式Linux/Android這塊,薪資相對高不少,起步價12K很正常,工作2年一般都能突破15K,3-5年突破20K甚至到25K也是很多的,5年以上去一線土豪大廠(華為、OPPO、VIVO等)可以到30K,如果在手機大廠做到模塊owner專家,突破40K也是可以有,但是在往上就有點難了。整體來看,同檔次的基層打工者,嵌入式Linux薪資比單片機開發還是高不少,單片機15K就會遇到瓶頸,突破20K就很難了,嵌入式Linux突破20K并不是難事,到25K以上才遇到瓶頸。


2. 你所在的城市嵌入式Linux崗位多嗎?我覺得這是影響你做決定的另一個大問題。我們學嵌入式Linux這門技術,絕大部分人是為了從事相關的工作,而不是陶冶情操。但是根據火哥統計來看,嵌入式Linux的普遍薪資雖然高于單片機,但是就業崗位并沒有單片機那么多。深圳目測是嵌入式Linux就業機會最多的城市,但是單片機機會看起來似乎更多,在深圳,單片機和Linux崗位數量對比大概6比4。從嵌入式Linux城市的崗位數量來看,依次是深圳 > 上海 > 北京 > 成都 = 杭州 = 蘇州 > 東莞(華為加持)>= 珠海 >= 南京 = 廣州 = 武漢 = 西安 = 福州 = 廈門 > 佛山 = 長沙 = 天津 = 合肥 > 其它, 在其它城市我就很少了解到做嵌入式Linux開發相關的崗位。所以如果你要考慮轉行,首先考慮是否愿意背景離鄉去以上幾個城市工作。否則哪怕你學了牛逼的Linux技術,可能也會在當地找不到對口不得不繼續從事單片機開發。


3. 單片機雖然待遇較低,但是就業機會更多,對大齡求職者相對友好。這點其實并不矛盾,做單片機各行各業的小公司特別多 (當然像格力,美的這種傳統家電大廠也有,但是華為、商湯等新興高科技大廠很少招單片機),業務多種多樣,需要的人更多,但是一般小廠可能資金并不充裕,給不起人才高價,加上單片機開發門檻較低(不考慮產品穩定性,EMC等有工作經驗自然會知道的概念,僅指學習使用單片機干活編程的培養門檻), 培養周期比較短(大二學生一個暑假的功夫),所以導致中低端能干活的人還是挺多,拉低平均薪資。但這就像富士康一樣,招人多,但抱怨缺人,老板就是不想把待遇提上去,要控制成本,這是缺人但是待遇低之間一種永遠存在的矛盾。但是對大齡求職者來說,由于單片機崗位實在是多,很多小廠真的很難以高的性價比招到優秀的人,在小廠也沒有HR插手做人力資源規劃,年齡梯隊建設,反而在年齡上卡的不嚴,大齡求職者只要薪資不挑,也能找到一份工作,所以相對于做Linux的大廠,對年齡問題比較寬容一些(可能由于單片機有點歷史了,大齡從業者也多)。


4. 單片機也有一些較高薪職位。在單片機工程師眼中,20k以上就算是高薪,以這個為標準,火哥也見過一些較高薪的職位,但是這里面有些特殊的要求。某家做智能門鎖STM32 RTOS的公司給火哥開過20K的offer,主要是因為公司希望招的技術人員都有985 211以上學歷背景,這樣溝通起來可能觀念比較一致,所以薪資能給到20k。另外還有一家明星獨角獸創業公司給過25K的單片機offer, 但是前提要求是能在Linux環境下開發單片機,而且面試難度較高,本來25K要價超出他們預期了,他們不愿意給這么多,后來火哥吊著他們一個星期,謊稱拿到華為同等價格的offer,他們才最終答應給25K的offer。剩下火哥還了解到有年薪80w的單片機高級工程師(掌握某些行業特殊的認證標準)。但是整體來說,單片機較高薪的offer確實不容易拿到,而且拿到也不僅僅是因為你的單片機技術好,解bug能力強,而是因為你的背景,學歷,有其它offer抬價,掌握特殊的業務競爭力等等(關于嵌入式業務競爭力可以讀讀火哥上一篇關于嵌入式競爭力的文章),這些特殊業務和文憑,背景都不是能靠當下自己砸時間努力看書學習寫代碼就能輕易獲取的如果能單單靠自己砸時間努力就能獲取的技術就不是啥門檻性的技術

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


二、 單片機和嵌入式Linux開發到底有什么異同


1. 單片機轉嵌入式Linux保留的優勢主要在于熟練的C語言編程能力以及豐富的底層軟件與硬件接口的調試經驗。因為Linux內核本身就是C語言編寫的,Linux底層應用程序大部分也是C語言的,一般有單片機開發經驗的,C語言應該不是問題,所以在切換的過程中,不需要考慮語言的切換,當然如果沒有系統學過數據結構(火哥認為數據結構是熟悉C語言必不可少的內容,哪怕單片機也要懂數據結構),可能需要補補,另外有uCOS FreeRTOS這類的實時操作系統開發經驗就更好,至少在看大規模C語言代碼的時候不害怕(其實懂uCOS內核也不代表能馬上掌握Linux內核,Linux內核真的復雜太多,設計理念也很不一樣)。另外豐富的單片機底層調試與寄存器配置經驗,可能幫助你在學習Linux嵌入式開發的時候能快速定位底層的一些問題,節約一些時間。


2. 單片機轉Linux嵌入式需要熟悉一套風格迥異的開發環境。對于大部分單片機工程師而言,都是在Windows上用IDE環境開發單片機程序為主(不排除有些公司已經使用Linux開發單片機了),Ubuntu這類Linux系統接觸比較少,所以你們要越過的第一關并不是Linux內核源碼,而是如何使用Ubuntu這種Linux系統。因為在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內核架構與實現的書,以為像學uCOS等RTOS系統一樣,都是C語言代碼,然后看得云里霧里,從入門到放棄。其實火哥在剛學習Linux嵌入式的,也犯過類似的錯誤,因而總結了一些經驗教訓。


1. 你需要花一定時間熟悉如何使用Linux系統進行編程開發。相信很多童鞋都是從小使用Windows電腦長大的,在學計算機編程之前,應該沒有接觸過Ubuntu等Linux系統,而這個系統又不像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視頻,總共有一二三四期等,有免費試看,也有付費的,直接X寶聯系賣家可以了解,火哥就不貼廣告鏈接了。另外還有其它視頻,火哥沒有看過的,就不隨便推薦了,在嵌入式Linux學習這塊,理論性的知識需要慢慢看書,但是實踐性的知識還是需要視頻資料帶你操作快速入門,看書和實踐循環漸進


3. 你可以嘗試做一些簡單的Linux應用和驅動開發了。走完了前面兩個步驟,相信你對嵌入式Linux開發有一定專業性認識了。在嵌入式Linux學習這塊,火哥更傾向于在做中學,60%實踐+40%理論。因為嵌入式Linux里面很多系統環境相關的東西,并不是書本上那種嚴格的理論公式,通過看書很難找到規律,而且在Linux內核里面有一整套GNU(GNU是啥意思自己搜)世界的行話,那些寫Linux內核,驅動書籍的技術專家不可能所有行話都給你解釋,所有在沒有使用和開發經驗的前提下就直接打開《Unix環境高級編程》、《Linux設備驅動程序》等大牛的經典書籍,容易讓你云里霧里。火哥建議是,跟著一個視頻教程,比如韋東山老師的嵌入式Linux視頻,從0開始寫一個簡單驅動和應用,讓自己寫的驅動和應用代碼跑起來,點亮1個Led燈,先不用管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開發經驗的情況下拿到IC原廠Linux的offer, 當然校招之后還有大半年,買了韋東山付費視頻狂補相關知識),所以在校生應該乘著寶貴的時間,把火哥上一節提到的第4點基礎知識打牢固,這樣工作之后就可以專注業務知識學習,更快升職加薪,不用因為基礎知識不牢,回爐重造。


另外,在校生可能有各種單片機嵌入式的競賽,在競賽過程中,可能可以拿到很多獎,得到老師同學的夸贊。但是切記戒驕戒躁,不要因為比普通的同學多掌握2個技術就自以為了不起(你們以后面試的競爭對手根本不是這些完全沒有技術同學),不要因為幾個獎狀就飄了,而不能靜下心來學習數據結構,操作系統原理等基礎知識。如果不是在知名期刊發表高水平論文,或者國際上認可的ACM, Kaggle, ISLVRC圖像競賽中拿到那種高質量有分數和名次比賽結果的獎,其它國內競賽的獎在面試與實際工作中并沒有太多說服力,面試官反而喜歡基本功扎實,可塑性強的學生,而不是國內各種獎一堆,結果時間復雜度,鏈表堆棧,mmu虛擬地址空間等概念一問三不知的學生。


那么其他專業該能轉嵌入式嗎,如何轉?


前幾天,有朋友在后臺問,他是一個機械專業的學生,想轉到嵌入式方向,該怎么學?今天我們特意做了這樣這個話題,希望能幫到那些想轉嵌入式領域的朋友們!


當局者迷,旁觀者清,關于轉行這件事,先聽聽其他人的看法:


機械到嵌入式,我不覺得是轉行,算是自己專業領域的拓展,畢竟嵌入式軟件不是純理論的東西,絕大部分是通過機械來實現其功能的。舉一個極端的例子,你覺得設計一個機器人都需要哪些知識?僅僅的機械設計和嵌入式軟件就夠了嗎?遠遠不止。學習嵌入式軟件設計并不意味著放棄機械設計。

能有這個想法很好,純粹地做機械,不是太好,以后的趨勢肯定是要復合型的。

首先從個人發展來說,軟件行業(嵌入式/通信/互聯網)整體薪資待遇都比傳統的機械行業要好,如果有毅力和決心,并且能主動學習,為了提高自己的生活水平,換行業未嘗不可。從行業發展來說,據我所了解的,國內的高精度數控機床的研發一直是很薄弱,這方面的研究需要跨行業的人才,如果能有這樣的機遇是相當不錯的;另外機器人領域的研究(自動化生產)也在興起,有跨行業的技術背景也是相當不錯的。

嵌入式軟件開發以后會比較火,而且應用范圍比較廣。但不太建議完全放棄原來的工作領域,轉入嵌入式。最好是能找到一些交叉點,這樣你的職業生涯起伏會比較小。

我是學機械的,但同時對于電子與軟件非常喜歡。我學習單片機和畫電路圖,所以,在這方面是有一些心得的。如果純機械的人,想轉到電子或軟件,要進行的轉變比較大,最好要有人帶。軟件要學得比較深,所以,要向這個方面發展的話,需要學習的很多很多。我想,如果自己喜歡,而且各方面的條件比較合適的話,可以向這方面發展呀。

如果覺得你在機械設計這個行業的專長還沒有發揮到極致,建議不要轉行。如果你有能力只是感覺工作困難就不要轉了。這年頭做哪個行業都會遇到困難,看你在困難面前能堅持多久。綜合分析下,如果你覺得自己的能力沒辦法再堅持下去,建議馬上轉,不要猶豫。當然跨行還會遇到困難。


當然,上面的建議只是參考,如果你真的想好了,要轉做嵌入式工程師,下面的建議可以看看:


1.嵌入式涉及到很多的基礎知識


C語言,關于C語言要知道基本的語法,什么是結構體,什么是共用體,有什么區別,不用強記一些二級考的東西,因在實際中用的很少。


C++要知道什么是類,怎么定義,繼承,接口,要深刻理解,當然基本語法也是必不可少的。


操作系統原理也應該知道基本的原理的,什么時間片啊,任務調度啊,都是需要知道的。


Linux基本命令的使用(vi編輯器必須會用,因為在終端改文件的時候只能用這個),我們現在很多的人都習慣用鼠標了,很少用到命令,我們學習嵌入Linux可要改改這個習慣了,Linux用命令操作一是效率高,二是功能非常強大,遠非圖形界面能比的了的,其實我們用圖形界面的操作都要轉化為命令傳給硬件的。


Linux文件系統的管理要清楚,哪個目錄存放是什么東西,有什么用,文件權限管理等。  


Shell編程也要了解一些,在這給大家推薦一個教程,周朝劍的shell編程,也就七八講吧,講的很全面。初學者看前4講就可以了。


2. 看書不要希望一次就會,一次就明白是什么意思,也不要死記硬背


看不明白也沒關系,以后遇到了知道去哪里去找就可以了,以后遇到的多了,也就記住了,遇到的少的,忘記也就忘記了。還有,不要直接閱讀Linux內核源代碼,看一些自己把頭撞破也想不明白的事,會打擊初學者的積極性,要循序漸進,今天學個做個LED,明天做個串口,后天說不定就做硬件編解碼了。


3.你可以不接受培訓,但是不能不買開發板


如果你想學習嵌入式一定要買塊學習板,現在的開發板很便宜了,給初學者減輕了很多經濟負擔。看再多的視頻,看再多的書,也不如自己動手試一下,看著很簡單的東西,做起來就可能遇到很多的問題,遇到問題找到原因,解決問題,只有這樣才能學到東西,記得我第一次寫LED的驅動,想自己試一下,網上也有人寫過相關的代碼,可是自己一試,就出了好多的問題,弄了一天才把LED燈點亮。所以不要眼高手低。


還有關于培訓,現在的培訓機構很多,講的也不錯,老師也很好,但是有一個問題,太集中了,而且學生動手的機會也不太多,記得我們公司還招了一個在北京某個培訓機構培訓半年的員工呢,花了一萬多,來了之后也沒感覺有多高,問他都學了什么,也就是我前邊說的那些基礎知識,很多的東西還是不知道的,照著書弄個helloworld模塊驅動兩天沒搞定。不是培訓不好,但我個人見解效果并不是很好。記住:只有自己動手做過的東西才是自己的。


4.不要好高騖遠,要腳踏實地


對于初學者,還有一點小建議,我們拿到一個開發板,很興奮也很激動,想法自然也很多,想用開發板實現自己的這個想法,實現那個想法,然后又不知道從何下手,然后就去論壇中發一個貼, “那個什么什么怎么實現啊,哪位大俠能詳細說一下啊,跪求!!”然后等著別人去回復。見沒人回復就抱怨。有想法是好的,我們要實現自己的想法也是有前提的,首先,我們對這部分知識了解嗎?如果不了解就去google一下(最好別用百度,不太好用),了解了一些,也就大概知道要怎么做了。如果再遇到問題,再去發貼問,這樣也顯得咱們有水平。比如自己連串口是什么都不太清楚呢,就問串口通信怎么做啊,就是人家把代碼給咱,咱也不明白是怎么回事啊。


5.多看代碼,多寫代碼


見多識廣,熟能生巧。多看代碼,要從代碼中讀出代碼的意思來。自己平時也要多寫代碼,多練習

我要點評

評論暫時關閉。

最新評論

  • e_0072019-06-30 10:46回復

    從實踐中學到的,從硬件,MCU/ARM/x86,再是linux/android驅動開發的。隨年齡增大,如有機會往資深或管理層(甚至創業)走的話(個人走在半資深狀態),最好能掌握這些,mcu/arm,rtos/linux/android,這樣才能更全面的接受更多更復雜的產品線,才不會臨陣磨槍。

极速十一选五平台