嵌入式與裸機

裸機程式設計(bare-metal programming)

/ bair-MET-ul /

想像恆溫器、電動牙刷或洗衣機裡的一顆小晶片。那裡沒有 Windows、沒有 Linux、沒有桌面、沒有檔案、沒有終端機——電源一打開,「你的」程式就是最先也是唯一在跑的東西,並且直接和硬體對話。裸機程式設計指的是撰寫在「沒有作業系統」墊在底下的處理器上執行的軟體。你的程式擁有整台機器。

具體來說,在有主機支援的環境(跑 Linux 的 PC)裡,作業系統給你一個行程、一塊虛擬定址空間、來自 malloc() 的堆積、透過 printf() 的主控台,並替你載入並啟動程式。在裸機上這些都不會自動有。你得自己寫在 main() 之前執行的啟動程式碼、透過連結器指令稿決定每樣東西落在記憶體何處、靠著把特定數值寫進特定硬體位址(記憶體映射暫存器)去操控一盞燈或一個感測器;若你要 printf() 把字元送到某處,也得自己接好。C 標準稱這為自立實作(freestanding implementation):只保證一小部分標準函式庫(例如 <stddef.h> 與 <stdint.h>),不保證像 <stdio.h> 那種假設有作業系統的部分。

它之所以重要,是因為世界上多數電腦「不是」筆電——它們是汽車、醫療裝置與家電裡數十億顆小微控制器,許多因成本、體積、功耗或時序而採裸機。誠實的提醒:裸機不代表「簡單」。你放棄了作業系統提供的便利與安全網(記憶體保護、排程、驅動程式),所以一個寫錯的位址或一個漏掉的硬體怪癖,就可能讓整台裝置卡死,而且完全沒有錯誤訊息。裸機是用便利換取完全、直接的控制權。

// 一支完整的裸機程式:永遠閃爍一顆 LED。 volatile uint32_t *GPIO_OUT = (uint32_t *)0x40020014; int main(void) { for (;;) { *GPIO_OUT ^= (1u << 5); // 切換第 5 隻腳 for (volatile int i = 0; i < 100000; i++) { } // 粗糙的延遲 } }

沒有作業系統、沒有 printf、沒有回傳:main 永不結束。LED 位址是固定的硬體位置,迴圈就這樣永遠跑下去。

在裸機上 main() 通常永不回傳——根本沒有可回傳的對象。在微控制器上從 main 回傳通常會掉進無窮迴圈或觸發錯誤,所以嵌入式的 main() 幾乎總是 for(;;) 或 while(1)。

又称
no-OS programmingfreestanding programming無作業系統程式設計裸機開發