打造嵌入式 Linux 實驗室,不需要昂貴的設備。你可以先從完全不需硬體的 QEMU 開始,再加入一塊文件完善的開發板和一條 3.3V USB-to-serial 轉接器,之後再添購邏輯分析儀,最後只在遇到真正需要時才購買 JTAG 除錯器。每個階段都培養特定的實務技能,以此順序花錢,能讓你持續學習,而非只是不斷購物。
大多數想學習嵌入式 Linux 的人,會把第一個月花在決定要買什麼東西。這是錯誤的第一步。一個好的嵌入式 Linux 實驗室,應該是一組經過深思熟慮的小型工具,能讓你練習嵌入式領域的核心任務:啟動開發板、進入序列埠控制台、初始化週邊裝置,以及找出問題原因。價值在於你能執行的任務,而非你擁有的硬體。本教學將以四個階段(由便宜到昂貴)來建立實驗室,並說明每個階段所培養的技能。
為什麼嵌入式 Linux 實驗室很重要
閱讀文件無法教你:當你連接序列線卻什麼都看不到時,該如何判斷是鮑率、接線,還是核心根本沒有啟動到控制台的問題。一個嵌入式 Linux 實驗室,能讓你利用自己的時間犯錯,並建立真實且可重複的練習。以下每個階段,你都能在本週完成設定,而每個階段都能讓你具體地說:「我已經啟動這塊開發板,控制台沒有反應,而這就是我追蹤問題的方法。」
你需要準備什麼
本教學假設你使用 Linux 主機。全文以 Ubuntu 或 Debian 為例;在 Windows 上,請使用 WSL2 並在其中執行相同指令。請先在主機上安裝一次工具:
[email protected]:~$ sudo apt update
[email protected]:~$ sudo apt install build-essential git bc libncurses-dev qemu-system-arm picocom i2c-tools
Enter fullscreen mode Exit fullscreen mode
這組工具涵蓋以下所有階段:build-essential、git、bc 及 libncurses-dev 用於建置 Buildroot 與執行 make menuconfig;qemu-system-arm 用於第一階段;picocom 用於第二階段的序列埠控制台;以及 i2c-tools 用於第三階段。
第一階段:在購買任何硬體前,先從 QEMU 開始
最便宜的開發板就是「沒有開發板」。QEMU 能在你的筆電上啟動完整的 ARM 或 ARM64 Linux 系統,讓你免費學習整個建置與啟動流程。這是你最初幾週應該投入的時間。Buildroot 提供針對 QEMU 機型的預設設定檔。在 Linux 主機上:
[email protected]:~$ git clone https://git.buildroot.net/buildroot
[email protected]:~$ cd buildroot
[email protected]:~$ make list-defconfigs | grep qemu
[email protected]:~$ make qemu_aarch64_virt_defconfig
[email protected]:~$ make menuconfig
[email protected]:~$ make
Enter fullscreen mode Exit fullscreen mode
在 make menuconfig 步驟,第一次可以接受預設值——這是為了讓你之後能修改選項,而不是現在就必須編輯。建置完成後,會產生核心映像檔與根檔案系統。最簡單的啟動方式是執行 Buildroot 寫入輸出目錄的 start-qemu.sh 腳本:
[email protected]:~$ ./output/images/start-qemu.sh
Enter fullscreen mode Exit fullscreen mode
如果你想查看完整指令,這是等效的直接呼叫方式:
[email protected]:~$ qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -kernel output/images/Image -append "rootwait root=/dev/vda console=ttyAMA0" -drive file=output/images/rootfs.ext4,if=virtio,format=raw
Enter fullscreen mode Exit fullscreen mode
要離開 -nographic 的 QEMU 工作階段,請按 Ctrl-A 再按 x。有了這個環境,你就能練習核心設定、在修改設定後重新建置,以及為目標平台交叉編譯程式。在這裡培養的技能——交叉編譯、設定核心、組裝根檔案系統——與 BSP(Board Support Package)工作所需的技能相同。QEMU 唯一無法教你的,是真實硬體的行為,這是第二階段的內容。
請試試看 → 在花任何錢之前,先在 QEMU 中建置並啟動一個 Buildroot 映像檔,然後加入一個套件後重新建置。如果你能憑記憶完成這些步驟,就表示你已準備好迎接真正的開發板。
第二階段:你的第一塊開發板與序列埠控制台
當你轉向硬體時,請選擇文件完善且有主線支援的開發板,而不是追求原始效能。一塊擁有完整技術參考手冊且有上游核心支援的開發板,能教你更乾淨的工作流程,而非一塊啟動程序部分封閉但速度較快的開發板。
BeagleBone Black 是很好的第一選擇:它搭載德州儀器 AM335x SoC(單核 Cortex-A8)、主線核心與 U-Boot 均支援,且文件從原理圖開始就非常完整。Raspberry Pi 4 或 5 也可以,且社群龐大,但它的啟動流程從專有的 VideoCore 韌體階段開始,之後 ARM 核心才會執行,因此它在教授標準嵌入式啟動流程方面較為不足。兩者都可以;只要了解它們各自能教你什麼即可。
開發板之後,最重要的工具就是一條 3.3V USB-to-TTL 序列埠轉接器。這是讓你進入除錯控制台的途徑——U-Boot 與核心在網路還不存在時的輸出。使用 FT232R、CP2102 或 PL2303 晶片的轉接器都很便宜。必須使用 3.3V 轉接器:5V 轉接器可能損壞開發板的 UART 腳位。
將三條線連接到開發板的除錯序列埠接頭(在 BeagleBone Black 上是 6-pin J1 接頭),並交叉連接傳送與接收腳位:轉接器 TX 接開發板 RX,轉接器 RX 接開發板 TX,GND 接 GND。不要連接轉接器的 Vcc 或 5V 腳位——開發板會自行供電。然後開啟終端機:
[email protected]:~$ picocom -b 115200 /dev/ttyUSB0
Enter fullscreen mode Exit fullscreen mode
如果出現權限錯誤,表示你的使用者不在 dialout 群組中。請執行一次以下指令,然後重新登入:
[email protected]:~$ sudo usermod -aG dialout $USER
Enter fullscreen mode Exit fullscreen mode
除錯控制台的設定為 115200 鮑率、8 個資料位元、無同位元、1 個停止位(簡寫為 8N1)。minicom 與 screen /dev/ttyUSB0 115200 也能完成相同工作。有些轉接器會顯示為 /dev/ttyACM0 而非 /dev/ttyUSB0。當你第一次為開發板供電,並看到 U-Boot 輸出時,就表示你已從理論進入真正的嵌入式工作。
請試試看 → 在真正的開發板上取得序列埠控制台,並在倒數計時時中斷 U-Boot。學習如何在 U-Boot 提示字元停止並讀取環境變數,是你在每個專案都會用到的技能。
第三階段:與真實週邊裝置溝通
開發板啟動後,下一個技能是連接裝置並從 Linux 驅動它。一個便宜的 I2C 感測器模組,例如 TMP102 溫度感測器,就足夠了。首先列出核心所提供的 I2C 匯流排,以便使用正確的匯流排編號(編號不一定與接頭標籤相同):
[email protected]:~$ sudo i2cdetect -l
i2c-1 i2c OMAP I2C adapter I2C adapter
Enter fullscreen mode Exit fullscreen mode
然後掃描該匯流排以尋找你的裝置。使用 sudo,因為 I2C 裝置節點預設無法被一般使用者存取:
[email protected]:~$ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
...
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
Enter fullscreen mode Exit fullscreen mode
如果出現一個位址(這裡是 0x48),表示裝置已正確連接並供電。如果掃描結果只有破折號,表示接線錯誤或匯流排未啟用——在許多開發板上,I2C 控制器及其腳位必須先在裝置樹中啟用,匯流排才能正常運作。
接著,你需要透過裝置樹向核心描述該裝置,讓驅動程式能夠接管它。關鍵部分是在 I2C 控制器下建立一個子節點,指定裝置的 compatible 字串以及其在 reg 中的匯流排位址。作為裝置樹覆蓋層,它看起來像這樣:
&i2c1 {
status = "okay";
tmp102@48 {
compatible = "ti,tmp102";
reg = <0x48>;
};
};
Enter fullscreen mode Exit fullscreen mode
編譯與載入覆蓋層的方式因開發板而異,值得自行學習,但效果在各處都相同:一旦相符的驅動程式綁定,裝置就會出現在 sysfs 中,並以匯流排與位址命名:
[email protected]:~$ ls /sys/bus/i2c/devices/
1-0048 i2c-1
Enter fullscreen mode Exit fullscreen mode
這花費很少——幾個感測器模組與跳線——但這正是驅動程式與裝置樹技能變成真實能力的時刻。將裝置加入裝置樹並觀察核心將驅動程式綁定到它,正是開發板初始化工作所涉及的內容。
第四階段:邏輯分析儀與 JTAG 除錯器
最後兩種工具是用於當某些東西無法運作,而控制台無法告訴你原因時。當你遇到需要它們的問題時才購買,而不是事先購買。
低成本的 USB 邏輯分析儀能讓你看到 I2C、SPI 或 UART 線路上的實際訊號。開源的 sigrok 專案及其 PulseView 前端,能驅動許多廉價的分析儀,並為你解碼這些通訊協定。當感測器回傳無意義的資料時,分析儀能顯示匯流排是否正在產生你預期的位元,從猜測轉變為測量。
JTAG 或 SWD 除錯器是最後才需要的。使用 OpenOCD 以及基於 FTDI 的探針或 J-Link——或 Black Magic Probe(它內建 GDB 伺服器,無需 OpenOCD)——你可以暫停處理器並逐步執行低階程式碼。這對於除錯 bootloader 或在控制台還未啟動前的最早期核心啟動非常有用。初學者在最初幾個月很少需要它,因此不應該是早期購買的項目。
一台基本的數位萬用電錶值得一直放在工作台上:檢查電壓軌或導通性,通常比任何軟體工具更快解釋「死掉」的開發板。如果你想深入了解這些工具所支援的完整開發板初始化與驅動程式工作流程,那就是我們 Embedded Linux Mastery Track 的核心。
請試試看 → 不要在第一天就購買邏輯分析儀或 JTAG 探針。當你遇到真正的錯誤,讓你希望自己擁有它時,再加入每個工具——你會因為真正需要它而更好地理解該工具。
重點摘要
- 免費: 在你已擁有的電腦上使用 QEMU 加上 Buildroot,能在不花任何錢的情況下,教你完整的建置與啟動流程。
- 低成本: 你的第一筆購買是一塊文件完善且有主線支援的開發板,以及一條 3.3V USB-to-serial 轉接器——除錯控制台(115200 8N1)是你在每個專案都會用到的工具。
- 低成本: 幾個感測器模組與跳線,就能將裝置樹與驅動程式知識轉化為真實技能。
- 需要時再購買: 只在遇到讓你希望擁有它的錯誤時,才加入邏輯分析儀,之後再加入 JTAG 或 SWD 探針。
- 讓每次購買都由你正在嘗試學習的任務驅動,而一台基本的萬用電錶在整個過程中都會很有用。
常見問題
我需要購買硬體才能開始學習嵌入式 Linux 嗎?
不需要。QEMU 能在你的電腦上啟動完整的 ARM 或 ARM64 Linux 系統,而 Buildroot 提供現成的 QEMU 設定檔,讓你可以在完全沒有硬體的情況下學習交叉編譯、核心設定,以及根檔案系統的建置。
我應該先買哪塊開發板?
請選擇文件完善且有主線支援的開發板,而不是追求速度。一塊文件完整且有主線支援的開發板(如 BeagleBone Black),能教你更乾淨的工作流程,而 Raspberry Pi 的啟動程序從專有韌體開始。兩者都可以;請選擇對你想學習的內容文件更完善的開發板。
開發板之後最重要的工具是什麼?
一條 3.3V USB-to-TTL 序列埠轉接器。它能讓你進入除錯控制台,在那裡 U-Boot 與核心會在網路還不存在時輸出訊息。請使用 3.3V 轉接器,而不是 5V 轉接器,以避免損壞開發板。
初學者需要 JTAG 除錯器嗎?
不需要。JTAG 或 SWD 除錯器對於 bootloader 與極早期啟動除錯最有用,應該是你的最後一筆購買。只在你遇到序列埠控制台無法解釋的問題時,才加入它。
延伸閱讀
- The Buildroot user manual — 設定檔、QEMU 目標,以及加入套件。
- Buildroot qemu_aarch64_virt_defconfig — 上方使用的確切設定。
- BeagleBone Black documentation — 參考手冊、接頭,以及序列埠除錯。
- sigrok / PulseView — 開源邏輯分析儀軟體與通訊協定解碼器。
- OpenOCD documentation — 使用常見探針進行 JTAG/SWD 除錯。
Originally published on TECH VEDA.
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.