概述
客戶在使用 STM32G070 的時候,KEIL MDK 為編譯工具,當(dāng)編譯優(yōu)化選項設(shè)置為Level0 的時候,程序會出現(xiàn) Hard Fault 異常,而當(dāng)編譯優(yōu)化選項設(shè)置為 Level1 的時候,則程序運行正常。表面上看,這似乎是 KEIL MDK 的問題,通過分析,導(dǎo)致這個問題的本質(zhì)原因是內(nèi)存地址沒有對齊引起的,下面章節(jié)將詳細(xì)分析該問題的來龍去脈以及解決方法。
問題描述與分析
根據(jù)客戶的反饋,引起問題的代碼很簡單,客戶定義了幾個全局?jǐn)?shù)組,在主程序中訪問這幾個數(shù)組就會出現(xiàn) Hard Fault 異常。
問題解決
通過上一節(jié)的分析,明確了導(dǎo)致該問題的本質(zhì)原因是內(nèi)存地址沒有對齊,這個內(nèi)存地址實際上是代碼中定義的全局變量 g_curPlaySound_app 指向的地址,也就是全局?jǐn)?shù)組變量 SoundFile 的地址,在編譯器不同的優(yōu)化選項下,分配給 SoundFile 變量的地址是不一樣的,在本案例中,編譯優(yōu)化選項 Level0 條件下,SoundFile 分配的地址沒有按照WORD 對齊,而在優(yōu)化選項 Level1 條件下,SoundFile 分配的地址是 WORD 對齊,所以在兩種優(yōu)化選項下,出現(xiàn)了不一樣的運行結(jié)果。
總結(jié)
地址未對齊是嵌入式系統(tǒng)中容易忽視的一個細(xì)節(jié),忽視這點往往會導(dǎo)致一些奇怪的問題,所以在開發(fā)過程中,注意這些細(xì)節(jié)還是很有必要的。