---
# System prepended metadata

title: 如何讓Arduino快速編譯（增量編譯）

---

# 如何讓 Arduino 2.0 快速編譯（增量編譯）

作者：Jack OmniXRI, 2024/10/10

![20241010_Fig00](https://hackmd.io/_uploads/SyOXO2Nk1e.jpg)

以往在開發簡易型聲音辨識(Keyword Spotting / Voice Command)時常使用 Edge Impulse 來建立及訓練模型，再輸出成 Arduino LIB（ZIP）格式給對應的開發板使用[1]。不過由於 AI 相關函式庫非常多，所以第一次編譯程式時都得等上十到三十分鐘，這還勉強可以接受，但悲劇地是就算什麼都不作，再傳新上傳程式時也要再全部重新編譯一次，這就有點不合乎常理，不是沒更動到的部份就不用重編嗎？難道沒有好的解決方式嗎？

經網路查詢後，得知 Arduino IDE 2.x 預設是不支援「增量編譯」，就是只編譯有變更部份的程式，須改用其它編譯器來改善這個問題。測試了幾個網路資訊給出的幾個建議後，這裡選擇一個最簡單的作法，就是直接使用 Arduino Command Line Interface （簡稱CLI）[2] 來解決增量編譯問題。

這裡假設大家原本就已有安裝好 Arduino IDE 2.x ，電腦已順利連接開發板，並可對指定開發板進行程式撰寫、校驗/編譯、上傳及執行，且串列埠（Serial）也都能順利工作，可正常顯示開發板送出的字串。接下來就以 Windows 為例，依序操作下列相關步驟及指令碼即可完成增量編譯設定。

1. 安裝 Arduino CLI
可參考[1]說明安裝，可直接下載 [Widnows 64bit exe](https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-latest_Windows_64bit.zip) ，雙擊程式啟動安裝。完成後進入 Windows 命令列模式（已為全域命令）直接輸入下列指令即可測試是否完成安裝。
```shell=
arduino-cli -h
```
2. 開啟工作程式
為方便後面編修程式及串列埠監看工作狀況，請先以 Arduino IDE開啟欲執行的程式(ino)。
**注意：接下來不要使用介面的編譯及上傳功能，改使用步驟6編譯和步驟8上傳。**
3. 切換到 Arduino ino程式所在路徑
```shell=
cd x:\xxx
```
4. 查詢所使用開發板的FQBN代號
執行下列指令可得所有開發板名稱及 FQBN 代號，如 "arduino:avr:nano" ，請複製下來，後面會用到。
```shell=
arduino-cli board listall
```
5. 建立程式編譯批次檔（bat）
為方便後續操作，可先建立批次檔。首先進入Arduino IDE，點選選單「File - Preferences」，將 Arduino 程式所在位置路徑（Sketchbook Location）完整複製下來備用。接著開啟「筆記本(Notpad)」或任意文字編輯器，將下列文字輸入。其中 echo 部份是取得目前系統時間，方便記錄工作起迄時間，可以略過不輸入。編譯時記得加入 Arduino 函式庫路徑，以免找不到相關已安裝函式庫，另外如果想要看到編譯過程所有資訊，可於編譯(compile)指令最後方加上 " -v" 即可。最後將檔案另存成"compile.bat"（名稱可自行定義）
```shell=
echo Start time: %time%
arduino-cli compile --fqbn 開發板FQBN代號 --libraries Arduino程式所在位置路徑\libraries 待編譯程式名稱.ino
echo End time: %time%
```
6. 執行編譯批次檔
```shell=
compile
```
7. 建立程式上傳批次檔(bat)
由於連接上 Arduino 的開發板在上傳程式和工作模式的串列埠(COM)埠號會變，而 Arduino IDE 有時會自動幫忙切換，但使用 CLI 模式時則要自己指定，所以要先從 IDE 連接好板子找到對應的 COMx （x表埠號），以便稍後上傳使用。最後將檔案另存成"upload.bat"（名稱可自行定義）
```shell=
echo Start time: %time%
arduino-cli upload -p COM9 --fqbn 開發板FQBN代號  待上傳程式名稱.ino -v
echo End time: %time%
```
8. 執行上傳批次檔
一般開發板上傳完程式後會自動切到工作模式，串列埠號也隨之改變，導致無法上傳程式了。此時只需快按兩次開發板的重置鍵（RESET）就可切回上傳模式埠號，等待程式上傳。上傳完成後開發板會重新回到工作模式，此時 Arduino IDE 上也可正常監看串列埠回傳的數據及字串。
```shell=
upload
```

**接下來如果修改程式後，不要使用 IDE 上的編譯及上傳，只需反覆執行步驟6及8即可！**

最後以一個 Edge Impulse 產生的 LIB（ZIP）來測試，結果如下。

| 工作內容 | Arduino IDE | Arduino CLI |
| -------- | -------- | -------- |
| 第一次編譯上傳 | 19~20min | 19~20min |
| 未修改程式第二次編譯上傳 | 19~20min | < 1min |
| 修改程式後編譯上傳 | 19~20min | 1~2min |

由以上測試數據透過 Arduino CLI 增量編譯很明顯地節省了大量時間，有興趣的朋友可以自己試試。

參考文獻：

[1] Edge Impulse - Run Inference - Arduino Library
https://docs.edgeimpulse.com/docs/run-inference/arduino-library

[2] Arduino CLI Installation 
https://arduino.github.io/arduino-cli/1.0/installation/




