在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

工程師筆記|一個(gè)地址未對(duì)齊引起的 HardFault 異常

STM32單片機(jī) ? 來源:未知 ? 2023-02-10 11:05 ? 次閱讀
關(guān)鍵詞:地址對(duì)齊,Hardfault,STM32G0





目錄預(yù)覽




1. 概述

2. 問題描述與分析

3. 問題解決

4. 總結(jié)



1.概述

客戶在使用 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 的問題,通過分析,導(dǎo)致這個(gè)問題的本質(zhì)原因是內(nèi)存地址沒有對(duì)齊引起的,下面章節(jié)將詳細(xì)分析該問題的來龍去脈以及解決方法。


問題描述與分析

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


把客戶提供的代碼片段移植到 NUCLEO-G070RB 開發(fā)板上,問題很容易就復(fù)現(xiàn)了,代碼本身功能簡(jiǎn)單,寫法上也沒有錯(cuò)誤,所以從代碼片段本身上看,無法確定問題出在哪里,通過 KEIL 調(diào)試器,在匯編窗口單步調(diào)試下,最終發(fā)現(xiàn)導(dǎo)致 HardFault 異常的語(yǔ)句為下圖所示語(yǔ)句。


根據(jù)單步調(diào)試得知出現(xiàn)問題的語(yǔ)句為 LDR 指令,參考 Cortex M0 編程手冊(cè) PM0223 得知 LDR 指令的作用是從內(nèi)存地址中加載一個(gè) WORD 數(shù)據(jù)到目的寄存器 Rt 中,其中內(nèi)存地址根據(jù) Rn 或者 SP 寄存器的值以及立即數(shù) imm 得到。


根據(jù)指令的描述,使用 LDR 指令的時(shí)候,通過 Rn 和 imm 計(jì)算得到的內(nèi)存地址必須是讀取字節(jié)數(shù)的倍數(shù),LDR 每次讀取一個(gè) WORD,所以使用 LDR 指令時(shí),內(nèi)存地址必須 4字節(jié)對(duì)齊。如果地址沒有對(duì)齊,則會(huì)導(dǎo)致 HardFault 異常。


結(jié)合 LDR 指令的描述,在調(diào)試狀態(tài)下,通過查看寄存器值,圖 2 出錯(cuò)語(yǔ)句中根據(jù) Rn和 imm 計(jì)算得到的內(nèi)存地址為 R0=0x2000000B,imm=4 所以內(nèi)存地址為 0x2000000F,很顯然這個(gè)地址不是 4 字節(jié)對(duì)齊的。



而當(dāng)我們改變編譯優(yōu)化選項(xiàng)為 Level1 時(shí),得到的內(nèi)存地址為R0=0x20000000,imm=0x04 顯然這個(gè)地址是按照 4 字節(jié)對(duì)齊的,所以這種情況下是不會(huì)出現(xiàn) HardFault 異常的,印證了客戶的問題現(xiàn)象。



3.問題解決

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


所以要保證程序不出錯(cuò),當(dāng)通過指針訪問變量的時(shí)候,要確保指針指向的地址是 4 字節(jié)對(duì)齊的,在 Keil 環(huán)境下,可以通過__attribute__((aligned (4))) 關(guān)鍵字實(shí)現(xiàn),如下圖所示,通過該關(guān)鍵字,對(duì)齊了地址,也就不會(huì)出現(xiàn) HardFault 異常了。


圖6 確保地址對(duì)齊


4.總結(jié)

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



參考文獻(xiàn):PM0223 Programming maual



長(zhǎng)按掃碼關(guān)注公眾號(hào)


更多資訊,盡在STM32

點(diǎn)擊“閱讀原文”,可下載原文檔


原文標(biāo)題:工程師筆記|一個(gè)地址未對(duì)齊引起的 HardFault 異常

文章出處:【微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6065

    文章

    44941

    瀏覽量

    647987
  • STM32
    +關(guān)注

    關(guān)注

    2290

    文章

    11018

    瀏覽量

    362928

原文標(biāo)題:工程師筆記|一個(gè)地址未對(duì)齊引起的 HardFault 異常

