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

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

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

3天內不再提示

ARM Cortex-M異常-HardFault INVPC置1解決方法

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-10-16 09:40 ? 次閱讀

CPUSTM32F429IGT6

對于其他的stm32芯片或者其他ARM Cortex-M芯片,其實解決方法都相通。建議先完整閱讀了本文之后,再對照著你所遇到問題的現象進行調試。

1.基礎知識

在ARM Cortex-M系列處理器中,有若干個系統異常專用于 fault 處理。CM3 中的 Faults 可分為以下幾類:

(1).總線 faults;

(2).存儲器管理 faults;

(3).用法 faults;

(4).硬 fault;

1.1.總線 faults

當 AHB 接口上正在傳送數據時,如果回復了一個錯誤信號(error response),則會產生總線faults,產生的場合可以是:

(1).取指,通常被稱作“預取流產”(prefetch abort);

(2).數據讀/寫,通常被稱作“數據流產”(data abort);

在 CM3 中,執行如下動作時,如果地址有誤,亦會觸發總線異常:

(1).中斷處理起始階段的堆棧 PUSH 動作。此時若發生總線 fault,則稱為“入棧錯誤”;

(2).中斷處理收尾階段的堆棧 POP 動作。此時若發生總線 fault,則稱為“出棧錯誤”;

(3).在處理器啟動中斷服務序列(sequence)后讀取向量時。這是一種極度罕見的特殊情況,被歸類為硬 fault。

總線 fault 狀態寄存器(BFSR),地址:0xE000_ED29,BFSR的各個位的定義如下:

8a91f8fe-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_14-13-31

1.2.存儲器管理 faults

存儲器管理 faults 多與 MPU 有關,其誘因常常是某次訪問觸犯了 MPU 設置的保護規范。另外,某些非法訪問,例如,在不可執行的存儲器區域試圖取指,也會觸發一個 MemManage fault,而且在這種場合下,即使沒有 MPU 也會觸發 MemMange fault。MemManage faults 的常見誘因如下所示:

(1).訪問了所有 MPU regions 覆蓋范圍之外的地址;

(2).訪問了沒有存儲器與之對應的空地址;

(3).往只讀 region 寫數據;

(4).用戶級下訪問了只允許在特權級下訪問的地址;

存儲器管理 fault 狀態寄存器(MFSR),地址:0xE000_ED28,MFSR的各個位的定義如下:

8ab019ce-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_14-19-19

1.3.用法 faults

用法 faults 發生的場合可以是:

(1).執行了協處理器指令。Cortex-M3 本身并不支持協處理器,但是通過 fault 異常機制,可以建立一套“軟件模擬”的機制,來執行一段程序模擬協處理器的功能,從而可以方便地在其它 Cortex 處理器間移植。

(2).執行了未定義的指令。同上一點的道理,亦可以軟件模擬未定義指令的功能。

(3).嘗試進入 ARM 狀態。因為 CM3 不支持 ARM 狀態,所以用法 fault 會在切換時產生。軟件可以利用此機制來測試某處理器是否支持 ARM 狀態。

(4).無效的中斷返回(LR 中包含了無效/錯誤的值);

(5).使用多重加載/存儲指令時,地址沒有對齊。

另外,如果需要嚴格要求程序的質量,還可以讓 CM3 在遇到除數為零的時候,以及遇到未對齊訪問的時候也產生用法 fault。在 NVIC 中有兩個控制位分別與它們對應。通過設置這兩個控制位,就可以激活它們。

用法 fault 狀態寄存器(UFSR),地址:0xE000_ED2A,UFSR的各個位的定義如下:

8ad56bac-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_14-24-49

1.4.硬 fault

