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

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

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

3天內不再提示

一個地址未對齊引起的HardFault異常

jf_pJlTbmA9 ? 來源:STM32單片機 ? 作者:STM32單片機 ? 2023-09-18 10:57 ? 次閱讀

1.概述

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

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

2.問題描述與分析

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

wKgaomUDzW-ASSFXAAKMO7qO1zU016.png

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

wKgaomUDzXSAKy7hAAIJqOIWXwQ854.png

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

wKgZomUDzXaAfhbqAAFcPh7FuT4672.png

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

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

wKgaomUDzXiAXrhKAAHpxnz5tEs892.png

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

wKgZomUDzXyAA6YsAAH2kOHpX_o908.png

3.問題解決

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

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

圖6 確保地址對齊

wKgaomUDzX6AMKw_AALxznUvPqE621.png

4.總結

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

來源:STM32單片機

審核編輯:湯梓紅

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

    關注

    6058

    文章

    44821

    瀏覽量

    644893
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3662

    瀏覽量

    130640
  • STM32
    +關注

    關注

    2283

    文章

    10986

    瀏覽量

    361387
  • MDK
    MDK
    +關注

    關注

    4

    文章

    209

    瀏覽量

    32436
收藏 人收藏

    評論

    相關推薦

    RISC-V對齊導致問題案例

    本文介紹對齊導致問題案例
    的頭像 發表于 06-08 10:04 ?2094次閱讀
    RISC-V<b class='flag-5'>未</b><b class='flag-5'>對齊</b>導致問題案例

    基于DWC_ether_qos的以太網驅動開發-LWIP的堆(內存池)對齊導致問題的案例分享

    本文轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog .?前言 內存對齊訪問問題這個已經是老生常談的問題了, 由于LWIP
    的頭像 發表于 09-09 08:44 ?2159次閱讀
    基于DWC_ether_qos的以太網驅動開發-LWIP的堆(內存池)<b class='flag-5'>未</b><b class='flag-5'>對齊</b>導致問題的案例分享

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

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

    HardFault_Handler異常

    請教各位,最近用MDK5.11編寫STM32F103RC的程序,但是卻莫名其妙進入HardFault_Handler異常中斷,現在本人完全頭霧水,還請大神指點迷津!
    發表于 11-07 17:51

    靈動微課堂 (第173講) | HardFault定位方法和步驟

    復位之外的任何異常搶占。 HardFault HardFault 是由于在正常操作過程中或在異常處理過程中出現錯誤而出現的
    發表于 07-02 15:20

    為什么要進行內存對齊操作呢

    地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問
    發表于 12-17 06:34

    導致STM32進入HardFault異常的原因

    圖所示程序進入HardFault異常。如下所示我們找到SP寄存器,0x200045B8即為棧地址,棧里面的值依次為R0~R3、R12、PC(Return address)、xPSR(CPS...
    發表于 01-07 06:52

    ARM處理器是否曾經為指令或數據訪問生成對齊的突發

    節)數據包與32位邊界對齊。然后顯示了對齊的第一個字節的突發示例。我還看到了有關在突發寫
    發表于 08-19 15:43

    iMXRT1170的cortex M7上的HardFault異常是怎么回事?

    HardFault 異常)。下面是來自 IAR EW 的錯誤圖像。代碼行僅執行從結構到另一個結構變量的賦值操作。 誰能告訴我們為什么會
    發表于 04-04 07:42

    RISC-V對齊訪問導致問題案例

    轉自公眾號,歡迎關注 參考https://mp.weixin.qq.com/s/8wfRFg1XcBsXw5gMq-cKaQ前言 本文以實例,講解RISC-V對齊訪問導致的問題.
    發表于 05-06 19:14

    異常向量表重映射

    異常向量表重映射 向量表是異常產生時內核獲取異常處理函數入口地址塊連續內存,每一個
    發表于 03-26 09:34 ?20次下載

    地址對齊有關的應用異常案例

    也就是說,基于CortexM3內核的芯片,它支持部分指令的非對齊訪問,但非對齊訪問要慢于對齊訪問。即非對齊訪問是需要代價的,訪問效率會受到影響。所以,我們在應用中要盡量遵循
    的頭像 發表于 02-04 15:20 ?2709次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b>跟<b class='flag-5'>地址</b><b class='flag-5'>對齊</b>有關的應用<b class='flag-5'>異常</b>案例

    解決STM32因字節對齊問題導致讀寫Flash失敗進入HardFault的問題

    ,獲取升級包的文件所有結構體采用字節對齊,解析升級包采用指針偏移的方式。進入Flash未進行擦除操作前的參數如下:要寫入的長度和地址都是沒問題的,但是buf指針的在RAM中的地址為0
    發表于 12-02 09:06 ?16次下載
    解決STM32因字節<b class='flag-5'>對齊</b>問題導致讀寫Flash失敗進入<b class='flag-5'>HardFault</b>的問題

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

    關鍵詞:地址對齊,Hardfault,STM32G0 目錄預覽 1. 概述 2. 問題描述與分析 3. 問題解決 4. 總結 1.概述 客戶在使用 STM32G070 的時候,KEIL MDK 為
    的頭像 發表于 02-10 11:05 ?2878次閱讀

    ES32F36xx芯片發生HardFault異常時的函數調用關系及問題定位

    ES32F36xx芯片發生HardFault異常時的函數調用關系及問題定位
    的頭像 發表于 11-06 17:13 ?1041次閱讀
    ES32F36xx芯片發生<b class='flag-5'>HardFault</b><b class='flag-5'>異常</b>時的函數調用關系及問題定位
    主站蜘蛛池模板: 四虎最新在线 | 福利姬 magnet | 国产午夜三级 | www.五月婷婷.com | 免费福利在线播放 | 五月sese | 中文字幕精品一区 | 欧美精品四虎在线观看 | 亚洲最新在线观看 | 久久国内精品 | 国产午夜精品理论片在线 | 1000部又爽又黄的做黄禁片 | 色视频综合 | 午夜视频精品 | 婷婷激情狠狠综合五月 | 精品卡1卡2卡三卡免费视频 | 大色视频 | 日本亚洲免费 | 香蕉视频在线观看国产 | 欧美黄色一级视频 | 日日拍夜夜嗷嗷叫狠狠 | 国产激烈无遮挡免费床戏视频 | 鸥美三级 | 国产综合在线观看视频 | 激情五月婷婷色 | 77ee成人| 亚洲人成电影在线播放 | 午夜爱爱毛片xxxx视频免费看 | 午夜亚洲福利 | 网站在线观看你懂的 | china3p单男精品自拍 | 91po狼人社在线观看 | 国产网站免费看 | 神马午夜嘿嘿嘿 | 高清国产美女在线观看 | 中文字幕日本一区波多野不卡 | xxxxx69日本老师hd | 国产日韩精品一区二区三区 | 玖玖在线免费视频 | 日本精品三级 | 亚1州区2区三区4区产品 |