DEF CON 33 - BiC Village - Embedded System Design vs Traditional Software Design - Ian G Harris
三句話摘要
嵌入式系統設計基礎教程:從微控制器編程到外部裝置連接與調試工具實踐。 嵌入式系統設計的核心是在極端的成本與功耗約束下透過暫存器直接控制硬體,這要求開發者同時掌握底層硬體知識、驅動程式開發與多維度調試技能,安全防護更需從設計初期開始融入。 效率優先與成本壓力:嵌入式設計與軟體設計的根本差異在於製造商會用最便宜的微控制器,因此程式設計必須極度優化記憶體與功耗。使用高級庫雖便利但會引入冗餘,直接操作暫存器更高效但更複雜。
重點整理
重點- 1
效率優先與成本壓力:嵌入式設計與軟體設計的根本差異在於製造商會用最便宜的微控制器,因此程式設計必須極度優化記憶體與功耗。使用高級庫雖便利但會引入冗餘,直接操作暫存器更高效但更複雜。
- 2
暫存器控制模式:微控制器的所有功能(GPIO、通訊、計時、類比轉換等)都透過記憶體映射的暫存器控制,程式員需要查閱長達千頁以上的資料表找出各暫存器的確切位址與位元配置,一個錯誤就會埋藏漏洞。
- 3
硬體與軟體共設計:嵌入式系統必須同時考慮硬體電路(如LED電阻值、二極體阻向特性)與軟體控制,設計者要懂基礎類比電子知識並根據板級資料表確定腳位對應關係。
- 4
多層調試工具配合:單一除錯器無法觀測所有訊號,需用多用電表(檢驗靜態電壓)、示波器(量測時變訊號)、邏輯分析儀(同時監測多條線路),配合JTAG/SWD硬體除錯器追蹤執行流程。
實用技巧與重點
乾貨- 微控制器與廠商
- ARM是最主流的微控制器指令集架構
- 主要廠商:ST Micro Electronics、TI(德州儀器)、Infineon等
- 常用開發板:STM32(ST推出)、Arduino、ESP32
- 資料表範例:ST某款晶片1,757頁資料表
- 暫存器控制實例
- GPIO暫存器:IDR(輸入資料暫存器)、ODR(輸出資料暫存器)、BSRR(位元設定/重設暫存器)
- UART、I2C、SPI各有多組控制暫存器(CR1、CR2、DR等)
- 暫存器位址必須在資料表查詢(如GPIO Port A Output Data Register @ 0x40020014)
- 必須先啟用外設時鐘(RCC暫存器)才能使用
- LED電路標準
- 陽極連至GPIO輸出腳(如Pin 13)
- 加限流電阻330Ω(計算:3.3V ÷ 10mA = 330Ω)
- 陰極連至地線(GND, 0V)
- LED最大承受電流約20毫安
- I2C連接
- 兩條訊號線:SDA(資料)、SCL(時鐘)
- 主從結構(主控制器 + 從設備)
- 需在I2C控制暫存器設定時鐘頻率與參數
- 開發工具與庫
- IDE範例:STM CubeIDE、Arduino IDE
- 庫選項:HAL(硬體抽象層,功能完整但低效)、CMSIS(跨ARM平台)、Arduino(易用但效能較差)
- 交叉編譯器(Cross Compiler):編譯至不同架構的可執行檔
- Programmer軟體:將編譯後的執行檔燒錄至Flash
- 調試工具
- 多用電表(Multimeter):測靜態電壓、電流、電阻、連通性
- 類比示波器:僅適用週期訊號
- 數位示波器:可擷取瞬間波形;觸發模式有手動、電位準位觸發、單次/連續模式
- 邏輯分析儀:10~64條數位通道,成本高但能同時監測整條匯流排
- JTAG/SWD硬體除錯器:即時追蹤分支位址,偵測惡意軟體跳轉異常
- 安全考量
- MITER嵌入式CTF競賽:團隊需先開發安全系統,再相互攻擊
- CMU隊伍案例:模糊測試I2C驅動程式發現漏洞並成功攻擊
- 資料表不完整或錯誤會導致難以發現的安全缺陷
結論
結論“嵌入式系統設計的核心是在極端的成本與功耗約束下透過暫存器直接控制硬體,這要求開發者同時掌握底層硬體知識、驅動程式開發與多維度調試技能,安全防護更需從設計初期開始融入。”
完整解析
詳細嵌入式系統是一類看不見內部計算過程的設備,如汽車、手機、投影機等。相較於傳統軟體設計,嵌入式系統設計面臨截然不同的約束與挑戰。最根本的差異在於成本考量:製造商為了節省成本而採用最便宜的微控制器,這迫使設計者必須在記憶體、功耗與執行速度上精打細算。Python或Java開發者習慣無視這些指標,但嵌入式工程師必須時刻思考每一行程式碼的執行效率。
微控制器本質上是一種直接暴露硬體細節的處理器。與傳統作業系統透過驅動程式與系統呼叫抽象化硬體不同,嵌入式程式設計師必須直接透過暫存器與硬體對話。每個外設(GPIO、UART、I2C、類比轉換器等)都配有一組暫存器,程式員需要在資料表(通常超過千頁)中找到各暫存器的記憶體位址與位元含義,然後將特定值寫入特定位元。以LED閃爍為例,不僅要在初始化時啟用GPIO外設的時鐘,設定腳位模式,還要在迴圈中反覆改寫輸出資料暫存器的對應位元。直接操作暫存器雖然繁瑣,但比使用HAL或Arduino等高級庫的速度快得多。
硬體設計與軟體設計必須同步進行。嵌入式工程師需要懂基礎類比電子學,例如歐姆定律、二極體反向阻止特性與LED電流限制。設計LED電路時,需根據3.3V工作電壓與LED最大承受電流20mA反推電阻值(330Ω),否則可能燒毀組件。此外,必須查閱開發板的資料表確認LED連接到哪個GPIO腳位,再根據該腳位的硬體架構編寫控制程式。
除錯是嵌入式開發的另一大挑戰。單一軟體除錯器無法窺視硬體訊號,工程師必須備齊多種工具:多用電表用於檢驗靜態電壓,示波器用於量測時變訊號並設定觸發條件以捕捉瞬間波形,邏輯分析儀則能同時監測多達64條數位訊號線,特別適合追蹤I2C或SPI等串列協議。進階調試需要JTAG或SWD硬體除錯器,可即時追蹤CPU分支地址,藉此偵測緩衝區溢位或惡意軟體是否篡改返回地址。
安全風險源於複雜性與細節遺漏。資料表可能不完整或包含錯誤,設計者容易在千頁文件中遺漏某個關鍵配置。CMU隊伍在MITER嵌入式CTF競賽中靠模糊測試I2C驅動程式找到漏洞並成功攻擊,這啟示了嵌入式開發必須將安全測試(特別是模糊測試)納入開發流程。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。


