海康威視嵌入式開發面試經歷:C語言+RTOS+硬體基礎全考察
2年嵌入式經驗面試海康威視,三輪技術面深度考察C語言指標記憶體、RTOS排程機制、驅動開發實戰,附真題彙總與備考建議
背景介紹
先說說我的情況吧,本科電子信息工程,畢業後在一家中小型安防公司做了2年嵌入式開發,主要做IPC(網路攝影機)的韌體開發,用的晶片是海思的Hi3516,日常寫C語言、調驅動、偶爾搞點RTOS的移植。說實話,海康威視一直是我心目中的嵌入式天花板之一,畢竟安防行業的老大,技術棧也跟我之前的工作非常對口。
投履歷是在9月份的秋招補錄階段,HR回覆還挺快的,大概3天就約了一面。整個面試流程是三輪技術面+一輪HR面,跨度大概兩週。下面我按輪次詳細覆盤一下。
面試流程覆盤
一面:C語言基礎+記憶體管理(約60分鐘)
一面是個看起來30歲左右的技術大哥,開場先讓我自我介紹,然後直接進入技術環節。說實話,海康的一面真的很硬核,沒有廢話,全是乾貨。
指標相關:
第一個問題就讓我有點緊張——「說一下指標和陣列的區別」。這個我答得還行,從記憶體佈局、sizeof的區別、能否自增等角度說了。但面試官追問了一個:「那指標陣列 和陣列指標 呢?」我愣了一下,好在之前複習過,趕緊說p1是陣列,每個元素是int指標,p2是指標,指向一個int陣列。面試官點了點頭。
接著問了一個讓我印象深刻的題:「寫一個宏,求結構體中某成員的偏移量」。這個就是offsetof宏的實現原理,我寫了((size_t)&((type*)0)->member),面試官說可以,又問我為什麼要用0地址,我解釋了透過0地址強轉可以避免實際建立物件,直接算偏移。
記憶體管理:
然後面試官問:「說一下malloc的底層實現原理」。我從brk/sbrk系統呼叫、記憶體池、chunk結構等方面說了,面試官又追問:「那free的時候是怎麼知道要釋放多大的記憶體的?」這個我答了malloc會在回傳的指標前面存一個header記錄分配大小,free根據這個header來釋放。
還問了一個經典問題:「什麼是記憶體對齊?為什麼要記憶體對齊?」我從CPU存取效率、某些平台不支援非對齊存取、結構體填充等角度回答的。
volatile關鍵字:
「volatile有什麼用?哪些場景下必須用?」我舉了三個場景:中斷服務程式中修改的變數、多執行緒共用的變數、記憶體映射暫存器。面試官追問:「那volatile能保證執行緒安全嗎?」我明確說了不能,它只是防止編譯器最佳化,不保證原子性。
二面:RTOS+驅動開發(約75分鐘)
二面的面試官明顯更資深,應該是部門的技術負責人。這輪面試的深度明顯上了一個台階。
RTOS相關:
先問了我之前用的RTOS是什麼,我說FreeRTOS。然後問:「說一下FreeRTOS的任務排程機制」。我從優先級搶佔排程、同優先級時間片輪轉、就緒列表的資料結構(鏈結串列陣列)等方面詳細說了。面試官追問:「那任務切換的時候具體發生了什麼?保存了哪些上下文?」我從PendSV中斷、壓棧保存暫存器、更新任務堆疊指標、恢復新任務上下文等步驟說了。
還問了一個很實際的問題:「FreeRTOS中任務間通訊有哪些方式?各自適用什麼場景?」我列舉了佇列、號誌(二值/計數)、互斥量(含優先級繼承)、事件組、任務通知,並分別說了適用場景。
驅動開發:
面試官問:「你之前做過哪些驅動的開發?」我說了I2C、SPI、UART這些。然後他讓我詳細說一下I2C驅動的實現,我從GPIO模擬I2C時序、start/stop條件、ACK/NACK處理、7位地址等方面說了。追問:「I2C和SPI的區別是什麼?各自優缺點?」我從線數、速率、多從機支援、全雙工/半雙工等角度對比了。
還問了一個關於中斷的問題:「說一下Linux的中斷上半部和下半部機制」。我從上半部快速處理、下半部延後處理的角度說了,列舉了softirq、tasklet、workqueue等機制。
三面:專案深挖+綜合考察(約60分鐘)
三面是總監級別的面試,主要圍繞專案經歷深挖,同時考察系統思維。
面試官讓我挑一個最有挑戰的專案詳細說。我選了之前做的低功耗IPC專案,從需求分析、方案選型、遇到的問題、解決方案等方面詳細說了。面試官追問了好幾個點:「你說的低功耗模式切換,具體是怎麼實現的?喚醒延遲是多少?」「視訊編碼的碼率控制策略是什麼?」「如果讓你重新設計,你會怎麼最佳化?」
還問了一個開放性問題:「如果你負責的產品在客戶現場出現了偶發的死機問題,你會怎麼排查?」我從重現條件確認、日誌分析、看門狗配置、記憶體洩漏排查、硬體訊號抓取等方面系統地說了排查思路。
真題彙總
C語言:
1. 指標和陣列的區別?指標陣列和陣列指標?
2. 寫一個offsetof宏
3. malloc底層實現原理?free如何知道釋放大小?
4. 什麼是記憶體對齊?為什麼要對齊?
5. volatile關鍵字的作用和適用場景
6. struct記憶體佈局計算(給定一個結構體求sizeof)
RTOS:
7. FreeRTOS任務排程機制
8. 任務切換的上下文保存與恢復過程
9. 任務間通訊方式及適用場景
10. 優先級反轉問題及解決方案(優先級繼承/天花板協議)
驅動開發:
11. I2C驅動實現細節
12. I2C與SPI的區別
13. Linux中斷上半部/下半部機制
14. DMA的工作原理
綜合:
15. 偶發死機問題的排查思路
16. 低功耗設計方案
17. 看門狗的原理和使用注意事項
心得建議
1. C語言基礎一定要扎實。海康的一面幾乎全是C語言,而且不是那種背八股文就能過的,很多題目需要你真正理解底層原理。比如offsetof宏、malloc實現這些,光背答案面試官一追問就露餡了。
2. RTOS要理解原理,不能只會用API。很多人用FreeRTOS就是調調vTaskCreate、xQueueSend,但面試官問的是排程機制、上下文切換這些底層原理。建議去看看FreeRTOS的原始碼,特別是tasks.c和list.c。
3. 驅動開發要有實戰經驗。海康非常看重實際動手能力,光看書不寫程式碼是不行的。建議自己買個開發板,從GPIO點燈開始,到I2C/SPI驅動,再到完整的裝置驅動框架,一步步來。
4. 專案經歷要能講清楚細節。三面主要就是聊專案,面試官會從各個角度追問,如果你的專案是自己做的,細節都能答上來;如果是包裝的,很容易被問住。所以履歷上寫的東西一定要是真正做過的。
5. 系統性思維很重要。嵌入式開發不是只寫程式碼,還要考慮硬體、功耗、穩定性、可維護性等多方面因素。面試中展現系統性思維會加分很多。
FAQ
Q:海康嵌入式面試對學歷要求高嗎?
A:本科及以上都有機會,但校招更看重985/211,社招的話更看重專案經驗。我是雙非本科,靠專案經驗拿到的offer。
Q:需要準備Linux核心相關的知識嗎?
A:看崗位,如果是做Linux驅動的崗位,核心知識是必須的;如果是做RTOS的,重點準備RTOS就行。但了解一些Linux核心知識總是加分的。
Q:面試中會寫程式碼嗎?
A:會。一面讓我手寫了offsetof宏和鏈結串列反轉,二面讓我寫了一個生產者-消費者模型的虛擬碼。建議提前刷一下嵌入式相關的程式設計題。
Q:海康的嵌入式開發主要用什麼晶片?
A:海康自研晶片和海思晶片都有,具體看部門。面試前建議了解一下海思的晶片架構,比如Hi3516/Hi3559這些。
Q:薪資待遇怎麼樣?
A:2年經驗的話,海康給到的薪資在杭州算中上水準,具體要看談的情況。福利方面五險一金是按全額交的,這點還是比較良心的。