[筆記] 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 (不認機器嗎?),遇上這類問題,要嘛等待晶片廠商修正,釋出下一版晶片,要嘛更新編譯器,或者自己修改代碼的寫法避開有問題的寫法。


留言

lihgong說…
偶然看到,也許您可以看一下翻譯出來的ASM,看看具體root cause是什麼。有一種可能是,也許資料結構沒有加上volatile,被compiler調整順序導致錯誤(當然這個是隨便說說)

另外如果換編譯器會有差異,有時候會懷疑user code是不是本身有用上C語言未定義行為

不過如標題所述,這類問題真的都很難查
lihgong說…
此留言已被作者移除。
漢亞科技說…
升級compiler版本號,問題就消失了。已經反映給FAE,他們會反組譯查看機器碼,就留給原廠去debug了。

此網誌的熱門文章

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

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

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

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

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[應用] 藍芽 BLE client/server 架構:BLE remote controller

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