• 資料介紹
    • 概述
    • 問(wèn)題描述與分析
    • 問(wèn)題解決
    • 總結(jié)
  • 資料預(yù)覽
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

LAT1185 一個(gè)地址未對(duì)齊引起的 HardFault 異常

03/26 09:34
396
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

LAT1185 一個(gè)地址未對(duì)齊引起的 HardFault 異常

673.92 KB

概述

客戶在使用 STM32G070 的時(shí)候,KEIL MDK 為編譯工具,當(dāng)編譯優(yōu)化選項(xiàng)設(shè)置為L(zhǎng)evel0 的時(shí)候,程序會(huì)出現(xiàn) Hard Fault 異常,而當(dāng)編譯優(yōu)化選項(xiàng)設(shè)置為 Level1 的時(shí)候,則程序運(yùn)行正常。表面上看,這似乎是 KEIL MDK 的問(wèn)題,通過(guò)分析,導(dǎo)致這個(gè)問(wèn)題的本質(zhì)原因是內(nèi)存地址沒(méi)有對(duì)齊引起的,下面章節(jié)將詳細(xì)分析該問(wèn)題的來(lái)龍去脈以及解決方法。

問(wèn)題描述與分析

根據(jù)客戶的反饋,引起問(wèn)題的代碼很簡(jiǎn)單,客戶定義了幾個(gè)全局?jǐn)?shù)組,在主程序中訪問(wèn)這幾個(gè)數(shù)組就會(huì)出現(xiàn) Hard Fault 異常。

問(wèn)題解決

通過(guò)上一節(jié)的分析,明確了導(dǎo)致該問(wèn)題的本質(zhì)原因是內(nèi)存地址沒(méi)有對(duì)齊,這個(gè)內(nèi)存地址實(shí)際上是代碼中定義的全局變量 g_curPlaySound_app 指向的地址,也就是全局?jǐn)?shù)組變量 SoundFile 的地址,在編譯器不同的優(yōu)化選項(xiàng)下,分配給 SoundFile 變量的地址是不一樣的,在本案例中,編譯優(yōu)化選項(xiàng) Level0 條件下,SoundFile 分配的地址沒(méi)有按照WORD 對(duì)齊,而在優(yōu)化選項(xiàng) Level1 條件下,SoundFile 分配的地址是 WORD 對(duì)齊,所以在兩種優(yōu)化選項(xiàng)下,出現(xiàn)了不一樣的運(yùn)行結(jié)果。

總結(jié)

地址未對(duì)齊是嵌入式系統(tǒng)中容易忽視的一個(gè)細(xì)節(jié),忽視這點(diǎn)往往會(huì)導(dǎo)致一些奇怪的問(wèn)題,所以在開(kāi)發(fā)過(guò)程中,注意這些細(xì)節(jié)還是很有必要的。

資料預(yù)覽

相關(guān)推薦