# 如何讓 Arduino 2.0 快速編譯(增量編譯) 作者:Jack OmniXRI, 2024/10/10  以往在開發簡易型聲音辨識(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/
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up