文章

顯示從 11月, 2021 起發佈的文章

[筆記] 漫談 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-gcc 、 arm-none-eabi-newlib 、 arm-none-eabi-binutils ... (執行指令 pacman -S xxx),我們就能用這套編譯工具編譯成 ARM 機器碼,如下圖三所示。既然安裝

[筆記] 笙泉 Megawin 微控制器(ARM Cortex-M0)的系統開發

圖片
        Megawin 公司 推出的 MG32F02x 系列晶片是以 ARM Cortex-M0 為核心的微控制器,內建至少 32KB flash 存放程式碼與資料,包含常用的介面,如:UART 、 I2C 、 SPI 、 ADC...等,算是具備完整周邊的 MCU。 準備工作:         軟體套件 KEIL uVision5 ARM 版本,注意 ARM compiler 版本必須是5.06 update 7,筆者測試過update 6,會造成 ISP 代碼運行時出現異常。而 KEIL v5.34版本裡面就包含ARM compiler 5.06 update 7,所以下載最新的 KEIL 版本即可避開此問題。此外,開發過程還需要準備一個 M-Link Cortex-M0 的除錯器,以方便我們開發時可以設斷點 、 step by step 、 debug...。         安裝 KEIL ARM 軟體後,需要再載入 Megawin 的工具包。開啟 KEIL IDE,在選單上點選 Pack Installer工具按鈕,從這工具去載入 Megawin.CM0_DFP.2.0.8.pack 或最新版。成功後,這樣的 KEIL 開發環境才能支援 Megawin 晶片。這個 pack 裡面包含晶片所有介面的驅動程式碼,以及範例程式,我們可以從工具的選單複製所需的範例程式碼。 韌體燒錄方式:         在開發韌體時,透過 KEIL IDE 加上 M-Link debugger 便能下載韌體到晶片上,但是一般實用場景下不可能每次都用 KEIL 套件去燒錄韌體。目前 Megawin 提供兩種燒錄韌體的方式: ICP (In-Circuit Programming) 和 ISP (In-System Programming)。         ICP方式就是M-Link除錯器連接到晶片的SCL (PC4)和SDA (PC5)接腳,利用 ICP32_Programmer.exe 軟體工具將韌體燒錄到指定 AP flash記憶體區,如下圖。首先載入我們的韌體(稱為 app),再按下 “Insert ISP-Code” 插入原廠提供的 ISP 碼,組成完整的 binary code,最後按下 Update Target 鈕,這樣 M-Link debug

[筆記] Firmware 開發過程中, 最難發現的問題之一

圖片
        過去開發 TI DSP 韌體時,遇過最詭異的問題就是程式跑到某一行就會出現異常情況,將這行移除後,程式又能正常運行。後來把編譯器的版本更新後,相同的程式碼經過重新 compile 居然能正常運行,很神奇吧?這類問題算是開發時期最難解決的問題之一,因為不容易發現,即使發現異常也不會懷疑與編譯器版本有關,於是自己會陷入一種迷惘的狀況,到底要怎麼 debug 解決。 [源由]           最近在開發 ARM-based MCU 晶片時,也是遇到奇怪現象。我寫一段 ISP 程式碼,每次運行到某一行就會發生晶片硬體出錯。於是,將這段程式碼交給原廠的 FAE 檢查,FAE 說在他的環境重現不出來,不過他把他的編譯產生的 map 也傳給我了。比對了雙方的 map 檔,唯一值得懷疑的是 compiler 版本不太一樣。         如下面的影片所呈現, 相同的 code,在不同的版本的編譯下,居然會出現不同的結果。影片中,先以 ARM compiler update 6 編譯,設定中斷點,當運行到某一行時,系統就出現錯誤。之後,我們將編譯工具升級為 update 7 版本後,相同的代碼就能通過運行,這種與 compiler 版本有關的問題是開發程式最難找的問題之一。 當 compiler 轉譯成機器碼之後,由晶片執行,有可能轉譯的過程有 bug (指令有錯?) 或者晶片本身有 bug (不認機器嗎?),遇上這類問題,要嘛等待晶片廠商修正,釋出下一版晶片,要嘛更新編譯器,或者自己修改代碼的寫法避開有問題的寫法。 影片: Firmware 開發時, 最難發現的問題之一