2024年10月10日 星期四

如何讓 Arduino 2.0 快速編譯(增量編譯)

 作者:Jack OmniXRI, 2024/10/10

留言

20241010_Fig00

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

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

最後以一個 Edge Impulse 產生的 LIB(ZIP)來測試,結果如下。

工作內容Arduino IDEArduino CLI
第一次編譯上傳19~20min19~20min
未修改程式第二次編譯上傳19~20min< 1min
修改程式後編譯上傳19~20min1~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/

沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...