女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

工程師筆記|一個地址未對齊引起的 HardFault 異常

STM32單片機 ? 來源:未知 ? 2023-02-10 11:05 ? 次閱讀
關鍵詞:地址對齊,Hardfault,STM32G0





目錄預覽




1. 概述

2. 問題描述與分析

3. 問題解決

4. 總結



1.概述

客戶在使用 STM32G070 的時候,KEIL MDK 為編譯工具,當編譯優化選項設置為Level0 的時候,程序會出現 Hard Fault 異常,而當編譯優化選項設置為 Level1 的時候,則程序運行正常。


表面上看,這似乎是 KEIL MDK 的問題,通過分析,導致這個問題的本質原因是內存地址沒有對齊引起的,下面章節將詳細分析該問題的來龍去脈以及解決方法。


問題描述與分析

根據客戶的反饋,引起問題的代碼很簡單,客戶定義了幾個全局數組,在主程序中訪問這幾個數組就會出現 Hard Fault 異常,參考代碼如下。


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


根據單步調試得知出現問題的語句為 LDR 指令,參考 Cortex M0 編程手冊 PM0223 得知 LDR 指令的作用是從內存地址中加載一個 WORD 數據到目的寄存器 Rt 中,其中內存地址根據 Rn 或者 SP 寄存器的值以及立即數 imm 得到。


根據指令的描述,使用 LDR 指令的時候,通過 Rn 和 imm 計算得到的內存地址必須是讀取字節數的倍數,LDR 每次讀取一個 WORD,所以使用 LDR 指令時,內存地址必須 4字節對齊。如果地址沒有對齊,則會導致 HardFault 異常。


結合 LDR 指令的描述,在調試狀態下,通過查看寄存器值,圖 2 出錯語句中根據 Rn和 imm 計算得到的內存地址為 R0=0x2000000B,imm=4 所以內存地址為 0x2000000F,很顯然這個地址不是 4 字節對齊的。



而當我們改變編譯優化選項為 Level1 時,得到的內存地址為R0=0x20000000,imm=0x04 顯然這個地址是按照 4 字節對齊的,所以這種情況下是不會出現 HardFault 異常的,印證了客戶的問題現象。



3.問題解決

通過上一節的分析,明確了導致該問題的本質原因是內存地址沒有對齊,這個內存地址實際上是代碼中定義的全局變量 g_curPlaySound_app 指向的地址,也就是全局數組變量 SoundFile 的地址,在編譯器不同的優化選項下,分配給 SoundFile 變量的地址是不一樣的,在本案例中,編譯優化選項 Level0 條件下,SoundFile 分配的地址沒有按照WORD 對齊,而在優化選項 Level1 條件下,SoundFile 分配的地址是 WORD 對齊,所以在兩種優化選項下,出現了不一樣的運行結果。


所以要保證程序不出錯,當通過指針訪問變量的時候,要確保指針指向的地址是 4 字節對齊的,在 Keil 環境下,可以通過__attribute__((aligned (4))) 關鍵字實現,如下圖所示,通過該關鍵字,對齊了地址,也就不會出現 HardFault 異常了。


圖6 確保地址對齊


4.總結

地址未對齊是嵌入式系統中容易忽視的一個細節,忽視這點往往會導致一些奇怪的問題,所以在開發過程中,注意這些細節還是很有必要的。



參考文獻:PM0223 Programming maual



長按掃碼關注公眾號


更多資訊,盡在STM32

點擊“閱讀原文”,可下載原文檔


原文標題:工程師筆記|一個地址未對齊引起的 HardFault 異常

文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6063

    文章

    44923

    瀏覽量

    646973
  • STM32
    +關注

    關注

    2289

    文章

    11014

    瀏覽量

    362390

原文標題:工程師筆記|一個地址未對齊引起的 HardFault 異常

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    優秀的射頻測試工程師需要具備哪些技能?

    優秀的射頻測試工程師需要具備哪些技能?在無線技術高速發展的今天,射頻(RF)測試工程師是確保通信設備性能與用戶體驗的關鍵角色。從復雜的調制方案到無處不在的干擾,從功耗優化到標準合規
    的頭像 發表于 05-16 10:08 ?142次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b>優秀的射頻測試<b class='flag-5'>工程師</b>需要具備哪些技能?

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

    電子工程師
    MDD辰達半導體
    發布于 :2025年04月27日 18:21:47

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

    硬件工程師
    揚興科技
    發布于 :2025年04月25日 17:15:37

    從“設計到生產”的蛻變:華秋DFM如何讓工程師們“輕松上陣”?

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

    硬件工程師:回答我!#回答我 #硬件工程師 #YXC晶振 #揚興科技

    硬件工程師
    揚興科技
    發布于 :2025年03月25日 18:46:59

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

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

    STM32H7 0x00000000地址的內容引發hardfault怎么解決?

    函數時入參異常,進入hardfault. 求助:關于stm32h7 ,0x00000000地址的內容是如何被改變的?觀察過正常情況下的值,如下。前三
    發表于 03-07 08:15

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

    硬件工程師
    MDD辰達半導體
    發布于 :2024年12月20日 17:48:17

    FPGA算法工程師、邏輯工程師、原型驗證工程師有什么區別?

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

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

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

    用二創,1:1復刻工程師的職場現狀

    工程師
    揚興科技
    發布于 :2024年07月19日 18:30:07