車輪戰(zhàn):核心考點(diǎn)與避坑復(fù)盤)
1. 四小時(shí)車輪戰(zhàn)到底在考什么涂鴉智能的嵌入式AIoT崗位面試圈內(nèi)人給它的標(biāo)簽就一個(gè)字密。四小時(shí)車輪戰(zhàn)不是夸張修辭是實(shí)打?qū)嵉倪B續(xù)技術(shù)轟炸從C語(yǔ)言基礎(chǔ)到RTOS任務(wù)調(diào)度從I2C時(shí)序到NB-IoT入網(wǎng)流程中間幾乎不給你喘氣的窗口。我面完出來(lái)第一反應(yīng)不是累是覺得這四小時(shí)把嵌入式崗位的知識(shí)圖譜從頭到尾犁了一遍。這篇文章適合兩類人看一是準(zhǔn)備投涂鴉智能或類似AIoT公司的嵌入式崗位想知道面試官到底會(huì)往哪個(gè)方向挖二是已經(jīng)在做嵌入式開發(fā)但對(duì)AIoT和NB-IoT這塊的實(shí)戰(zhàn)鏈路還不夠清晰想借這個(gè)機(jī)會(huì)把知識(shí)體系串起來(lái)。我會(huì)把四小時(shí)里被問到的核心問題、我踩過的坑、以及事后復(fù)盤覺得應(yīng)該怎么答才到位全部拆開講。先給一個(gè)整體判斷涂鴉智能的面試風(fēng)格偏實(shí)戰(zhàn)不太考純八股的定義背誦而是給你一個(gè)場(chǎng)景看你能不能把通信協(xié)議、硬件接口、系統(tǒng)調(diào)度這幾層串起來(lái)。比如面試官不會(huì)直接問你“I2C的起始條件是什么”而是問“你有一個(gè)I2C的溫濕度傳感器讀數(shù)據(jù)偶爾失敗你怎么排查”。這種問法就要求你不僅知道協(xié)議本身還得有調(diào)試思路和工具使用經(jīng)驗(yàn)。四小時(shí)的時(shí)間分配大致是這樣的前一個(gè)小時(shí)偏C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)中間一個(gè)半小時(shí)集中在嵌入式Linux和RTOS相關(guān)最后一個(gè)小時(shí)到一小時(shí)半全部圍繞AIoT通信協(xié)議和NB-IoT實(shí)戰(zhàn)場(chǎng)景。整個(gè)流程是多個(gè)面試官輪換每人負(fù)責(zé)一個(gè)方向節(jié)奏非常緊湊。注意車輪戰(zhàn)面試最忌諱的是在一個(gè)問題上卡太久。如果某個(gè)問題你確實(shí)不熟快速給出你的思路框架然后主動(dòng)引導(dǎo)到你熟悉的領(lǐng)域比硬撐要好得多。2. 嵌入式基礎(chǔ)環(huán)節(jié)的高頻考點(diǎn)與答題邏輯2.1 C語(yǔ)言與底層編程的考察方式涂鴉的C語(yǔ)言考察不會(huì)停留在“指針和數(shù)組的區(qū)別”這種層面。面試官更傾向于給你一段有bug的代碼讓你現(xiàn)場(chǎng)分析問題出在哪。我當(dāng)時(shí)拿到的是這樣一段代碼char *get_buffer() { char buf[64]; sprintf(buf, sensor_data_%d, 42); return buf; }這段代碼的問題很明顯——返回了棧上局部變量的地址。但面試官追問了一句“如果這個(gè)函數(shù)在RTOS的任務(wù)里被調(diào)用除了野指針還可能引發(fā)什么問題”這就把問題從C語(yǔ)言層面拉到了RTOS的內(nèi)存模型層面。在RTOS中每個(gè)任務(wù)有自己的棧空間返回棧地址后如果任務(wù)切換這塊棧內(nèi)存可能被其他任務(wù)的上下文覆蓋導(dǎo)致數(shù)據(jù)完全不可預(yù)期。更嚴(yán)重的是如果這個(gè)指針被傳遞到中斷服務(wù)程序中使用可能直接觸發(fā)硬件異常。我的建議是準(zhǔn)備這類問題時(shí)不要只背“棧上變量不能返回”這個(gè)結(jié)論而是要把RTOS的任務(wù)棧模型、中斷上下文、內(nèi)存對(duì)齊這些關(guān)聯(lián)知識(shí)一起串起來(lái)。面試官想看到的是你對(duì)底層內(nèi)存布局的真實(shí)理解而不是背誦八股。另一個(gè)高頻考點(diǎn)是volatile關(guān)鍵字。面試官問的是“在嵌入式開發(fā)中什么情況下必須用volatile舉三個(gè)實(shí)際場(chǎng)景。”這個(gè)問題看起來(lái)簡(jiǎn)單但要答到位需要結(jié)合具體硬件場(chǎng)景。我當(dāng)時(shí)的回答是第一硬件寄存器的映射地址必須加volatile因?yàn)榫幾g器優(yōu)化可能把多次讀取合并成一次但寄存器的值可能被硬件隨時(shí)改變第二中斷服務(wù)程序中修改的全局變量主循環(huán)中讀取時(shí)必須加volatile否則編譯器可能把這個(gè)變量緩存到寄存器里第三多任務(wù)共享的標(biāo)志位變量。面試官聽完追問了一句“DMA傳輸?shù)哪繕?biāo)內(nèi)存需不需要加volatile”這個(gè)問題我當(dāng)時(shí)答得不夠好后來(lái)查了資料才確認(rèn)DMA寫入的內(nèi)存如果CPU要輪詢讀取確實(shí)需要volatile來(lái)防止編譯器優(yōu)化。2.2 通信協(xié)議層的連環(huán)追問通信協(xié)議是涂鴉面試的重頭戲。面試官?gòu)腢ART開始一路問到I2C、SPI、CAN最后落到NB-IoT。每個(gè)協(xié)議都不是孤立地問定義而是圍繞“你怎么用”“遇到問題怎么排查”來(lái)展開。UART部分面試官問了一個(gè)很實(shí)際的問題“你用UART和模組通信波特率115200偶爾出現(xiàn)數(shù)據(jù)錯(cuò)位怎么排查”這個(gè)問題的排查思路應(yīng)該是分層的先確認(rèn)兩邊波特率是否精確匹配晶振誤差是否在允許范圍內(nèi)然后用邏輯分析儀抓波形看起始位和停止位是否正常再檢查是否有電磁干擾導(dǎo)致誤碼最后確認(rèn)軟件層面的接收緩沖區(qū)是否溢出。我當(dāng)時(shí)漏掉了晶振誤差這一層面試官提醒后才補(bǔ)上。I2C的考察更偏硬件時(shí)序。面試官給了一個(gè)場(chǎng)景“I2C總線上掛了三個(gè)設(shè)備其中一個(gè)設(shè)備偶爾不響應(yīng)你怎么定位是哪個(gè)設(shè)備的問題”這個(gè)問題的核心是地址沖突和總線電容。首先確認(rèn)三個(gè)設(shè)備的I2C地址是否唯一然后用示波器看SCL和SDA的波形判斷是哪個(gè)地址的ACK缺失。如果波形上升沿太緩可能是總線電容過大需要減小上拉電阻。這些細(xì)節(jié)在常規(guī)的I2C教程里很少提到但在實(shí)際項(xiàng)目中非常常見。SPI的考察點(diǎn)集中在模式配置上。CPOL和CPHA的四種組合面試官不會(huì)讓你背表格而是問“你的SPI Flash讀出來(lái)全是0xFF可能是什么原因”這個(gè)問題的答案往往指向模式不匹配——主機(jī)和從機(jī)的CPOL/CPHA設(shè)置不一致導(dǎo)致采樣時(shí)刻錯(cuò)位。排查方法是用邏輯分析儀同時(shí)抓CLK和MOSI看數(shù)據(jù)在時(shí)鐘的哪個(gè)邊沿變化然后對(duì)照從機(jī)手冊(cè)確認(rèn)模式。CAN總線在AIoT崗位中問得相對(duì)少但涂鴉有智能家居網(wǎng)關(guān)的產(chǎn)品線所以也會(huì)涉及。面試官問的是“CAN總線的仲裁機(jī)制是怎么工作的”這個(gè)問題的核心是“線與”邏輯和非破壞性仲裁。多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送時(shí)ID小的優(yōu)先級(jí)高因?yàn)轱@性電平會(huì)覆蓋隱性電平發(fā)送隱性電平的節(jié)點(diǎn)會(huì)檢測(cè)到總線狀態(tài)與自身發(fā)送的不一致從而退出仲裁。這個(gè)機(jī)制保證了高優(yōu)先級(jí)消息的實(shí)時(shí)性在智能家居的網(wǎng)關(guān)場(chǎng)景中很關(guān)鍵。2.3 RTOS任務(wù)調(diào)度與同步機(jī)制涂鴉的很多產(chǎn)品跑的是FreeRTOS或RT-Thread所以RTOS的考察非常細(xì)致。面試官問了一個(gè)經(jīng)典問題“兩個(gè)任務(wù)共享一個(gè)串口發(fā)送函數(shù)你怎么保證數(shù)據(jù)不交錯(cuò)”這個(gè)問題的答案不止一種可以用互斥鎖保護(hù)整個(gè)發(fā)送過程也可以用消息隊(duì)列把數(shù)據(jù)集中到一個(gè)任務(wù)里發(fā)送還可以用信號(hào)量做發(fā)送完成的同步。面試官追問“如果用互斥鎖優(yōu)先級(jí)反轉(zhuǎn)怎么解決”這就引出了優(yōu)先級(jí)繼承機(jī)制。FreeRTOS的互斥鎖支持優(yōu)先級(jí)繼承當(dāng)?shù)蛢?yōu)先級(jí)任務(wù)持有鎖時(shí)如果高優(yōu)先級(jí)任務(wù)嘗試獲取鎖低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)會(huì)被臨時(shí)提升到與高優(yōu)先級(jí)任務(wù)相同避免中間優(yōu)先級(jí)的任務(wù)搶占導(dǎo)致高優(yōu)先級(jí)任務(wù)被無(wú)限阻塞。另一個(gè)高頻問題是任務(wù)棧大小的確定。面試官問“你怎么確定一個(gè)任務(wù)的棧應(yīng)該分配多大”這個(gè)問題沒有標(biāo)準(zhǔn)答案但有幾個(gè)實(shí)用方法先用一個(gè)較大的棧比如2KB然后在任務(wù)運(yùn)行時(shí)通過FreeRTOS的uxTaskGetStackHighWaterMark接口監(jiān)控棧的最高水位再根據(jù)水位調(diào)整?;蛘哂锰畛浞ㄔ跅?臻g填充特定模式運(yùn)行一段時(shí)間后檢查被覆蓋的位置。我在實(shí)際項(xiàng)目中的經(jīng)驗(yàn)是棧溢出往往發(fā)生在調(diào)用層次較深的函數(shù)里比如printf這種帶格式化解析的函數(shù)棧消耗比想象中大得多。3. AIoT與NB-IoT實(shí)戰(zhàn)環(huán)節(jié)的深度拆解3.1 NB-IoT的入網(wǎng)流程與數(shù)據(jù)傳輸鏈路NB-IoT是涂鴉AIoT崗位面試中繞不開的話題。面試官問的第一個(gè)問題是“NB-IoT模組從上電到能發(fā)數(shù)據(jù)中間經(jīng)歷了哪些步驟”這個(gè)問題考察的是你對(duì)整個(gè)入網(wǎng)流程的理解而不是某個(gè)AT指令的背誦。完整的流程大致是這樣的模組上電后首先進(jìn)行射頻校準(zhǔn)和網(wǎng)絡(luò)搜索然后附著到基站建立RRC連接接著進(jìn)行鑒權(quán)和加密最后激活PDN連接獲取IP地址。這個(gè)過程對(duì)應(yīng)到AT指令層面就是ATCFUN、ATCEREG、ATCGATT、ATCGACT這一系列操作。但面試官更關(guān)心的是如果ATCEREG一直返回未注冊(cè)你怎么排查排查思路應(yīng)該從硬件到軟件逐層推進(jìn)先確認(rèn)天線是否接好再確認(rèn)SIM卡是否欠費(fèi)或未激活然后檢查模組的頻段配置是否與當(dāng)?shù)鼐W(wǎng)絡(luò)匹配最后看是否有信號(hào)強(qiáng)度但無(wú)法附著的情況那可能是APN配置問題。NB-IoT的數(shù)據(jù)傳輸方式主要有兩種CoAP和MQTT。涂鴉的AIoT平臺(tái)更傾向于MQTT因?yàn)樗陌l(fā)布訂閱模型更適合設(shè)備與云端的雙向通信。面試官問“NB-IoT上跑MQTT和WiFi上跑MQTT有什么不同”這個(gè)問題的核心在于NB-IoT的低帶寬和高延遲特性。NB-IoT的上行速率大概在幾十kbps下行更低而且每次發(fā)送數(shù)據(jù)前可能需要從PSM或eDRX狀態(tài)喚醒喚醒時(shí)間可能達(dá)到幾秒甚至十幾秒。所以MQTT的心跳間隔不能設(shè)得太短否則設(shè)備頻繁喚醒會(huì)大幅增加功耗。通常建議心跳間隔在幾分鐘到幾十分鐘之間具體取決于業(yè)務(wù)對(duì)實(shí)時(shí)性的要求。3.2 通信協(xié)議選型與數(shù)據(jù)上報(bào)策略在AIoT場(chǎng)景中通信協(xié)議的選型直接決定了系統(tǒng)的功耗、成本和可靠性。面試官給了一個(gè)場(chǎng)景“你要做一個(gè)智能水表每天上報(bào)一次數(shù)據(jù)電池要撐五年你選什么通信協(xié)議”這個(gè)問題的答案需要綜合考慮覆蓋范圍、功耗、數(shù)據(jù)量和成本。NB-IoT在這個(gè)場(chǎng)景下是合適的因?yàn)樗母采w廣、功耗低而且每天一次的數(shù)據(jù)量很小完全在NB-IoT的承載范圍內(nèi)。但面試官追問“如果水表安裝在地下室信號(hào)很弱怎么辦”這就涉及到NB-IoT的覆蓋增強(qiáng)技術(shù)通過重復(fù)發(fā)送來(lái)提高信號(hào)穿透力但重復(fù)發(fā)送會(huì)增加功耗。所以需要在覆蓋和功耗之間做權(quán)衡可能需要調(diào)整上報(bào)策略比如在信號(hào)好的時(shí)候多上報(bào)一些數(shù)據(jù)信號(hào)差的時(shí)候只上報(bào)關(guān)鍵數(shù)據(jù)。數(shù)據(jù)上報(bào)策略的設(shè)計(jì)也是面試的重點(diǎn)。面試官問“你怎么設(shè)計(jì)一個(gè)可靠的數(shù)據(jù)上報(bào)機(jī)制保證數(shù)據(jù)不丟”這個(gè)問題的答案涉及本地緩存、重傳機(jī)制和確認(rèn)機(jī)制。設(shè)備端需要有一個(gè)環(huán)形緩沖區(qū)當(dāng)網(wǎng)絡(luò)不可用時(shí)把數(shù)據(jù)暫存起來(lái)等網(wǎng)絡(luò)恢復(fù)后按時(shí)間順序補(bǔ)報(bào)。每次上報(bào)后需要等待云端的確認(rèn)如果超時(shí)未收到確認(rèn)則重新上報(bào)。但重傳次數(shù)不能無(wú)限否則會(huì)耗盡電池通常設(shè)置3到5次重傳超過后記錄日志并等待下一次周期上報(bào)。3.3 嵌入式Linux在AIoT網(wǎng)關(guān)中的角色涂鴉的智能家居網(wǎng)關(guān)產(chǎn)品線跑的是嵌入式Linux所以面試中也會(huì)涉及Linux相關(guān)的問題。面試官問“你在Linux下開發(fā)嵌入式應(yīng)用和裸機(jī)開發(fā)最大的區(qū)別是什么”這個(gè)問題的核心是操作系統(tǒng)抽象層帶來(lái)的變化。在裸機(jī)開發(fā)中你直接操作寄存器所有資源都是你的在Linux下你需要通過設(shè)備文件、sysfs、ioctl等接口來(lái)訪問硬件而且要考慮多進(jìn)程并發(fā)、內(nèi)存管理、文件系統(tǒng)等問題。面試官追問“你怎么在Linux下調(diào)試一個(gè)I2C設(shè)備”這個(gè)問題的答案涉及i2c-tools的使用。首先用i2cdetect掃描總線上的設(shè)備地址確認(rèn)設(shè)備是否被識(shí)別然后用i2cget和i2cset讀寫寄存器驗(yàn)證通信是否正常如果通信失敗檢查設(shè)備樹中的I2C節(jié)點(diǎn)配置是否正確包括時(shí)鐘頻率、上拉電阻等。在嵌入式Linux中設(shè)備樹是硬件描述的核心I2C設(shè)備的地址、中斷引腳、時(shí)鐘源都需要在設(shè)備樹中正確配置否則驅(qū)動(dòng)無(wú)法加載。另一個(gè)高頻問題是關(guān)于交叉編譯的。面試官問“你在x86主機(jī)上編譯ARM程序怎么保證編譯出來(lái)的二進(jìn)制能在目標(biāo)板上運(yùn)行”這個(gè)問題的答案涉及工具鏈的選擇和庫(kù)的鏈接方式。首先需要確認(rèn)工具鏈的架構(gòu)與目標(biāo)板匹配比如arm-linux-gnueabihf對(duì)應(yīng)的是帶硬件浮點(diǎn)的ARM Cortex-A系列然后需要確認(rèn)鏈接的庫(kù)是目標(biāo)板上的版本靜態(tài)鏈接可以避免庫(kù)版本不匹配的問題但會(huì)增加二進(jìn)制體積動(dòng)態(tài)鏈接需要把庫(kù)文件也部署到目標(biāo)板上并設(shè)置LD_LIBRARY_PATH。4. 面試中的避坑經(jīng)驗(yàn)與復(fù)盤4.1 技術(shù)問題的回答節(jié)奏控制四小時(shí)車輪戰(zhàn)最大的挑戰(zhàn)不是某個(gè)具體問題不會(huì)而是節(jié)奏控制。我在面試中犯的一個(gè)錯(cuò)誤是在一個(gè)I2C時(shí)序問題上花了太多時(shí)間導(dǎo)致后面的NB-IoT環(huán)節(jié)時(shí)間被壓縮。事后復(fù)盤正確的做法是如果一個(gè)問題的排查思路你已經(jīng)給出了框架但面試官還在追問細(xì)節(jié)你可以主動(dòng)說“這個(gè)方向我可以在面試后深入整理我先說一下我在實(shí)際項(xiàng)目中遇到的類似問題和解決思路”然后把話題引導(dǎo)到你更有把握的領(lǐng)域。另一個(gè)節(jié)奏問題是不要在簡(jiǎn)單問題上過度展開。面試官問“UART和SPI的區(qū)別”你只需要說清楚全雙工/半雙工、同步/異步、線數(shù)、速率范圍這幾個(gè)核心差異就夠了不需要把每個(gè)協(xié)議的歷史發(fā)展都講一遍。面試官的時(shí)間有限他們更想聽到的是你對(duì)關(guān)鍵差異的精準(zhǔn)把握。4.2 項(xiàng)目經(jīng)驗(yàn)的講述方式涂鴉的面試官非常看重項(xiàng)目經(jīng)驗(yàn)的真實(shí)性。我在講一個(gè)基于NB-IoT的環(huán)境監(jiān)測(cè)項(xiàng)目時(shí)面試官連續(xù)追問了五個(gè)問題模組型號(hào)是什么用的什么天線上報(bào)間隔是多少電池容量多大實(shí)測(cè)功耗是多少這些問題如果你沒有真正做過很難編出合理的答案。所以我的建議是面試前把你簡(jiǎn)歷上的每個(gè)項(xiàng)目都過一遍確保你能回答出硬件選型、軟件架構(gòu)、調(diào)試過程、遇到的問題和解決方案這些細(xì)節(jié)。講述項(xiàng)目經(jīng)驗(yàn)時(shí)建議用STAR法則的變體先講場(chǎng)景和需求再講你的方案選型理由然后講實(shí)現(xiàn)過程中的關(guān)鍵難點(diǎn)最后講結(jié)果和你的反思。比如我在講環(huán)境監(jiān)測(cè)項(xiàng)目時(shí)重點(diǎn)講了為什么選NB-IoT而不是LoRa——因?yàn)樵O(shè)備安裝點(diǎn)沒有自建網(wǎng)關(guān)的條件NB-IoT可以直接走運(yùn)營(yíng)商網(wǎng)絡(luò)省去了網(wǎng)關(guān)部署的成本。這種選型理由的講述比單純羅列技術(shù)棧更能體現(xiàn)你的工程思維。4.3 常見問題速查表問題類型高頻問題回答要點(diǎn)避坑提示C語(yǔ)言volatile的使用場(chǎng)景硬件寄存器、中斷共享變量、DMA目標(biāo)內(nèi)存不要只背定義要結(jié)合具體硬件場(chǎng)景通信協(xié)議I2C通信失敗排查地址沖突、上拉電阻、總線電容、時(shí)序模式先確認(rèn)硬件連接再查軟件配置RTOS任務(wù)棧大小確定高水位監(jiān)控、填充法、調(diào)用深度分析printf等格式化函數(shù)棧消耗大NB-IoT入網(wǎng)失敗排查天線、SIM卡、頻段、APN、信號(hào)強(qiáng)度區(qū)分是搜不到網(wǎng)還是附著失敗嵌入式Linux交叉編譯問題工具鏈架構(gòu)、庫(kù)版本、動(dòng)態(tài)鏈接路徑靜態(tài)鏈接可避免庫(kù)依賴問題AIoT通信協(xié)議選型覆蓋范圍、功耗、數(shù)據(jù)量、成本沒有最好的協(xié)議只有最合適的場(chǎng)景4.4 面試后的復(fù)盤方法面試結(jié)束后的復(fù)盤比面試本身更重要。我的做法是趁記憶還新鮮把每個(gè)被問到的問題和我的回答寫下來(lái)然后標(biāo)注哪些答得好、哪些答得不好、哪些完全不會(huì)。對(duì)于答得不好的問題當(dāng)天就查資料補(bǔ)上并且寫一段簡(jiǎn)短的總結(jié)。這樣下次遇到類似問題時(shí)你就有了一套經(jīng)過驗(yàn)證的回答框架。另外涂鴉的面試官在最后通常會(huì)留時(shí)間讓你提問。這個(gè)環(huán)節(jié)不要浪費(fèi)問一些能體現(xiàn)你對(duì)崗位真實(shí)興趣的問題比如“這個(gè)崗位目前團(tuán)隊(duì)在做的產(chǎn)品方向是什么”“新入職的嵌入式工程師通常會(huì)從哪個(gè)模塊開始上手”。這些問題不僅能幫你了解崗位的真實(shí)情況也能給面試官留下你認(rèn)真考慮過這個(gè)機(jī)會(huì)的印象。提示車輪戰(zhàn)面試中面試官之間的信息是共享的。如果你在第一個(gè)面試官那里某個(gè)問題答得不好后面的面試官可能不會(huì)再問同一個(gè)問題但可能會(huì)從相關(guān)角度切入。所以每個(gè)環(huán)節(jié)結(jié)束后快速回顧一下剛才的表現(xiàn)調(diào)整狀態(tài)迎接下一位面試官。5. 嵌入式學(xué)習(xí)路線與AIoT技能樹5.1 從裸機(jī)到Linux的進(jìn)階路徑很多準(zhǔn)備面試的人會(huì)問嵌入式學(xué)習(xí)到底應(yīng)該先學(xué)裸機(jī)還是先學(xué)Linux我的建議是先把裸機(jī)搞透再上Linux。裸機(jī)階段重點(diǎn)掌握三件事GPIO操作、中斷處理、通信協(xié)議。GPIO操作看起來(lái)簡(jiǎn)單但它是理解硬件寄存器操作的基礎(chǔ)中斷處理是理解實(shí)時(shí)性的關(guān)鍵通信協(xié)議是嵌入式與外部世界交互的橋梁。這三件事在裸機(jī)階段搞清楚了上Linux之后就不會(huì)被設(shè)備驅(qū)動(dòng)層的抽象搞暈。裸機(jī)階段推薦用STM32F103或者GD32系列入門資料多、社區(qū)活躍。學(xué)到一定程度后可以嘗試用RTOS比如FreeRTOS來(lái)管理多個(gè)任務(wù)理解任務(wù)調(diào)度、信號(hào)量、消息隊(duì)列這些概念。這個(gè)階段不需要追求復(fù)雜的項(xiàng)目能把一個(gè)溫濕度采集OLED顯示串口上報(bào)的小系統(tǒng)跑通就夠了。Linux階段的學(xué)習(xí)曲線會(huì)陡很多。首先要熟悉Linux的基本操作和Shell腳本然后學(xué)習(xí)交叉編譯工具鏈的使用接著理解設(shè)備樹和驅(qū)動(dòng)的加載流程最后嘗試寫一個(gè)簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)。這個(gè)過程中vs code配合遠(yuǎn)程開發(fā)插件可以大幅提升效率你可以在Windows上編輯代碼通過SSH同步到Linux開發(fā)板上編譯和調(diào)試。5.2 AIoT方向需要補(bǔ)充的知識(shí)AIoT不是簡(jiǎn)單的嵌入式聯(lián)網(wǎng)它涉及到云端交互、數(shù)據(jù)協(xié)議、安全機(jī)制等多個(gè)層面。如果你只懂嵌入式底層不懂云端的數(shù)據(jù)格式和通信協(xié)議在AIoT崗位的面試中會(huì)吃虧。需要補(bǔ)充的知識(shí)包括MQTT協(xié)議的報(bào)文格式和QoS等級(jí)、JSON和CBOR的數(shù)據(jù)序列化、TLS加密的基本原理、OTA升級(jí)的流程和回滾機(jī)制。這些知識(shí)不需要你深入到源碼級(jí)別但至少要能說清楚整個(gè)數(shù)據(jù)從設(shè)備端到云端的流轉(zhuǎn)過程以及每個(gè)環(huán)節(jié)可能遇到的問題和解決方案。另外AIoT設(shè)備的安全問題越來(lái)越受重視。面試官可能會(huì)問“你怎么保證設(shè)備上報(bào)的數(shù)據(jù)不被篡改”這個(gè)問題的答案涉及設(shè)備認(rèn)證、數(shù)據(jù)加密和完整性校驗(yàn)。設(shè)備認(rèn)證通常用一機(jī)一密或者證書方式數(shù)據(jù)加密用AES或者TLS完整性校驗(yàn)用HMAC。這些機(jī)制在資源受限的NB-IoT設(shè)備上需要做裁剪和優(yōu)化不能直接套用服務(wù)器端的方案。5.3 面試前的知識(shí)體系自查清單在投遞簡(jiǎn)歷之前建議對(duì)照下面的清單做一次自查。如果某個(gè)條目你只能說出定義說不出實(shí)際場(chǎng)景和排查思路那就需要重點(diǎn)補(bǔ)課。C語(yǔ)言指針與內(nèi)存布局、volatile、位操作、結(jié)構(gòu)體對(duì)齊、函數(shù)指針通信協(xié)議UART/I2C/SPI的時(shí)序和排查方法、CAN的仲裁機(jī)制、MQTT的QoSRTOS任務(wù)調(diào)度、優(yōu)先級(jí)反轉(zhuǎn)、信號(hào)量/互斥鎖/消息隊(duì)列的使用場(chǎng)景嵌入式Linux設(shè)備樹、字符設(shè)備驅(qū)動(dòng)、交叉編譯、i2c-tools調(diào)試NB-IoT入網(wǎng)流程、AT指令、PSM/eDRX功耗模式、CoAP/MQTT傳輸AIoT設(shè)備認(rèn)證、數(shù)據(jù)加密、OTA升級(jí)、云端交互協(xié)議這份清單不是讓你全部背下來(lái)而是幫你定位自己的薄弱環(huán)節(jié)。面試中遇到不會(huì)的問題很正常關(guān)鍵是你能不能說清楚你的思路和排查方向。涂鴉的面試官更看重的是你的學(xué)習(xí)能力和解決問題的框架而不是你記住了多少知識(shí)點(diǎn)。我在實(shí)際面試中的體會(huì)是那些能拿到offer的人往往不是知識(shí)面最廣的而是能把一個(gè)問題的排查思路講得最清楚的。比如同樣問I2C通信失敗有人只能說出“檢查地址”有人能從硬件連接、上拉電阻、時(shí)序模式、總線電容、軟件配置五個(gè)層面逐層分析后者顯然更能打動(dòng)面試官。所以準(zhǔn)備面試時(shí)不要追求覆蓋所有知識(shí)點(diǎn)而是把每個(gè)核心知識(shí)點(diǎn)都往深里挖一層挖到你能講出一個(gè)完整的排查故事為止。