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

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單片機】歡迎添加關注!文章轉載請注明出處。

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

    關注

    6040

    文章

    44606

    瀏覽量

    637244
  • STM32
    +關注

    關注

    2270

    文章

    10920

    瀏覽量

    356907

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

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

收藏 人收藏

    評論

    相關推薦

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

    硬件工程師
    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

    嵌入式軟件工程師和硬件工程師的區別?

    嵌入式軟件工程師和硬件工程師的區別? 嵌入式軟件工程師 嵌入式軟件工程師是軟件開發領域中的種專業工程師
    發表于 05-16 11:00

    大廠電子工程師常見面試題#電子工程師 #硬件工程師 #電路知識 #面試題

    電子工程師電路
    安泰小課堂
    發布于 :2024年04月30日 17:33:15

    電源工程師的成長路徑

    即將走馬上任電源工程師這個崗位,請問各位大佬,這個崗位的職業路徑般是怎樣的?
    發表于 04-08 14:19

    企業老工程師和高校老師有啥區別

    電子工程師硬件
    電子發燒友網官方
    發布于 :2024年02月28日 17:50:00

    如何搞崩硬件工程師心態?試試對ta說這幾句

    硬件工程師
    揚興科技
    發布于 :2024年02月20日 18:05:49
    主站蜘蛛池模板: 成人18毛片| 一本高清在线视频| 欧美在线色视频| 欧美97色| 黄色美女网站在线观看| 国内精品久久久久影| 国产成人永久免费视频| 播播开心激情网| 天天色综合三| 国产免费的野战视频| 98pao强力打造高清免费| 男男浪荡双性受hplay| 一级特黄色毛片免费看| 特黄一级黄色片| 七月色婷婷| 国内真实实拍伦视频在线观看 | 性xxxx奶大欧美高清| 一区二区三区四区在线| 狠狠色噜噜噜噜狠狠狠狠狠狠奇米| 伊人久久影院大香线蕉| 色www永久免费视频| 两性午夜欧美高清做性| 丁香婷婷网| 免费中国jlzzjlzz在线播放| 欧美性黑人极品hd网站| 国产成人乱码一区二区三区| 台湾香港澳门三级在线| 久久精品综合网| 窝窝午夜看片| 2019天天射干| 最新久久免费视频| 色a在线| 国产一级片免费看| 视频在线免费| 中文字幕亚洲色图| 亚洲国产精品综合久久久| 欧美zooz人禽交免费观看| 2021韩国理论片ok电影天堂| 国产网站大全| 不卡视频一区| 欧美区在线播放|