天天看點

記錄嵌入式面試的流程

選擇嵌入式行業,意味着初期進行很大的付出,希望找到一份滿意的工作也是理所當然的,最近正好離開原公司,面試了幾家企業,基本參加的都給了offer,這裡總結下面試遇到的事情,也是一種積累。我也經曆過剛踏入嵌入式行業啥都不會的時候,那時面試都是以基礎C語言為主,再以簡單的子產品如AD的精度,序列槽, SPI接口的應用調試特性為主,我下面分享的則是結合上面的知識,告訴你們一般公司對3年左右工程師的需求,我以有代表性的面試流程總結來講訴。

  1. 基礎C語言測試,常見的題目類似下面的:

定義一年有多少秒

volatile,static用法

翻轉指針連結清單

清除,置位,指派資料位

中斷函數,浮點

如何C代碼實作判斷大端,小端

指針,數組,強制轉換

存儲空間,堆,棧,全局變量區

函數的健壯性,代碼改進

這些面試資料網上一大把,可能是公司流程問題,不過對于3年以上工程師面試,公司也不看重這些,基本上是個過場,對的多不加分,錯的多是扣分項,當然如果是一線的嵌入式研發工程師,基本上1年以上經驗這些都不該有大問題,可以某些筆誤,但不應該有明顯不了解,這部分隻對于初/未入行業的開發人員還是有一定篩選意義的。

  1. 與人事的面試

人事的面試在技術面試的前/後都有可能,這一步一般來說即重要,也不重要。重要的是在于這一步決定了你以後在公司的福利待遇,工作時長,餐補和交通補貼等,不重要是除非你有重大的錯誤,如欺瞞學曆,态度不端正等,基本不會影響到面試錄取的最終結果。這裡面有個重要的技巧,那就是薪資範圍一定要比你心理能接受的價位要高,如心理價位是1w,那至少要1w2-1w4,心理價位是1w5,那至少要1w8-2w;因為這并不得罪人,在工資上,負擔對象是公司,而不是你對面的人事,這樣給後期技術面成功後留下調整的空間,我至今還沒遇到過要多少給多少的,後期都是通過溝通在預期薪資基礎上少500-1500不等,千萬不要要低了,因為這會影響到未來幾年的收入,還影響調薪的基數。另外對于加班和現在深惡痛絕的996,可能是因為行業原因,加班我是接受的,在項目緊張的時候别說996了,997我都幹過,但我不接受的是強制996,就是我有工作未完成,加班我願意來,但不能強制,周六必須上班這種。當然我也是以直接拒絕了一些公司,甚至我所在行業的靠前企業,當然這是我的想法。我這麼說就是告訴你不要把自己放的太低,即使是面試者,和面試官也是平等的,提出自己的訴求沒問題,當然我不會說堅持不加班的,這就是對自己和工作需求博弈的定位。

  1. 與技術的面試

在我剛踏入嵌入式行業的時候,技術面試對我簡直就是災難,現在回想起來,其實對于面試官來說,這種面試也很窄,隻能從較少的小項目中來問一些很基礎的東西,如各個子產品的調試經曆,涉及到C知識,對硬體開發的了解(這一部分是初期很薄弱的),關鍵是稍微問深點也很難答上來,因為這些子產品我們都是調用晶片廠商庫開發的,也沒用覆寫性的測試,很難說出有亮點的問題和解決問題的思路,但當工作幾年出來後,再去面試是很有趣的事情,基本上都是和比你強,或者至少一個水準的人來互相探讨交流,是一個吸收碰撞,整理自己不足,開拓視野的過程,這裡分享下我遇到的面試問題。

技術面試很多都是以介紹自己的工作項目開始,在我工作3年後面試基本上自我介紹就可以完全把控流程,這種對于做過項目的人來說其實真的很簡單,甚至通過一個項目,就大緻可以整體了解一個人的水準,以我剛入行做的交換機管理子產品為例,我大緻闡述了産品的架構,由STM32晶片+新塘單片機+FPGA構成,我負責STM32晶片完整軟體開發,支援遠端網絡線上更新,主要包含FreeRTOS移植,LWIP移植,http/telnet/snmp伺服器實作,以及與新塘通過RS485接口,使用自定義協定通訊,這些簡單一列出來,很多問題立馬就提出來了,下面并非标準答案,隻是我根據實際開發産品,所闡述最後得到offer的答案,這個要謹記。

1.項目中的任務是怎麼配置設定的,任務間怎麼通訊

LWIP占用兩個任務,底層任務和LWIP内部管理任務,底層任務由信号量堵塞,由ETH中斷觸發産生信号量,讀取ETH接收的資料;LWIP内部管理任務使用隊列管理内部的所有消息。RS485任務單獨建立任務,與UART和DMA中斷配合,産生信号量來讀取共享資料區的接收資料,用于輪詢下位單片機提供的FPGA參數。http和telenet也都是單獨任務管理,使用郵箱與LWIP内部管理任務進行TCP資料的互動。另外還有空閑任務用于LED訓示燈的閃爍和看門狗喂狗。

