Bootloader是應用程序跑起來之前,用于初始化的一段程序,它分為兩種,ROM Bootloader、自定義Bootloader。GD32芯片出廠時預燒錄在ROM中的Bootloader(以下簡稱ROM Bootloader)和自己編寫的Bootloader(以下簡稱自定義Bootloader)在角色、目的、能力和實現方式上有著根本性的區別。
你可以將它們理解為:
- ROM Bootloader:芯片廠商提供的、永久的、功能單一的 “安全救生艇”。它被固化在硬件里,無法被修改或擦除,用于最基礎的恢復和編程。
- 自定義Bootloader:軟件工程師開發的、靈活的、功能強大的 “汽車4S店”。它存儲在用戶Flash中,可以實現復雜的應用邏輯(如網絡更新、故障恢復、A/B分區),但本身也可能被損壞。
下面是它們的詳細區別:
核心區別對比表
特性 | 芯片ROM Bootloader (內置ISP) | 用戶自定義Bootloader (在Flash中) |
---|---|---|
物理存儲 | 只讀存儲器(ROM) | 用戶Flash的起始部分 (例如 0x0800 0000 ) |
可修改性 | 不可修改、不可擦除 | 可被修改、更新、甚至擦除 |
調用方式 | 通過BOOT引腳電平在復位時強制進入 | 通常由軟件邏輯或標志位決定跳轉 |
主要目的 | 工廠編程、燒錄器替代、恢復變磚 | 產品發布后的現場固件升級(FOTA/OA) |
功能 | 功能固定單一 (通常是串口/USB DFU) | 功能無限可能 (以太網、Wi-Fi、藍牙、CAN、USB等) |
內存占用 | 不占用用戶Flash空間 | 占用一部分用戶Flash空間 (通常幾十KB) |
安全性 | 無或基礎校驗 | 可加入高級安全措施 (加密、簽名、CRC校驗) |
易用性 | 需手動操作BOOT引腳,配合PC軟件 | 全自動,用戶無感或通過App觸發 |
**** | “救命”的 | “優化”的 |
詳細解釋
1. ROM Bootloader (內置Bootloader)
- 本質:它是芯片硅片的一部分,在芯片制造時就被固化在硬件里。它不是存儲在Flash中的,因此你無法通過任何方式修改或刪除它。它永遠在那里。
- 目的:
- 最初編程:在芯片貼到PCB板上之前,廠商或客戶可以用它通過串口給空白芯片下載第一個程序。
- 恢復“變磚”:如果用戶的自定義Bootloader或應用程序編寫有bug,導致程序無法運行(即“變磚”),你可以通過操作BOOT引腳強制進入ROM Bootloader,從而重新燒寫一個正確的程序。它是最后的救命稻草。
- 功能:通常只支持非常基礎的通信接口,如:
- USART(串口):這是最普遍的方式。
- USB DFU(部分型號支持)。
- 功能單一:主要是接收數據并寫入主Flash。
- 使用場景:需要手動干預。工程師必須用跳帽改變BOOT引腳電平,然后復位芯片,再打開電腦上的ISP下載工具(如GD32 MCU ISP Programmer)進行操作。普通最終用戶根本無法使用這個功能。
2. 自定義Bootloader (用戶Bootloader)
- 本質:它是你自己編寫或使用第三方庫開發的一段程序,存儲在主Flash的開頭部分(例如從
0x0800 0000
開始)。它和你的應用程序(App)一樣,是可以被修改、更新和擦除的。 - 目的:
- 現場固件升級(FOTA - Firmware Over-The-Air):這是最主要的目的。產品發布到現場后,可以通過各種網絡方式(Wi-Fi、4G、以太網)遠程接收新固件并更新自身,無需召回產品。
- 多應用程序管理:實現A/B分區(雙固件備份),保證更新失敗后能回滾到舊版本。
- 安全啟動:在跳轉到應用程序前,對其進行密碼簽名驗證、CRC校驗等,確保固件完整且來自可信源。
- 功能:取決于你的代碼能力和硬件資源,可以實現任何復雜的功能:
- 支持多種通信協議:以太網、Wi-Fi、藍牙、CAN總線、USB、SD卡等。
- 高級功能:固件解密、數字簽名驗證、斷點續傳、更新狀態上報等。
- 使用場景:全自動或用戶友好。例如:
- 設備屏幕上出現“發現新版本,是否更新?”的提示,用戶點擊“確定”即可。
- 設備在半夜自動從服務器檢測并下載更新,完成后自動重啟生效。
工作流程對比
ROM Bootloader 工作流程:
自定義Bootloader 工作流程:
總結
ROM Bootloader | 自定義Bootloader | |
---|---|---|
角色 | 芯片自帶的修復工具 | 你開發的產品功能 |
存儲 | 硬件ROM | 用戶Flash |
特點 | 永久、安全、功能弱 | 靈活、強大、有風險 |
關系 | 用于更新和恢復自定義Bootloader和App | 依賴于ROM Bootloader作為最后的備份 |
在開發中,典型的做法是:
- 首先使用 ROM Bootloader 通過串口將你的 自定義Bootloader 程序燒錄到芯片中。
- 然后,你的 自定義Bootloader 再通過更高級的接口(如網絡)去更新 應用程序(App)。
- 如果 自定義Bootloader 本身需要升級,可能需要設計一個特殊的機制(例如由App來更新Bootloader),或者 fallback 到 ROM Bootloader 來進行恢復。