1. 程式人生 > >【面試】小米公司嵌入式職位面試經驗

【面試】小米公司嵌入式職位面試經驗

面試得很廣,從硬體、軟體、基礎知識、簡歷內容都有涉及。

整個面試持續了將近三個小時,由三位面試官輪流來問,分別偏重硬體、軟體、以及綜合,但總的來說還是圍繞簡歷基礎知識來問的。

第一位面試官面的比較偏重硬體,分別問了:

  1. 資料傳輸的時候如果上下升延雙倍速率採集數字訊號的話,如果有一個邊沿正好採集到數字跳 變時怎麼辦(我回答是從佈局佈線、建立保持時間以及FPGA的引腳約束相關方面來回答的);
  2. 模電中的運放,叫畫一個求對數的電路,表示好幾年沒複習過,完全忘了,面試官表明還是很注重基礎的;
  3. 由於面試得是小米的智慧家居相關部門,而面試得這個團隊產品上用的作業系統不是linux,而是類似ucos這樣的,問了好一些程序間同步及通訊的手段,也就是自旋鎖、訊號量這些東西的原理,還叫自己實現自旋鎖;
  4. 看我FPGA有相關經驗,叫用Verilog寫了個計數器;
  5. 單向連結串列的排序;
  6. 快速排序;
  7. C語言的一些基礎知識(volatile、const、static、指標之類的);

第二位面試官稍微偏軟一些,問的都是軟體相關的問題:

  1. 實現memcpy(char*dest,char*sor,size_t size);
  2. 寫一個巨集OFFSET,已知結構體中一個成員,求出該成員在結構體中的記憶體偏移量,#define OFFSET(type,member) ((size_t)&(((type*)0)->member))
  3. 結構體中的記憶體分佈等;
  4. 出了一個題,已知有一個硬體計數器控制該計數器有兩個暫存器,一個用於設定時鐘的初始值,一個用於設定時鐘的門限值,當時鍾初始值設定好後開始計數,當計數值達到門限值後,便會觸發一個函式的執行,讓我編寫兩個函式,分別實現1:在任意時刻能夠設定多少時間後觸發某個函式的執行;2:在任意時刻能夠取消之前設定的執行任務;(解決思路是用連結串列實現一個最小優先佇列,設定任務對應著佇列的插入,到時間執行和刪除對應著優先佇列的結點的刪除,觸發時跳到相應的函式中就行了);

最後一個面試官由於時間不足了,只問了一個比較發散的問題:

  1. 假設有一個很大的檔案,裡面的資料結構如下:
    XXX.XXX.XXX.XXX(IP地址) 天氣;如192.168.1.1 晴轉多雲
    問怎麼用最快的方式找到一個地區的天氣狀況(IP地址往往與地區有著對應關係)。我回答的思路是在儲存檔案的時候就將每一條資訊對齊(即佔用大小一樣的地址),然後使用二分法搜尋每一個IP段的位置,移動檔案指標即可(O(lgn));

當然,還問了些許關於簡歷上的專案,總的來說,問的很雜很多,但不會很難;