欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

jf_pJlTbmA9 ? 來(lái)源:STM32單片機(jī) ? 作者:STM32單片機(jī) ? 2023-09-18 10:57 ? 次閱讀

1.概述

客戶(hù)在使用 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)龍去脈以及解決方法。

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

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

wKgaomUDzW-ASSFXAAKMO7qO1zU016.png

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

wKgaomUDzXSAKy7hAAIJqOIWXwQ854.png

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

wKgZomUDzXaAfhbqAAFcPh7FuT4672.png

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

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

wKgaomUDzXiAXrhKAAHpxnz5tEs892.png

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

wKgZomUDzXyAA6YsAAH2kOHpX_o908.png

3.問(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é)果。

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

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

wKgaomUDzX6AMKw_AALxznUvPqE621.png

4.總結(jié)

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

來(lái)源:STM32單片機(jī)

審核編輯:湯梓紅

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

    關(guān)注

    6043

    文章

    44623

    瀏覽量

    638833
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3626

    瀏覽量

    129780
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10925

    瀏覽量

    357731
  • MDK
    MDK
    +關(guān)注

    關(guān)注

    4

    文章

    209

    瀏覽量

    32163
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RISC-V對(duì)齊導(dǎo)致問(wèn)題案例

    本文介紹對(duì)齊導(dǎo)致問(wèn)題案例
    的頭像 發(fā)表于 06-08 10:04 ?1857次閱讀
    RISC-V<b class='flag-5'>未</b><b class='flag-5'>對(duì)齊</b>導(dǎo)致問(wèn)題案例

    基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的堆(內(nèi)存池)對(duì)齊導(dǎo)致問(wèn)題的案例分享

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog .?前言 內(nèi)存對(duì)齊訪(fǎng)問(wèn)問(wèn)題這個(gè)已經(jīng)是老生常談的問(wèn)題了, 由于LWIP
    的頭像 發(fā)表于 09-09 08:44 ?1851次閱讀
    基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)-LWIP的堆(內(nèi)存池)<b class='flag-5'>未</b><b class='flag-5'>對(duì)齊</b>導(dǎo)致問(wèn)題的案例分享

    HardFault_Handler異常

    請(qǐng)教各位,最近用MDK5.11編寫(xiě)STM32F103RC的程序,但是卻莫名其妙進(jìn)入HardFault_Handler異常中斷,現(xiàn)在本人完全頭霧水,還請(qǐng)大神指點(diǎn)迷津!
    發(fā)表于 11-07 17:51

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

    復(fù)位之外的任何異常搶占。 HardFault HardFault 是由于在正常操作過(guò)程中或在異常處理過(guò)程中出現(xiàn)錯(cuò)誤而出現(xiàn)的
    發(fā)表于 07-02 15:20

    為什么要進(jìn)行內(nèi)存對(duì)齊操作呢

    地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類(lèi)型的數(shù)據(jù),否則拋出硬件異常。性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。原因在于,為了訪(fǎng)問(wèn)
    發(fā)表于 12-17 06:34

    導(dǎo)致STM32進(jìn)入HardFault異常的原因

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

    ARM處理器是否曾經(jīng)為指令或數(shù)據(jù)訪(fǎng)問(wèn)生成對(duì)齊的突發(fā)

    節(jié))數(shù)據(jù)包與32位邊界對(duì)齊。然后顯示了對(duì)齊的第一個(gè)字節(jié)的突發(fā)示例。我還看到了有關(guān)在突發(fā)寫(xiě)
    發(fā)表于 08-19 15:43

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

    HardFault 異常)。下面是來(lái)自 IAR EW 的錯(cuò)誤圖像。代碼行僅執(zhí)行從個(gè)結(jié)構(gòu)到另一個(gè)結(jié)構(gòu)變量的賦值操作。 誰(shuí)能告訴我們?yōu)槭裁磿?huì)
    發(fā)表于 04-04 07:42

    RISC-V對(duì)齊訪(fǎng)問(wèn)導(dǎo)致問(wèn)題案例

    轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 參考https://mp.weixin.qq.com/s/8wfRFg1XcBsXw5gMq-cKaQ前言 本文以個(gè)實(shí)例,講解RISC-V對(duì)齊訪(fǎng)問(wèn)導(dǎo)致的問(wèn)題.
    發(fā)表于 05-06 19:14

    MRS_關(guān)于HardFault問(wèn)題查找思路

    ,MTVAL=20000ca1。由表可知該案例的報(bào)錯(cuò)原因?yàn)長(zhǎng)oad指令訪(fǎng)存地址對(duì)齊,結(jié)合MTVAL的情況1可知異常時(shí)存儲(chǔ)器訪(fǎng)問(wèn)的地址為0
    發(fā)表于 08-24 10:57

    異常向量表重映射

    異常向量表重映射 向量表是異常產(chǎn)生時(shí)內(nèi)核獲取異常處理函數(shù)入口地址塊連續(xù)內(nèi)存,每一個(gè)
    發(fā)表于 03-26 09:34 ?20次下載

    個(gè)地址對(duì)齊有關(guān)的應(yīng)用異常案例

    也就是說(shuō),基于CortexM3內(nèi)核的芯片,它支持部分指令的非對(duì)齊訪(fǎng)問(wèn),但非對(duì)齊訪(fǎng)問(wèn)要慢于對(duì)齊訪(fǎng)問(wèn)。即非對(duì)齊訪(fǎng)問(wèn)是需要代價(jià)的,訪(fǎng)問(wèn)效率會(huì)受到影響。所以,我們?cè)趹?yīng)用中要盡量遵循
    的頭像 發(fā)表于 02-04 15:20 ?2605次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>跟<b class='flag-5'>地址</b><b class='flag-5'>對(duì)齊</b>有關(guān)的應(yīng)用<b class='flag-5'>異常</b>案例

    解決STM32因字節(jié)對(duì)齊問(wèn)題導(dǎo)致讀寫(xiě)Flash失敗進(jìn)入HardFault的問(wèn)題

    ,獲取升級(jí)包的文件所有結(jié)構(gòu)體采用字節(jié)對(duì)齊,解析升級(jí)包采用指針偏移的方式。進(jìn)入Flash未進(jìn)行擦除操作前的參數(shù)如下:要寫(xiě)入的長(zhǎng)度和地址都是沒(méi)問(wèn)題的,但是buf指針的在RAM中的地址為0
    發(fā)表于 12-02 09:06 ?15次下載
    解決STM32因字節(jié)<b class='flag-5'>對(duì)齊</b>問(wèn)題導(dǎo)致讀寫(xiě)Flash失敗進(jìn)入<b class='flag-5'>HardFault</b>的問(wèn)題

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

    關(guān)鍵詞:地址對(duì)齊,Hardfault,STM32G0 目錄預(yù)覽 1. 概述 2. 問(wèn)題描述與分析 3. 問(wèn)題解決 4. 總結(jié) 1.概述 客戶(hù)在使用 STM32G070 的時(shí)候,KEIL MDK 為
    的頭像 發(fā)表于 02-10 11:05 ?2469次閱讀

    ES32F36xx芯片發(fā)生HardFault異常時(shí)的函數(shù)調(diào)用關(guān)系及問(wèn)題定位

    ES32F36xx芯片發(fā)生HardFault異常時(shí)的函數(shù)調(diào)用關(guān)系及問(wèn)題定位
    的頭像 發(fā)表于 11-06 17:13 ?861次閱讀
    ES32F36xx芯片發(fā)生<b class='flag-5'>HardFault</b><b class='flag-5'>異常</b>時(shí)的函數(shù)調(diào)用關(guān)系及問(wèn)題定位