文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    (仰天長(zhǎng)嘯)為什么受傷的總是硬件工程師...#MDD#MDD辰達(dá)半導(dǎo)體 #電子工程師

    電子工程師
    MDD辰達(dá)半導(dǎo)體
    發(fā)布于 :2025年04月27日 18:21:47

    問,成為硬件工程師需要幾只手?#硬件工程師 #YXC晶振 #揚(yáng)興科技 #搞笑

    硬件工程師
    揚(yáng)興科技
    發(fā)布于 :2025年04月25日 17:15:37

    從“設(shè)計(jì)到生產(chǎn)”的蛻變:華秋DFM如何讓工程師們“輕松上陣”?

    在電子設(shè)計(jì)領(lǐng)域,工程師們常常面臨個(gè)“隱形的敵人”: 設(shè)計(jì)與生產(chǎn)的脫節(jié) 。 比如精心設(shè)計(jì)的PCB,通過DRC檢查后,滿懷信心地送去生產(chǎn),結(jié)果仍被返工: 焊盤間距太小 ,無法保留阻焊及焊接飛料; 孔
    發(fā)表于 04-16 15:57

    硬件工程師:回答我!#回答我 #硬件工程師 #YXC晶振 #揚(yáng)興科技

    硬件工程師
    揚(yáng)興科技
    發(fā)布于 :2025年03月25日 18:46:59

    招拿捏電子工程師#被AI拿捏了 #電子工程師 #電子電工

    電子工程師
    安泰小課堂
    發(fā)布于 :2025年03月25日 17:30:51

    STM32H7 0x00000000地址的內(nèi)容引發(fā)hardfault怎么解決?

    函數(shù)時(shí)入?yún)?b class='flag-5'>異常,進(jìn)入hardfault. 求助:關(guān)于stm32h7 ,0x00000000地址的內(nèi)容是如何被改變的?觀察過正常情況下的值,如下。前三個(gè)
    發(fā)表于 03-07 08:15

    硬件工程師的終極幻想:焊板子焊上人生巔峰!#半導(dǎo)體器件 #硬件工程師 #MDD辰達(dá)半導(dǎo)體

    硬件工程師
    MDD辰達(dá)半導(dǎo)體
    發(fā)布于 :2025年02月24日 19:00:35

    笑死,掌握眼識(shí)別資深硬件工程師的訣竅了!# #電路知識(shí) #電工 #硬核拆解

    硬件工程師
    MDD辰達(dá)半導(dǎo)體
    發(fā)布于 :2024年12月20日 17:48:17

    FPGA算法工程師、邏輯工程師、原型驗(yàn)證工程師有什么區(qū)別?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問題() Q:FPGA中的FPGA算法工程師、FPGA邏輯工程師、FPGA原型驗(yàn)證工程師三者有什么區(qū)別? A:FPGA 算法
    發(fā)表于 09-23 18:26

    正是拼的年紀(jì)|65歲電子工程師上班VLOG #65歲退休 #電子工程師 #搞笑 #上班vlog

    電子工程師
    安泰小課堂
    發(fā)布于 :2024年07月25日 11:31:02

    用二創(chuàng),1:1復(fù)刻工程師的職場(chǎng)現(xiàn)狀

    工程師
    揚(yáng)興科技
    發(fā)布于 :2024年07月19日 18:30:07
    主站蜘蛛池模板: 亚洲视频在线播放 | 欧美久久天天综合香蕉伊 | 天天干天天操天天爽 | 午夜大片免费完整在线看 | 牛牛碰在线 | 色人阁综合 | 在线观看免费视频资源 | 天天噜噜日日噜噜久久综合网 | 毛片视频网址 | 亚洲成人伊人网 | 亚洲国产成人最新精品资源 | 日本黄色免费大片 | 精品精品国产自在久久高清 | 91免费视频网 | 日韩免费视频一区二区 | 精品三级网站 | 性网站视频 | 欧美一区色 | 欧美人与zoxxxx视频 | 国产精品爱啪在线线免费观看 | 三级精品视频在线播放 | 欧美日本一区二区 | 酒色成人网 | 日本最好的免费影院 | 国产一级特黄在线播放 | 欧美极品色影院 | 狠狠色噜噜狠狠狠狠888奇米 | 国产自在自线午夜精品视频在 | 免费一级在线观看 | 两性色午夜视频免费网 | 国产免费高清视频在线观看不卡 | 天天干天天干天天干天天干天天干 | 东北美女野外bbwbbw免费 | 最近2018中文字幕免费看2019 | 91精品日本久久久久久牛牛 | 欧美黄色免费网站 | 四虎影院的网址 | bt天堂在线www最新版资源网 | 天天操天天射天天爽 | 宅男在线看片 | 天堂影院jav成人天堂免费观看 |