說明:用來考察對項目的認知熟練程度,隻有完整實作的才能理清楚内部整體架構資訊。

2.項目使用了自定義協定,是什麼結構,可以用C寫下如何實作嗎

這個如果學習了解過Modbus協定,那麼我們這個自定義協定其實差不多,結構為:起始位+位址位+指令+資料長度+資料+CRC校驗(具體代碼實作較多,這裡不在贅述,實作可參考《利用序列槽點亮/關閉LED燈》裡面關于協定的實作)。

說明:即考察C知識(指針,數組), 也涉及到協定的了解,這在嵌入式行業裡也是十分重要的大類分支。

3.項目使用RS485接口,是如何保證雙機通訊的穩定性的

為了實作穩定性,主要包含了硬體/軟體的方法,軟體上當資料發送失敗或等待傳回逾時,進行異常計數,繼續輪詢,當超過一定次數後(我們定義的是三次,成功則清零),此時則通過硬體引腳強制複位下位機晶片,并将下位機狀态置為異常态,清零計數,在重複輪詢過程,如果繼續失敗,則将下位機狀态置為出錯,修改内部錯誤碼,并反映到外部的訓示燈上和管理界面上,通知産品通訊故障。

說明:穩定性,即是技術問題,也是經驗問題,這可以看出開發中的設計思路問題,對于一些要求比較高的行業,如電源管理,車輛管理中,備援設計是必要了解的。

4.你們對于FLASH的配置資料存儲有效性是怎麼保證的

對于配置資料的存儲有效性,也涉及到軟體/硬體方法,硬體上我們使用備份頁和備份标志區,将要寫入區域的資料先寫入備份區,同時置位備份标志位,然後在原位址執行解鎖,擦除,寫入流程,如果成功則擦除備份标志位,失敗傳回錯誤即可。軟體上我們将寫入FLASH的資料定義為結構體,并添加CRC校驗位,讀取後校驗失敗後則使用預設的配置資料。

說明:同上

5.你實作了線上更新功能,具體怎麼實作的

線上更新主要實作bootload以及實作網頁線上下載下傳,産品中将FLASH劃分成bootload和Application,以及更新代碼暫存區,通過網頁将固件更新到暫存區,并修改标志位,産品重新開機後,bootload如果檢測标志位和校驗都通過,則将代碼移動到Application區域,然後在跳轉執行,否則直接跳轉執行(我這裡隻是簡單說下流程,實際會複雜些,詳情可以看之前的文章)。

說明:線上更新本身技術上來說不難,但從這可以考察對于設計的把控程度。

6.你們産品開發的流程是什麼,你參與了什麼

市場調研

項目立項,主要配合産品經理參與前期産品定義和項目規劃

産品基本架構設計,主要配合晶片/模組選型和功能需求分析,初步文檔完善

硬體實作和開發闆軟體搭建,軟體部分負責前期開發闆搭建基礎架構實作,配合硬體解決設計問題

軟體流程開發,在實際硬體闆進行功能開發,并回報結果,同時完善文檔。

産品優化和需求更新,主要結合開發遇到的軟/硬體問題,配合硬體完善産品的功能,并解決伴随開發的需求更新問題。

産品測試,配合測試工程師的電壓穩定性,高低溫,老化,産品需求方面的測試,解決回報的問題。

開發文檔,使用文檔和後期維護文檔完善

  說明:參與正規的流程開發,熟練掌握流程,是從嵌入式工程師走向架構師的必要過程,為了未來更好發展,多聽,多看,多參與是必須的,單純的做技術其實很困難。

7.對于多人合作的項目,你們怎麼進行管理的,如果你參與的項目,在客戶現場需要更改别人維護的底層庫,你怎麼處理

我以前參與的項目是使用SVN管理,個人對自己負責的庫進行維護管理,其它人需要更新的話需要送出問題給維護者,由對方經過全面測試進行更新。遇到你說的情況,之前采用的方法是如果客戶要求不緊急,則現場人員将更新送出到庫的維護人員,全面測試後進行庫的更新,然後在客戶這邊進行整體庫的替換,如果要求時間比較緊張,則現場提供測試版本分支,不直接并入庫中,解決後在送出給庫的維護人員,測試後進行版本更新,然後通知使用者更新到正式版本。

說明:分支管理和客戶需求的沖突對于大型項目是一個抉擇問題,也是經常遇到的問題,很難有最優解,最好根據公司的制度處理,我這裡說明的隻是根據自己公司處理的解決辦法,并不一定是最優的辦法。

8.你掌握的這些接口,子產品(SPI, I2C, USB, TCP/IP接口等)在這份工作可能并沒有任何涉及,你是怎麼看待的