硬 fault 是上文討論的總線 fault、存儲器管理 fault 以及用法 fault 上訪的結果。如果這些 fault 的服務例程無法執行,它們就會成為“硬傷” ——上訪( escalation)成硬 fault。另外,在取向量(異常處理時對異常向量表的讀?。r產生的總線 fault 也按硬 fault 處理。在 NVIC中有一個硬 fault 狀態寄存器(HFSR),它指出產生硬 fault 的原因。如果不是由于取向量造成的,則硬 fault 服務例程必須檢查其它的 fault 狀態寄存器,以最終決定是誰上訪的。

硬 fault 狀態寄存器(HFSR),地址:0xE000_ED2C,HFSR的各個位的定義如下:

8af02898-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_14-29-38

2.UsageFault INVPC置1解決過程

最近在使用RTOS增加DMA驅動時,在對內存到設備和設備到內存的DMA傳輸測試時,出現了UsageFault,并且UFSR中的INVPC置1了。最開始,單獨測試DMA發送是沒有問題的,但是DMA發送和接收一起測試時,就會出現UsageFault(INVPC置1)。這個異常不太好定位出現問題的具體位置,因此就檢查DMA驅動,并且逐步調試吧。最終,DMA驅動檢查和修改好了,仍然出現UsageFault,實在沒法了,還是從為什么會出現UsageFault(INVPC置1)開始分析吧。

2.1.出現UsageFault(INVPC置1)的原因

如果LR中的EXC_RETURN不是合法的值(合法值見下圖,包括企圖返回ARM狀態),則引起用法fault。如果用法fault被除能,也上訪成硬fault。此時,用法Fault狀態寄存器(UFSR,地址:0xE000_ED2A)中的INVPC位(位偏移:2),或者是INVSTATE位(位偏移:1)置位。

8b0478de-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_15-13-23

上面就是出現該異常的文字分析了。

2.2.UsageFault(INVPC置1)的解決過程

因為該異常是異常響應期間才可能出現的異常(<> 9.8節介紹了下,在9.8.4節進行文字說明),因此,只要在異?;蛑袛嗟姆祷靥幋驍帱c,執行下一步就有可能進入UsageFault異常。(當然了這個方法,是比較笨的,不過在縮小了異常出現的范圍之后,可以在每次異?;蛑袛嗟姆祷靥幋驍帱c,然后執行下一步,就有可能進入UsageFault異常)

我這里是每次開始DMA測試之后,就進入UsageFault異常,并且我的系統中目前就打開了SysTick,PendSV,DMA1_STREAM5,DMA1_STREAM6,NMI,HardFault,MemFault,BusFault,UsageFault這些異常和中斷。因此我在開始DMA測試的時候打一個斷點,在程序運行到DMA測試開始的斷點處時,再在DMA1_STREAM5,DMA1_STREAM6,NMI,HardFault,MemFault,BusFault,UsageFault這些函數的入口打斷點,在PendSV的返回處打斷點,SysTick就暫時先不管。然后全力運行,發現每次都會在PendSV的異常返回斷點處停留(因為任務切換嘛)總共在PendSV的斷點處停留了大概7到8次,就進入到了UsageFault。

有了上面步驟的鋪墊,先去除中斷和異常中的斷點,還是先在DMA測試開始處打斷點,等運行到DMA測試開始處,再在上述的中斷和異常相關位置打斷點。接下來我就慢慢的調試,在開始DMA測試之后,全速運行,在退出PendSV異常時,執行單步運行到下一步,重復7到8次,從PendSV就進入了UsageFault,在這7到8次中,我看在退出PendSV時,LR寄存器中的值都是0xFFFFFFFD,是合法的啊,當時仔細一想,有可能是退出異常時硬件再將堆棧中的PC賦值給PC時出問題,導致進入了UsageFault。果不其然,在PenSV退出之前,我查看每個PSP(0xFFFFFFFD:返回線程模式,并使用線程堆棧)對應內存數值,能夠正常退出PendSV的寄存器和PSP堆棧內容如下圖所示:

8b177ca4-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_16-38-20

8b23d8e6-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_16-43-28

進入UsageFault異常之前的寄存器和PSP堆棧內容如下圖所示:

8b3b8dc4-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_16-45-35

8b4808ec-6a69-11ee-939d-92fbcf53809c.png

Snipaste_2020-12-11_16-47-17

此處堆棧中的內容,明顯的0x20003D94堆棧中的PC值是有問題的,我的程序是燒寫到flash中的PC地址應該是08xxxxxx,然而現在堆棧中的PC地址是0x20003DA8,這個地址是SRAM中的地址,SRAM存儲的數據而不是代碼,出現這個問題的原因,猜想一下,應該就是任務堆棧溢出導致,當我增加任務堆棧的大小之后,哈哈,程序正常運行,世界是如此美好。

3.調試小結

3.1.解決過程小結

其實上面的步驟2,是我自己的一個調試解決問題的過程,這里給大家提供一個比較直接的解決方式。在開始運行程序之前,直接在UsageFault異常入口函數中打一個斷點,然后全速運行程序,等程序停止在UsageFault異常函數的斷點處時,需要注意以下幾點:

(1).如果LR是合法值,那么根據LR判斷退出異常時使用的堆棧,然后在Memory查看窗口中,查看堆棧中R0,R1,R2,R3,R12,LR,PC,xPSR這些寄存器的值,根據這些寄存器的值,判斷是否是堆棧溢出導致該異常發生;如果不是堆棧溢出導致該異常發生,那么就要根據PC值,在匯編窗口中跳轉到PC值對應的代碼處,分析導致異常發生的原因;

(2).如果LR不是合法值,就要分析下你的代碼中,有哪些地方修改過LR的值,確保修改的值要是合法的。

3.2.關于UsageFault 如何才能讓INVPC置1

(1).在退出異常或中斷時,執行BX LR時,LR的值是非法的,此時就會觸發UsageFault異常,并且INVPC置1。

(2).在退出異?;蛑袛鄷r,執行BX LR時,LR的值是合法的,但是退出異常之后要使用的堆棧中,堆棧里面的PC值是有問題的,此時就有可能觸發UsageFault異常,并且INVPC置1。

對于上面的兩點的模擬其實也比較好做,在PendSV或者其他異常的退出的地方打一個斷點,然后手動修改LR或者堆棧中PC的值,就能觸發UsageFault異常,并且INVPC置1。這里注意一下,修改堆棧中PC的值,我這里測試時候,設置PC值為其他值可能引起其他的異常,貌似修改PC的值為RAM中數據區的地址才會出現該異常,不太清楚為什么會這樣,可能是數據區是沒有執行代碼的權限,因此出異常吧,不太確定,有知道的朋友,歡迎留言講解。








審核編輯:劉清

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

    關注

    134

    文章

    9121

    瀏覽量

    368231
  • 存儲器
    +關注

    關注

    38

    文章

    7518

    瀏覽量

    164076
  • 中斷處理
    +關注

    關注

    0

    文章

    94

    瀏覽量

    10990
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29788
  • STM32芯片
    +關注

    關注

    0

    文章

    38

    瀏覽量

    4402

原文標題:ARM Cortex-M 異常-HardFault(UsageFault) INVPC置1解決過程

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何使用Ozone分析Cortex-M異常

    Ozone可以幫助用戶快速分析和查找導致CPU故障的軟件bug。本文解釋如何使用Ozone的調試功能,深入了解Cortex-M架構上的這些錯誤。
    的頭像 發表于 11-29 11:14 ?832次閱讀
    如何使用Ozone分析<b class='flag-5'>Cortex-M</b><b class='flag-5'>異常</b>

    【轉載】快速追蹤和定位產生HardFault原因的方法

    AN0028—快速追蹤和定位產生HardFault原因的方法概述在使用ARM Cortex-M 系列 MCU時(如AT32 MCU),有時會出現程序運行
    發表于 08-17 09:44

    ARM Cortex-M處理器詳解 精選資料分享

    Cortex-M 系列處理器的指令集和高級中斷處理能力,以及 SoC系統級特性,調試和追蹤功能和性能的比較?! ?b class='flag-5'>1、簡介  今天, ARM Cortex-M 處理器家族有8款處理器成員
    發表于 07-16 07:57

    ARM Cortex-M堆棧機制介紹

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M堆棧機制。  今天給大家分享的這篇依舊是2016年之前痞子衡寫的技術文檔,花了點時間重新編排了一下
    發表于 12-16 06:26

    ARM Cortex-M內核的相關資料推薦

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M功能模塊,不過側重點是三款安全特性處理器。  ARM Cortex-M處理器家族發展至今(2
    發表于 12-27 07:21

    ARM cortex-M上出現HardFault后如何排查呢

    ARM cortex-M上面的fault想必大家都不陌生,我相信還沒有誰從來沒有出現過fault。但出現fault后如何排查,相信很多人都是一籌莫展。在我的項目中加了一些代碼,Fault 后可以打印
    發表于 06-27 14:35

    如何使用Ozone分析Cortex-M故障?

    錯誤的存儲指令。總結Cortex-M處理器異常包含:(1)HardFault異常,是缺省異常,固
    發表于 09-23 11:26

    ARM Cortex-M 系列微控制器(ST)

    ARM Cortex-M 系列微控制器(ST) 意法半導體(ST)宣布在基于ARM Cortex-M系列處理器內核的微控制器研發項目上取得突破,推出全球業內首款采用90nm技術嵌入式
    發表于 11-02 09:29 ?958次閱讀

    ARM白皮書】ARM Cortex-M處理器入門

    ARM Cortex-M處理器家族現在有8款處理器成員。在本文中,會比較Cortex-M系列處理器之間的產品特性,重點講述如何根據產品應用選擇正確的Cortex-M處理器。本文中會詳細
    發表于 04-20 15:34 ?39次下載

    傳統的單片機和ARM較量 助推MCU踏上高端Cortex-M市場

    據有關市場調研機構稱,基于ARM Cortex-M內核的MCU在2010年創紀錄地實現了100%的出貨量增長。而整個MCU市場才增長了37%。MCU市場的增長也幾乎是來自于ARM Cortex
    發表于 04-28 10:00 ?1630次閱讀

    Atmel Studio 6軟件中如何調試ARM Cortex-M

    Atmel Studio 6軟件中如何調試ARM Cortex-M
    的頭像 發表于 07-04 10:49 ?4262次閱讀

    米爾科技Cortex-M Prototyping System +介紹

    ARM? Cortex?-M原型系統 MPS2+,為Cortex-M 系列微處理器設計的原型驗證評估系統,包含最新的Cortex-M7 及
    的頭像 發表于 11-14 10:45 ?1963次閱讀
    米爾科技<b class='flag-5'>Cortex-M</b> Prototyping System +介紹

    Cortex-MCortex-A認識ARM處理器

    Cortex-MCortex-A認識ARM處理器
    的頭像 發表于 03-08 11:34 ?3495次閱讀

    分析ARM Cortex-M內核復位啟動過程

    ARM Cortex-M內核的復位啟動過程也被稱為復位序列(Reset sequence),下面就來簡要總結分析下這一過程。
    的頭像 發表于 03-20 09:58 ?2472次閱讀

    Cortex-M 內核中斷/異常系統、中斷優先級/嵌套 詳解

    Cortex-M 內核中斷/異常系統、中斷優先級/嵌套 詳解
    的頭像 發表于 09-27 15:29 ?2359次閱讀
    <b class='flag-5'>Cortex-M</b> 內核中斷/<b class='flag-5'>異常</b>系統、中斷優先級/嵌套 詳解
    主站蜘蛛池模板: 亚洲色图2| 免费一级毛片在线播放| 人人做人人干| 国模谢心2013.05.06私拍| 四虎a456tncom| 日本高清视频不卡| 淫五月| 手机在线视频观看| 国产caob| 久久精品免费观看视频| 色丁香在线视频| 亚洲综合色一区二区三区小说| 1024 cc香蕉在线观看看中文| 乱码精品一区二区三区| 夜夜爽毛片| 成 年 人 视频在线播放| 久青草视频免费视频播放线路1| 四虎海外在线永久免费看| 日韩毛片免费在线观看| 特别毛片| 天堂电影免费在线观看| 一级黄免费| 四虎a456tncom| 毛片一级黄色| 可以免费观看的黄色网址| 国产一卡二卡3卡4卡四卡在线 | 九九热国产| 日本综合在线| 在线观看视频免费| 国产在播放一区| 黄免费看| 色天天综合| 欧美一区二区三区四区在线观看| 天天更新影院| 免费网站成人亚洲| 巨乳色网址| 亚洲午夜网| 日本人69xxxxxxx69| 中文字幕一区二区三区精彩视频| 国产叼嘿视频网站在线观看 | 91综合在线|