[筆記] 漫談 ARM cross compiler 環境

        在 Windows 環境下,如果要開發軟體,我們只需安裝微軟的 Visual Studio IDE,接著在這 IDE 編譯我們的程式就能在 x86 的環境下運行。由於 Visual Studio 編譯器是專為 x86/x64 晶片設計的,實際上它編譯出來的機器碼並不能放到 ARM 晶片上執行,所以我們需要找其他編譯器編譯出 ARM 能看得懂的機器碼。

機器碼

        目前可編譯 ARM 晶片的編譯器以 GCC 為主,當然有些付費版的 IDE 也能編譯 ARM,如:KEIL、IAR (有專人管理的編譯器),  不過都還是源自 ARM compiler 網站,從網站上取得編譯器的原始碼,經過編譯後產生一套能編譯 ARM 晶片的編譯器 (說的有點複雜 !!)。簡單說,最終目的是製造出一個 ARM 編譯工具,但是要先取得原料後,再自行製造出這個工具。所幸現在網上有不少開發環境都能提供這 ARM 編譯的工具了,不需要我們重頭開始打造工具。然而,這類工具大多在 Linux 的環境下,所以想編譯成 ARM 機器碼只能到 Linux 環境下?

        在 Windows 環境下,如果也想要 Linux 的環境,需要在 Win 系統安裝類 Unix 環境的軟體,如:cygwin、MSYS2、MinGW...等。底下以 MSYS2 軟體為例,其實它就是一個在 Win 系統的命令列,但是和 Win 系統提供的有何不同呢?請看圖一和圖二的環境變數,兩者環境變數完全不一樣,MSYS2 就是模擬一個 Linux 環境的命令列,操作指令也是 Linux 指令,但實際上指令已經轉為 Win 系統能執行了。有了這類 Linux 環境當然是對熟悉 Win 系統的人操作起來比較便利。
圖一:Windows的命令列


圖二:MSYS2的命令列

Unix-like環境

        在 MSYS2 環境,我們要先安裝 ARM 相關的編譯工具,從 MSYS2 官網下載安裝 package ,安裝這幾個套件 arm-none-eabi-gccarm-none-eabi-newlibarm-none-eabi-binutils... (執行指令 pacman -S xxx),我們就能用這套編譯工具編譯成 ARM 機器碼,如下圖三所示。既然安裝 ARM 交叉編譯工具可以直接從官網安裝,何需再學習自行打造 ARM 編譯器呢?現實情況,每個 ARM 編譯器工具的版本會搭配相對應的 library,也會修正一些 bugs,當我們使用一套穩定的編譯器版本開發韌體時,如果沒特別理由的話,我們不希望一直更新編譯工具的版本,因為改動編譯器版本有可能變動到機器碼或結構,萬一造成晶片與這機器碼不相容,那開發過程會很麻煩,因此我們通常會把穩定的 ARM 編譯器保存下來,當做建議版本。
圖三:arm-gcc 版本 (10.1.0)

PlatformIO插件

        除了上述類 Unix 的編譯環境之外,Visual Studio Code (VS Code) 內有一插件 PlatformIO 可提供超過八百種板子的交叉編譯環境,因此不再是命令列式的操作環境。舉例來說,在 PIO 插件選了 STM32F103 的板子,STM32 是基於 ARM-M3 的晶片,如圖四,它便會自動下載安裝 ARM tool-chain,之後我們也能在 VS Code 環境下編譯 ARM 的程式碼。
圖四:VS Code 的 PlatformIO 環境


        當 PIO 插件安裝與 STM32 板子相關的套件後,我們可以觀察它把 toolchain 安裝到哪裡,在圖五所示,PIO 安裝兩套不同版本的 arm-gcc,一個 7.2.1,一個 9.2.1,這就是前面所提到的穩定版本。如果在 PIO 開啟以 Arduino framework 為基礎的 STM32 project,那麼在編譯過程就會用 arm-gcc 9.2.1 版本 。如果在 PIO 開啟以 ARM CMSIS 為基礎的 STM32 project,那麼在編譯過程就會用 arm-gcc 7.2.1 版本 。因此,無論在 Windows 或 Linux 系統下,想要編譯 ARM 程式必須先安裝好編譯工具,而這套工具可以運行在 Windows 或 Linux 下,才能編譯出 ARM 的機器碼。
圖五:PIO 安裝的 arm-gcc

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[應用] STM32 DFU (Device Firmware Upgrade)

[模組] 無線資料傳輸:nRF905 和 nRF24L01 (以 Arduino 為控制器)

[筆記] Visual Studio 遠端偵錯的設定步驟

建立一個 MQTT 測試環境