
適用人群和我一樣正在準備 2026 秋招的嵌入式方向同學——前幾篇專欄把看門狗、啟動流程、OTA 都講過基礎了但面試官一追問你項目里看門狗怎么用的、“復位和上電有啥區別”、“Bootloader 跳轉前要做什么”還是容易卡殼讀完你能得到① 把看門狗/復位/Boot/Bootloader 四塊串成一條面試答線② 知道每塊的標準答法怎么答才不像背書③ 把前面核心概念_03/05、OTA_02/04、低功耗_03里講過的東西擰成面試視角而不是再講一遍原理這一篇是 “面試高頻考點” 專欄的第 2 篇緊接面試_01的下一篇指向。技術細節我不重復全文只點一句詳見 XXX重點放在為什么這么問、坑在哪、怎么答得讓面試官覺得你是真踩過。一、看門狗面試要點呼應 核心概念_05 低功耗_03IWDG/WWDG 的完整原理見嵌入式核心概念/核心概念_05_看門狗詳解.mdIWDG 在低功耗里的影響見低功耗與電源管理/低功耗_03_實測功耗測量與電源樹選型.md。這里只講面試視角。1.1 IWDG vs WWDG——別只會背一個獨立一個窗口面試官最愛開的場“說一下 IWDG 和 WWDG 的區別。”——背書答法是一個獨立一個窗口到此為止。懂了的答法是把這張表甩出來 主動補一句所以我項目里用的是 IWDG因為……對比項IWDG獨立看門狗WWDG窗口看門狗時鐘源LSI獨立低速 RCF4 約 32 kHz精度差17~47 kHzAPB1依賴主時鐘精度高主時鐘掛了仍工作這就是獨立的含義也掛它靠 APB1喂狗時機超時前任意時刻喂都行必須在窗口內喂喂早了也復位最大超時F4 約32.8 sLSI 32k、PR256、RLR4095短得多ms 級APB1/4096/8 量級檢測什么死機、跑飛死機 跑太快程序跑飛可能跑得反而快典型場景通用防死機安全關鍵必加嚴格時序監控、關鍵控制回路?? 最大超時這條新手最容易答錯。F407 的 IWDG 最長約32.8 s不是幾秒這個數字在低功耗_03里我親手算過4096 × 256 ÷ 32000 ≈ 32.8 s。但 LSI 精度差實際可能只有 20 多秒——這也是為什么想睡 10 分鐘會被狗咬醒。1.2 IWDG 在 Stop/Standby 里繼續計數嗎——高頻追問繼續。這條低功耗_03已經踩過坑了這里再強調一遍因為面試官特別愛追問這一句來篩做過和背過的IWDG 由LSI驅動進 Stop 模式后LSI 不停、IWDG 繼續計數。進 Standby 模式IWDG也繼續只要 LSI 還在IWDG 就停不下來除非整個掉電。軟件啟動 IWDG 后關不掉只能復位才能停這是硬件設計——防止程序跑飛誤關狗。?? 這就是低功耗_03那句別為了’更安全’隨手開一個把設備反復重啟的看門狗的來歷。長睡場景比如 10 分鐘醒一次采個溫開了 IWDG30 秒就被復位一次設備永遠在睡→被狗咬醒→重啟→睡→再被咬根本跑不到你要的周期。長周期睡眠要么別開 IWDG改用 RTC 喚醒 軟件狀態自檢要么把一次長睡切成若干段 20 s 的短睡每段醒來喂一次狗再繼續睡。1.3 為什么不能為了安全隨手開 IWDG——這條面試直接給加分接上一條面試官追問那是不是所有項目都該開 IWDG別答是。正確答法“不是。IWDG 是最后防線不是越多越好。我做過一個低功耗氣象節點10 分鐘醒一次如果開了 IWDG30 秒就被復位一次根本睡不到 10 分鐘。所以我那個項目沒用 IWDG改用 RTC 定時喚醒 主循環里做’上次采樣時間戳’自檢——如果距上次采樣超過 15 分鐘還沒采說明卡住了主動NVIC_SystemReset()。安全不是只有看門狗一條路關鍵是’死機了能不能恢復’RTC 軟件自檢在低功耗場景比 IWDG 更合適?!边@段話一出口面試官立刻知道① 你真做過低功耗② 你被 IWDG 咬過③ 你知道安全不是教條。比項目必加 IWDG高級多了。1.4 喂狗放哪——主循環 / 單獨任務別放 ISR這是面試官篩寫過裸機 vs 寫過 RTOS的分水題。裸機喂狗放主循環每輪喂一次。/* 平臺STM32 裸機IWDG 超時 1 s */intmain(void){HAL_Init();SystemClock_Config();MX_IWDG_Init();/* PR64, RLR625 → 約 1 s */for(;;){read_sensor();process_data();HAL_IWDG_Refresh(hiwdg);/* 每輪喂一次 */}}RTOSFreeRTOS用專門的監控任務喂狗其他任務用標志位通知我還活著——只有所有關鍵任務都活著才喂。核心概念_05有完整代碼這里不重復。絕對不能放 ISR主程序死循環了但定時器中斷還在跑結果狗永遠被中斷喂著看門狗永遠不觸發復位——等于沒裝。這是新手最常犯的錯核心概念_05坑 2 講過。?? RTOS 里的進階做法監控任務用task_alive[]數組其他任務定期置位自己的活著標志監控任務全部活著才喂。這樣單任務死掉也能復位。這條答出來面試官就知道你不止寫過裸機喂狗。1.5 “你項目里看門狗怎么用的”——標準答法模板這道題幾乎必問別只說我開了 IWDG。完整答法四段場景什么項目、為什么必須加安全關鍵遠程無人值守。選型IWDG 還是 WWDG為什么絕大多數學生項目 IWDG 就夠。參數超時多少、為什么這個值要 主循環最壞執行時間留余量。喂狗策略裸機主循環喂 / RTOS 監控任務條件喂。我的標準答法你可以照著改你自己的項目“我做個多士爐控制繼電器加熱那種——程序死機繼電器會一直閉合有火災風險所以第一件事就是加 IWDG。選 IWDG 不選 WWDG因為我要的是’死機了能斷電’不需要嚴格時序監控。超時設 1 s主循環最壞一圈約 200 ms留了 5 倍余量。喂狗放主循環每輪喂一次裸機工程沒上 RTOS。死機后最多 1 s 自動復位斷電人感覺不到但火沒起來。”四段都有有數字、有余量理由、有安全結論——這就是踩過坑的味兒。二、復位類型Reset別只會說上電復位啟動流程的硬件動作見嵌入式核心概念/核心概念_03_啟動流程詳解.md這里講復位這個動作本身有幾種類別。2.1 STM32 的復位家族——一張圖先看清┌─── 上電復位 POR ─────────┐ │ │ 外部電源剛上 ───────?│ (VDD 從 0 升到閾值) │──? 整片復位 │ 掉電復位 PDR │ │ (VDD 跌到閾值以下) │ └──────────────────────────┘ 外部 NRST 引腳 ─────? NRST 復位 (手動按鍵 / 外部復位芯片) WWDG 超時 ───────────? 窗口看門狗復位 IWDG 超時 ───────────? 獨立看門狗復位 軟件 NVIC_SystemReset() ──? 軟件復位 Stop/Standby 喚醒 ────? 部分外設復位 內核復位(Standby 等同復位)這么多復位類型核心區別就一句話“哪些東西被清零了”。復位類型內核寄存器SRAM時鐘標志位RCC_CSRPOR/PDR復位復位清零復位RCC_FLAG_PORRSTBOR欠壓復位復位清零復位RCC_FLAG_BORRSTNRST復位復位保留復位RCC_FLAG_PINRSTIWDG 復位復位復位保留復位RCC_FLAG_IWDGRSTWWDG 復位復位復位保留復位RCC_FLAG_WWDGRST軟件復位復位復位保留復位RCC_FLAG_SFTRSTStop 喚醒僅內核部分外設保留按需恢復RCC_FLAG_LPWRRSTStandby 喚醒復位復位清空復位查PWR_CSR的 WUF非 RCC_CSR 復位標志??關鍵認知只有 POR/PDR/BOR 和 Standby 喚醒會清空 SRAM其它復位 SRAM 內容保留除非啟動代碼主動清。這就是為什么核心概念_03里啟動文件要清零 .bss——硬件不一定幫你清得軟件兜底。新手最常以為復位 全清零這是錯的。Standby 喚醒比較特殊它走的是喚醒事件而非復位事件所以要查PWR_CSR的 WUF 標志位而不是RCC_CSR。2.2 RCC_CSR——判斷這次為什么復位的RCC_CSRClock Control Status Register是 STM32 復位原因的案發現場。每種復位發生時硬件會在 CSR 里置一個對應標志位軟件上電后讀它就知道這次是被誰弄醒的。/* 平臺STM32F4HAL 庫 */voidcheck_reset_reason(void){/* 注意順序PINRST 在幾乎所有復位時都會被置位必須放最后兜底 先查具體原因 POR/BOR/IWDG/WWDG/SFTRST再查 PINRST */if(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST)){printf(上電/掉電復位 POR/PDR\r\n);}elseif(__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST)){printf(欠壓復位 BOR\r\n);}elseif(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)){printf(獨立看門狗復位——上次可能死機了\r\n);}elseif(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)){printf(窗口看門狗復位\r\n);}elseif(__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)){printf(軟件復位 NVIC_SystemReset()\r\n);}elseif(__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)){printf(外部 NRST 引腳復位\r\n);}/* 讀完后必須清標志否則下次復位原因會疊加讀錯 */__HAL_RCC_CLEAR_RESET_FLAGS();}?? 順序很重要PINRST 標志在幾乎所有復位時都會被置位NRST 引腳在每次復位時都會動作這是 ST 的設計。所以判斷必須先查 PORRST/BORRST/IWDGRST/WWDGRST/SFTRST 這些具體原因把 PINRST 留到最后兜底——不然你按 IWDG 復位時可能 PINRST 也是 1邏輯就亂了。經驗做法讀完后立刻__HAL_RCC_CLEAR_RESET_FLAGS()下次復位原因才干凈。2.3 軟件復位NVIC_SystemReset()——什么場景用#includestm32f4xx.h/* 設備頭文件會間接 include CMSIS 的 core_cm4.h *//* 收到升級指令 / 自檢失敗 / OTA 完成 */NVIC_SystemReset();/* 這一行執行后內核立刻復位不會返回 */NVIC_SystemReset()本質是寫SCB-AIRCR寄存器的SYSRESETREQ位觸發一次系統復位。它不清 SRAM——所以OTA_02里 Bootloader 收完固件NVIC_SystemReset()重啟再檢查 app 合法性這個流程是成立的SRAM 里的升級標志還在。典型場景OTA 寫完 Flash 后重啟進新固件、自檢發現硬件異常主動重啟、配置變更需要重新初始化。別濫用——程序 bug 導致死機用軟件復位掩蓋問題沒解決只是被刷過去了。2.4 “復位和上電的區別”——標準答法這是送分題但答得不全還是露怯。完整答法三層觸發方式上電復位是 VDD 從 0 升到閾值硬件自動復位是 NRST 引腳被拉低或軟件觸發可主動。作用范圍上電復位清空 SRAM一切從零開始普通復位NRST/IWDG/軟件保留 SRAM只復位內核和外設寄存器。判別方式上電后讀RCC_CSR的PORRST標志位區分這次是真上電還是復位。?? 加分句“所以很多 Bootloader 用’上電標志 備份寄存器’判斷是冷啟動還是熱復位”——冷啟動要重新初始化一切熱復位可以保留上次狀態。這句話一出面試官就知道你寫過 Bootloader。三、啟動模式與 Boot 引腳呼應 核心概念_03啟動流程的代碼視角見嵌入式核心概念/核心概念_03_啟動流程詳解.md這里講上電后從哪兒開始取指。3.1 BOOT0 / BOOT1——決定從哪兒啟動STM32 上電時CPU 從哪個地址取第一條指令不是固定 0x08000000而是由 BOOT0 / BOOT1 引腳的電平決定F1 系列F4 簡化為只有 BOOT0BOOT1BOOT0啟動區域里面是什么x0Flash0x08000000你燒的業務代碼01System Memory0x1FFF0000ST 出廠的 ISP Bootloader串口/USB 下載就靠它11SRAM0x20000000調試用掉電即失??關鍵認知BOOT0/BOOT1 在復位那一刻被采樣復位后改電平沒用——必須重新復位才生效。所以用跳線切啟動模式的流程是①改跳線②按一次復位鍵③開始下載。3.2 System Memory 里的 ISP Bootloader——別和你自己寫的 Bootloader 混淆這是新手最容易混淆的點面試官特別愛用這道題篩人System Memory 里那個 Bootloader 是 ST 出廠燒死的你不能改、也讀不出源碼。它支持的協議串口/USB/I2C/SPI和命令是固定的詳見 ST 應用筆記 AN2606。你用 FlyMcu / STM32 Flasher 串口下載走的就是它。而OTA_02里我們寫的 Bootloader是你自己的代碼燒在 Flash 起始 0x08000000支持你自定義的協議幀能和你的 App 共存。這是兩個完全不同的東西。一句話區分┌─────────────────────────────────┬─────────────────────────────────┐ │ System Memory Bootloader │ 你自己寫的 Bootloader │ │ (ST 出廠, 0x1FFF0000) │ (你的代碼, 0x08000000) │ ├─────────────────────────────────┼─────────────────────────────────┤ │ BOOT01 才啟動 │ BOOT00 默認就啟動 │ │ 只能串口/USB 下載不能跑業務 │ 能跑業務、能收 OTA、能跳 App │ │ ST 寫死改不了 │ 你隨便改 │ │ 量產燒錄用 │ 量產遠程升級用 │ └─────────────────────────────────┴─────────────────────────────────┘?? 這道題答錯比如System Memory 里是我寫的 Bootloader基本就涼了——面試官立刻知道你沒真做過 OTA。System Memory 是 ST 的0x08000000 起才是你的。3.3 中斷向量表重定位SCB-VTOR——Bootloader 跳轉的靈魂核心概念_03講過CPU 上電時硬件從 Flash 起始讀 MSP 和 Reset_Handler。但當 App 不在 0x08000000比如OTA_02里 App 在 0x08010000中斷來了 CPU 默認還去 0x08000000 找向量表——那是 Bootloader 的向量表App 的中斷全跑飛。SCB-VTORVector Table Offset Register就是解決這個的告訴 CPU向量表現在搬去這個地址了。/* App 工程的 main() 開頭第一行 */SCB-VTORFLASH_BASE0x10000;/* 0x08010000App 向量表所在 */__DSB();/* 數據同步屏障確保新 VTOR 對后續取指可見 */?? VTOR 重定位的地址必須按向量表大小對齊最低若干位為 0。F4 向量表約 0x188 字節所以地址至少 0x200 對齊用 0x08010000 這種 64KB 對齊地址肯定沒問題。對齊錯了一開中斷就 HardFault。CubeMX 工程可以在system_stm32f4xx.c改VECT_TAB_OFFSET宏省得手寫——本質一樣都是設 VTOR。四、Bootloader 面試要點呼應 OTA_02~04完整的 Bootloader 實現見固件升級與OTA/OTA_STM32自己寫Bootloader從0實現串口升級.md安全啟動見OTA_04這里講面試視角。4.1 為什么要 Bootloader——別只答為了升級面試官問為什么要寫 Bootloader背書答法是為了升級——太淺。懂了的答法是三段遠程升級設備裝在野外/機房/客戶家里不能拆殼用 JTAG 燒必須能自己收固件、自己刷。分區與回滾升級有可能失敗/新固件有 bug所以常做 A/B 雙分區——升級時刷備用區啟動時校驗新固件跑起來失敗自動回滾到舊區。OTA_02是單 App 校驗失敗停留 Bootloader 的簡化版A/B 是量產標配。安全啟動Bootloader 是信任鏈的stage-1負責校驗 App 簽名OTA_04拒絕非法固件。沒有 Bootloader 這一層簽名校驗就無處可放。?? 加分句“ESP32 的 OTA 是樂鑫在 SDK 里給你做好的STM32 沒有現成的得自己寫——這也是為什么 STM32 的 Bootloader 是嵌入式面試的高頻題?!边@一句區分了用過現成方案和理解底層面試官立刻高看你一眼。4.2 Bootloader 與 App 的分區與跳轉——核心代碼必須默寫出來分區OTA_02的 STM32F407 例子0x08000000 ┌──────────────────────┐ │ Bootloader (64KB) │ ← 復位入口BOOT00 默認進這 0x08010000 ├──────────────────────┤ │ App (~960KB) │ ← 你的業務代碼 │ 向量表在最前面 │ └──────────────────────┘ 0x080FFFFF跳轉流程——這道題面試官可能讓你白板寫必須默得出/* 平臺STM32F4CMSIS */typedefvoid(*app_entry_t)(void);voidjump_to_app(uint32_tapp_addr){uint32_tsp*(volatileuint32_t*)app_addr;/* 向量表[0] MSP */uint32_tpc*(volatileuint32_t*)(app_addr4);/* 向量表[1] Reset_Handler */__disable_irq();/* ① 關全局中斷 *//* ② 清掉 Bootloader 側所有 NVIC 使能與掛起 */for(inti0;i8;i){NVIC-ICER[i]0xFFFFFFFF;/* 清使能 */NVIC-ICPR[i]0xFFFFFFFF;/* 清掛起 */}SysTick-CTRL0;/* 關 SysTick否則 App 接管前可能進滴答中斷 */SCB-VTORapp_addr;/* ③ 向量表切到 App */__DSB();__ISB();/* 屏障確保新 VTOR 對取指可見 */__set_MSP(sp);/* ④ 設 MSP 為 App 的棧頂 */__enable_irq();/* ⑤ 恢復全局中斷App 默認期望 PRIMASK0 */app_entry_tentry(app_entry_t)(pc|0x1);/* Thumb 狀態最低位1 */entry();/* ⑥ 跳相當于手動復位進 App */}記憶口訣關中斷 → 清 NVIC/SysTick → 改 VTOR帶屏障→ 設 MSP → 開中斷 → 跳。?? 三個最容易漏的點OTA_02里都踩過①清 NVIC——不清的話 Bootloader 里的掛起中斷會在 App 的向量表里找入口跑飛②__DSB();__ISB();屏障——改完 VTOR 立刻跳沒屏障的話 CPU 流水線可能還用舊地址③__enable_irq()恢復中斷——很多人__disable_irq()后忘了恢復App 的中斷全被屏蔽裸機工程會假死。漏任何一條都可能 HardFault 或假死。4.3 版本號防回滾——OTA_04/OTA_05的核心面試必問“簽名能防偽造但能不能防降級”——能但要靠版本號 單調計數器。固件頭里嵌一個單調遞增的版本號如 uint32_t fw_version 7 │ ▼ 設備用 eFuse / 備份寄存器 / Flash 末頁存已接受的最高版本 max_seen │ ▼ 啟動時檢查fw_version max_seen ? 是 → 接受更新 max_seen fw_version 否 → 拒絕防回滾為什么必須防回滾攻擊者拿你去年有漏洞的舊固件合法簽名刷進設備設備照樣認——漏洞被復活。所以簽名只證明是你簽的不證明是最新的。?? 存最高版本的位置很關鍵放普通 Flash 可被攻擊者改回去寫成 0 就能裝任何舊版正確做法是放 eFuse / OTP一次性燒寫燒死改不了。STM32 沒有 eFuse但有OTP 區F4 是 16 字節起可以用來存版本計數器。這條答出來是高級加分。4.4 安全啟動簽名校驗——OTA_04的精華一句帶過簽名驗簽的完整流程見OTA_04面試一句話版“構建時用私鑰對固件哈希簽名設備用燒死在eFuse/OTP里的公鑰驗簽驗不過就停在 Bootloader 不跳 App。三個關鍵點① 公鑰必須鎖死在 OTP不能放普通 Flash否則攻擊者可換公鑰惡意固件② 驗簽失敗必須硬拒絕不能只警告③ 簽名之外還要防回滾嵌版本號 單調計數器?!?.5 Bootloader 自己怎么升級——雞生蛋問題這是 Bootloader 面試的最難一問能答出來基本就是高級崗的水平。問題App 能被 Bootloader 升級那 Bootloader 自己想升級怎么辦Bootloader 不能自己擦自己擦完跑飛。三種答法方案做法適用A/B BootloaderFlash 起始放兩份 Bootloader升級時擦備用那份、寫新的、置啟動選哪份標志、重啟切到新的量產、空間夠RAM 跳轉法Bootloader 把新 Bootloader 代碼先整體讀到 SRAM跳到 SRAM 執行SRAM 里的代碼擦 Flash 的 Bootloader 區、寫新版本、重啟空間緊張、SRAM 夠大不支持升級出廠燒死后永不變動靠 App 的可升級性兜底大多數學生項目 / 低端產品?? 大多數學生項目答不支持升級Bootloader 出廠燒死就夠——別硬答 A/B面試官追問細節你答不上來反而露怯。誠實說我項目里 Bootloader 不升級只升 AppBootloader 出廠燒死靠 RDP 讀保護防止被讀出——這個答法比硬裝懂強 10 倍。五、新手必踩的 N 個坑這一欄把看門狗、復位、Boot、Bootloader 四塊里面試官最愛追問、新手最常翻車的坑匯總成一張表。每條都對應前面某篇的詳細分析這里給面試一句話版。#坑后果正確做法詳見1IWDG 超時算錯把 LSI 當精確時鐘LSI 精度 17~47 kHz理論 1 s 實際可能 0.5 s 或 1.5 s喂狗間隔算錯就反復復位留 2~3 倍余量別在需要精確超時的場景用 IWDG核心概念_05 §2.2 / 低功耗_03 §132低功耗場景隨手開 IWDGStop 模式 IWDG 繼續計數10 分鐘長睡被 30 s 復位一次長周期睡眠改用 RTC 喚醒 軟件自檢要開 IWDG 就把長睡切成 20 s 短睡分段喂狗低功耗_03 §133Bootloader 跳轉前忘關中斷舊向量表生效期間被中斷觸發跑飛 HardFaultjump_to_app第一行__disable_irq()清 NVIC 關 SysTick 再切 VTOROTA_02 §4.24App 沒設 VTOR一開中斷就 HardFaultCPU 還去 0x08000000 找向量表Appmain()第一行SCB-VTOR APP_ADDR地址須按向量表大小對齊OTA_02 §55App 鏈接地址沒改Bootloader 和 App 重疊互燒互覆蓋.ld里 FLASH ORIGIN 改成0x08010000LENGTH 減 0x10000OTA_02 §56BOOT 引腳懸空上電隨機電平可能誤進 System Memory / SRAM 模式燒不進 FlashBOOT0 必須接下拉或上拉到 VDD 取決于設計別懸空數據手冊明確要求RM0090 Boot pins7混淆 System Memory Bootloader 和自己寫的 Bootloader面試答錯基本涼——面試官判定你沒做過 OTASystem Memory ST 出廠 ISPBOOT01 進0x1FFF0000你寫的 Bootloader 燒在 0x08000000 的業務代碼BOOT00 進本文 §3.28跳轉前沒校驗棧頂App 向量表損壞跳過去直接死循環或跑飛跳前必做app_is_valid棧頂在 SRAM 范圍、復位向量在 Flash 范圍且 Thumb 位置 1OTA_02 §4.19__disable_irq()后忘__enable_irq()恢復App 中斷全被屏蔽裸機工程假死跳轉流程末尾恢復__enable_irq()App 默認期望 PRIMASK0OTA_02 §4.210只簽名不防回滾攻擊者用合法簽名的舊漏洞固件刷入簽名形同虛設固件嵌單調版本號設備用 OTP/eFuse 存最高已接受版本更低的一律拒OTA_04 §8 坑6 這張表不是用來背的是用來對號入座的。秋招前過一遍每條對照你簡歷項目問自己我能不能講出具體場景——能講出 3 條以上這四塊面試基本穩了。六、動手練一練光看不練面試時還是嘴卡。下面這幾個練習建議你用開發板真跑一遍別用正在用的項目板故意搞破壞用。練習 1故意跳轉前不關中斷看 HardFault復用OTA_02的 Bootloader App 工程把jump_to_app里的__disable_irq()和清 NVIC/SysTick那幾行注釋掉其它不變。voidjump_to_app(uint32_tapp_addr){/* __disable_irq(); ← 故意注釋掉 *//* for(...) NVIC-ICER... ← 故意注釋掉 *//* SysTick-CTRL 0; ← 故意注釋掉 */SCB-VTORapp_addr;__set_MSP(*(uint32_t*)app_addr);/* __enable_irq(); ← 也注釋掉 */app_entry_tentry(app_entry_t)(*(uint32_t*)(app_addr4)|0x1);entry();}步驟編譯燒錄看現象——大概率跳過去幾條指令就 HardFault因為 Bootloader 里掛起的 SysTick 中斷在 App 的向量表里找入口找到了不對的地址。用調試器在 HardFault_Handler 打斷點看壓棧的 PC 指向哪里理解為什么沒關中斷會跑飛。把注釋取消恢復正常再跑——對比現象。加分只注釋SysTick-CTRL 0一行看 SysTick 中斷在 App 接管前觸發的具體后果——這條更隱蔽很多新手栽在這。做完這個面試官問跳轉前為什么必須關中斷你能說我親手試過不關會 HardFault原因是掛起的中斷在新向量表里找錯入口——比任何博客都有說服力。練習 2故意不設 VTOR看 App 中斷跑飛復用上面的工程這次 Bootloader 跳轉寫對但把 App 里的SCB-VTOR那行注釋掉/* App 的 main() 第一行 */intmain(void){/* SCB-VTOR FLASH_BASE 0x10000; ← 故意注釋掉 */HAL_Init();SystemClock_Config();/* ... 后面開了 USART1 接收中斷 ... */}步驟燒 Bootloader 燒 App啟動后 Bootloader 跳到 App。App 主循環里點個 LED能跑——說明不設 VTOR 主循環也能跑。關鍵從串口發一個字節觸發 USART1 接收中斷——立刻 HardFault。因為 CPU 還去 0x08000000Bootloader 的向量表找 USART1 入口跳到 Bootloader 的 USART1_Handler可能就是空的死循環現場錯亂。取消注釋設回 VTOR再試——中斷正常進。這個練習做完App 為什么必須設 VTOR就不再是博客上的話是你親手驗證過的事實。練習 3讀 RCC_CSR 看復位原因/* 平臺STM32F4 */voidcheck_reset_reason(void);/* 見本文 §2.2 的完整實現 */intmain(void){HAL_Init();uart_init();/* 用于 printf */printf( 啟動 \r\n);check_reset_reason();while(1){/* ... */}}步驟燒錄后第一次上電拔插 USB看串口輸出——應該是上電/掉電復位 POR/PDR。按板子上的 RESET 鍵不動電源看輸出——應該是外部 NRST 引腳復位。故意寫一個死循環讓 IWDG 復位比如while(1);不喂狗看輸出——應該是獨立看門狗復位——上次可能死機了。注意每次讀完后必須__HAL_RCC_CLEAR_RESET_FLAGS()否則下次會疊加。做完這個面試問怎么判斷這次為什么復位你能直接說讀 RCC_CSR 的標志位PORRST/PINRST/IWDGRST/SFTRST 分別對應上電/NRST/看門狗/軟件復位——又是真數據。練習 4算一下你板子的 IWDG 最大超時拿你手頭 STM32 的數據手冊查 LSI 頻率F4 標稱 32 kHz范圍 17~47 kHz按公式T_max 4 × 2^(PR2) × (RLR1) / f_LSIPR 取最大 6、RLR 取最大 4095算出理論最大超時和最壞情況超時用 LSI 下限 17 kHz。F407 答案理論約 32.8 s最壞約 17 s。差距接近一倍——這就是為什么留余量不是口號是 LSI 精度逼出來的。算完這個面試問IWDG 超時怎么算、LSI 精度對它有什么影響你張口就能答。小結把四塊擰成一條面試答線這一篇不是新知識是收口復習——把看門狗、復位、Boot、Bootloader 四塊以前講過基礎的東西重新組織成面試答線。秋招前我用它的方式是每塊都對照簡歷項目想一個標準答法。比如被問看門狗我不只說IWDG 防死機而是我多士爐項目里 IWDG 超時 1 s、主循環喂狗、留 5 倍余量因為繼電器死機會火災——把簡歷項目和八股綁死。第五節那張坑表當 checklist。每條問自己我踩過沒能講出具體場景嗎——能講出 3 條以上這四塊面試基本穩了。動手練習至少做完練習 1 和 2。那兩個故意搞破壞的練習做完你面試時說我親手試過不關中斷會 HardFault、“我試過不設 VTOR 一開中斷就崩”——這種話一出口面試官就知道你不是背書的。最后送一句我自己最深的體會這四塊技術本身不難難的是答得讓面試官覺得你做過。同樣一句跳轉前要關中斷背出來和講出來是兩個味兒——區別就在于你有沒有親手試過不關會怎樣。前面 OTA 五篇我都寫過、踩過這一篇就是把它們擰成一根面試答線希望對你秋招有用。文中的 RM0090 復位/啟動章節、AN2606/AN4657 和 ARMv7-M SCB 內容都對照了 ST 和 ARM 官方文檔想深挖的按章節號去翻。下一篇面試_03_嵌入式面試全真模擬與簡歷項目講法