[筆記] 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 (不認機器嗎?),遇上這類問題,要嘛等待晶片廠商修正,釋出下一版晶片,要嘛更新編譯器,或者自己修改代碼的寫法避開有問題的寫法。
留言
另外如果換編譯器會有差異,有時候會懷疑user code是不是本身有用上C語言未定義行為
不過如標題所述,這類問題真的都很難查