針對有 C 基礎但缺乏嵌入式專案經驗的學習者,整理出分層級、可檢核、可擴充的知識地圖。本文為學習大綱,重點章節附講解,其餘列關鍵字供自行查漏補缺。
第一層:鐵律基礎 (必須滾瓜爛熟)
| 主題 | 核心檢核點 |
| 資料型別與運算優先序 | 隱含型別轉換規則、整數提升、有號無號混合運算陷阱 |
| 程式結構 | 分支/迴圈最佳實踐、switch 貫穿、goto 僅用於錯誤處理跳出 |
| 陣列與函式 | 陣列退化為指標、遞迴深度與堆疊風險、可變參數 <stdarg.h> |
| 指標運算 | 指標算術、const 與指標組合、函式指標、void* 通用指標 |
| 前置處理器 | 條件編譯、#/## 運算子、__FILE__/__LINE__ 診斷巨集 |
| 位元運算 | 設定/清除/翻轉/檢測位元、位欄位、大小端轉換巨集 |
| 檔案 I/O | 二進位/文字模式、隨機存取、嵌入式無檔案系統時的替代方案 |
第二層:專案實戰進階 (能獨立模組開發)
2.1 RTOS 基礎 (以 VxWorks 為例)
- 任務同步:二進位/計數/互斥信號量、事件集、訊息佇列
- 經典問題:死鎖四條件與預防、優先權反轉與優先權繼承/天花板協議
2.2 開發工具鏈
- Tornado/VS Code/CLion + CMake/GDB/OpenOCD/J-Link
- Makefile 變數、模式規則、自動相依生成
- PC-lint / MISRA-C 靜態分析整合 CI
2.3 核心演算法與資料結構
- 快排/堆排/計數排序、
qsort 比較函式撰寫
- 環狀緩衝區、雙向鏈表、哈希表、位圖管理器
2.4 網路協議棧基礎
- TCP/IP 分層、三次交手/四次揮發、滑動視窗、MTU/MSS
- 嵌入式常用:DHCP、DNS、MQTT/CoAP、Modbus TCP
2.5 程式架構設計原則
- 封裝變化:介面隔離、依賴倒置、里氏替換
- C 語言模擬 OO:
struct { void *data; void (*func)(void*); } + 不透明指標
- 模組間高內聚、低耦合,編譯防火牆模式
第三層:底層硬體感知 (資深工程師必修)
| 主題 | 關鍵知識點 |
| 編譯/連結/載入 | ELF 結構、重定位、段屬性、__attribute__((section))、啟動檔 crt0.S |
| CPU 架構 | ARM/PPC 暫存器組、模式切換、向量表、中斷嵌套、DSP 指令集 |
| 堆疊幀佈局 | 函數呼叫慣例 (AAPCS/EABI)、可變參數存取、堆疊回溯 |
| 記憶體對齊 | 自然對齊、#pragma pack、__attribute__((aligned))、DMA 緩衝區對齊 |
| 大小端序 | 網路序轉換 htonl/ntohl、位欄位配置序、跨平台資料交換 |
| 巨集進階技巧 | 字串化 #、符號連接 ##、多行巨集 do{...}while(0)、版本號字串化 |
第四層:工程化陷阱與現代化演進
4.1 經典 C 陷阱
sprintf/strcpy 緩衝區溢位 → 改用 snprintf/strncpy 或安全庫
- 區域變數取址傳回 → 編譯器優化存暫存器導致無效位址
- 結構體填充位元導致
memcmp 比較失效 → 逐欄位比較或 memset 清零
4.2 C 語言局限與業界趨勢
- 記憶體洩漏、指標錯誤、強耦合、難擴展 → 靜態分析、單元測試、模組化架構緩解
- 新語言 (Rust, Zig, C# embedded) 逐步進入嵌入式領域,值得持續關注
必讀經典書單
| 階段 | 書名 | 核心價值 |
| 入門 | 《C 程式設計語言》(K&R) | 語言權威定義、簡潔範例 |
| 入門 | 《C 陷阱與缺陷》 | 避開 90% 初學者坑 |
| 進階 | 《C 專家編程》 | 連結器、記憶體、編譯器內幕 |
| 進階 | 《C 與指標》 | 指標徹底掌握 |
| 架構 | 《Head First 設計模式》 | OO 思想落地 C 專案 |
本文整理自「果凍的軟件技術博客」,原文出處:https://sinojelly.blog.51cto.com/479153/209752