日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32 HardFault_Handler调试及问题查找方法——飞思卡尔

發布時間:2024/3/12 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32 HardFault_Handler调试及问题查找方法——飞思卡尔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看到有朋友遇到Hard Fault 異常錯誤,特地找到一篇飛思卡爾工程師寫的一片經驗帖,定位Hard Fault 異常。

Kinetis MCU?采用?Cortex-M4?的內核,該內核的?Fault?異常可以捕獲非法的內存訪問和非法的編程行為。Fault異常能夠檢測到以下幾類非法行為:

·? ?? ???總線 Fault:??在取址、數據讀/寫、取中斷變量、進入/退出中斷時寄存器堆棧操作(入棧/出棧)時檢測到內存訪問錯誤。

·? ?? ???存儲器管理 Fault: 檢測到內存訪問違反了內存保護單元(MPU, MemoryProtection Unit)定義的區域。

·? ?? ???用法 Fault:??檢測到未定義的指令異常,未對其的多重加載/存儲內存訪問。如果使能相應控制位,還可以檢測出除數為零以及其他未對齊的內存訪問。

?

·? ?? ???硬 Fault:??如果上述的總線 Fault、存儲器管理 Fault、用法 Fault 的處理程序不能被執行(例如禁能了總線 Fault、存儲器管理Fault、用法Fault 的異常或者在這些異常處理程序中又出現了新的Fault)則觸發硬Fault。

? ?? ??在?MQX?操作系統啟動的時候會安裝上默認的異常中斷處理函數,當系統異常時會產生一個“unexpected”中斷,內核就會自動調用異常處理函數,同時也將運行用戶自定義的處理函數,來實現特殊故障的定位方法。

? ?? ??默認情況下,MQX把出現異常的任務掛起,避免故障進一步擴大。通過TAD?任務感知調試插件的Task summary?功能,我們可以觀察到出現異常的任務情況。

開發人員在調試期間,需要弄清楚系統異常觸發了哪類Fault,由什么原因觸發了Fault 以及定位觸發Fault 的代碼。在這種情況下,可以利用自定義的Fault 中斷處理程序來分析

Fault 出錯原因。

? ???為了解釋所述的 Fault 中斷處理程序的原理,這里重述一下當系統產生異常時 MCU 的處理過程:

·? ?? ???有一個壓棧的過程,若產生異常時使用 PSP(進程棧指針),就壓入到 PSP 中,若產生異常時使用MSP(主棧指針),就壓入MSP 中。

·? ?? ???會根據處理器的模式和使用的堆棧,設置 LR 的值(當然設置完的LR 的值再壓棧)。

·? ?? ???異常保存,硬件自動把 8 個寄存器的值壓入堆棧(8 個寄存器依次為 xPSR、PC、LR、R12以及 R3~R0)。如果異常發生時,當前的代碼正在使用PSP,則上面8 個寄存器壓入PSP; 否則就壓入MSP。

? ?? ? 當系統產生異常時,我們需要兩個關鍵寄存器值,一個是 PC ,一個是 LR (鏈接寄存器),通過 LR找到相應的堆棧,再通過堆棧找到觸發異常的PC 值。將產生異常時壓入棧的 PC 值取出,并與反匯編的代碼對比就能得到哪條指令產生了異常。

? ?? ???這里解釋一下關于 LR 寄存器的工作原理。如上所述,當 Cortex-M4 處理器接受了一個異常后,寄存器組中的一些寄存器值會被自動壓入當前棧空間里,這其中就包括鏈接寄存器(LR )。這時的 LR 會被更新為異常返回時需要使用的特殊值(EXC_RETURN)。關于

EXC_RETURN 的定義如下,其為 32 位數值,高 28 位置 1,第 0 位到第三位則提供了異常返回機制所需的信息,如下表所示。可見其中第 2 位標示著進入異常前使用的棧是 MSP還是PSP。在異常處理過程結束時,MCU 需要根據該值來分配 SP 的值。這也是本方法中用來判斷所使用堆棧的原理,其實現方法可以從后面_init_hardfault_isr 中看到。

? ?另外,我們可以利用 MQX 的控制臺串口輸出Fault 異常信息來幫助調試。編寫Fault 處理程序時,將啟動代碼中默認的Fault 處理程序跟換成自己需要的Fault 處理程序。需要注意的是,由于是在中斷中進行打印輸出,MQX的控制臺串口只能使用POLL 輪詢模式的驅動,不能使用中斷模式的驅動。

? ???用戶可以編寫自定義的硬 Fault 處理程序_int_hardfault_isr,修改 MQX 的中斷向量定義vector.c,把里面的DEFAULT_VECTOR 代碼段換成下面的代碼。當系統出現硬Fault 異常時,將會調用自定義的Fault 處理_int_hardfault_isr函數。在這個函數,我們可以通過StackTrace-back 回溯出現問題的代碼。

我們可以在_int_hardfault_isr 函數里將出現異常時的寄存器、堆棧、狀態寄存器等信息打印出來。如果系統出現異常時,一般情況都會通過串口控制臺打印出LR,PC的值。然后根據編譯器生成的map 文件,找到出現問題的具體函數。

? ???從上圖的串口輸出我們可以看到 PC 和 LR 寄存器值,PC 的值為 0x56c6,我們根據匯編代碼可以找到出現問題的指令。從而大大縮小了查找出現問題的范圍,可以幫助開發人員快速定位問題的根本原因。


附錄Fault異常中斷處理代碼:

  • // hard fault handler in C,

  • // with stack frame location as input parameter

  • void hard_fault_handler_c (unsigned int * hardfault_args)

  • {

  • ??unsigned int stacked_r0;

  • ??unsigned int stacked_r1;

  • ??unsigned int stacked_r2;

  • ??unsigned int stacked_r3;

  • ??unsigned int stacked_r12;

  • ??unsigned int stacked_lr;

  • ??unsigned int stacked_pc;

  • ??unsigned int stacked_psr;

  • ?

  • ??stacked_r0 = ((unsigned long)hardfault_args[0]);

  • ??stacked_r1 = ((unsigned long)hardfault_args[1]);

  • ??stacked_r2 = ((unsigned long)hardfault_args[2]);

  • ??stacked_r3 = ((unsigned long)hardfault_args[3]);

  • ?

  • ??stacked_r12 = ((unsigned long)hardfault_args[4]);

  • ??stacked_lr = ((unsigned long)hardfault_args[5]);

  • ??stacked_pc = ((unsigned long)hardfault_args[6]);

  • ??stacked_psr = ((unsigned long) hardfault_args[7]);

  • ?

  • ??printf ("\n\n[Hard faulthandler - all numbers in hex]\n");

  • ??printf ("R0 = %x\n",stacked_r0);

  • ??printf ("R1 = %x\n",stacked_r1);

  • ??printf ("R2 = %x\n",stacked_r2);

  • ??printf ("R3 = %x\n",stacked_r3);

  • ??printf ("R12 = %x\n",stacked_r12);

  • ??printf ("LR [R14] = %x??subroutine call return address\n",stacked_lr);

  • ??printf ("PC [R15] = %x??program counter\n", stacked_pc);

  • ??printf ("PSR = %x\n",stacked_psr);

  • ?

  • ??/******************* Add yourdebug trace here ***********************/

  • ??_int_kernel_isr();

  • }

  • ?

  • /* hard fault interrupt handler */

  • void _int_hardfault_isr( )

  • {

  • ??__asm("TST LR, #4");

  • ??__asm("ITE EQ");

  • ??__asm("MRSEQ R0,MSP");

  • ??__asm("MRSNE R0,PSP");

  • ??__asm("Bhard_fault_handler_c");

  • }

  • 復制代碼

    ?

    總結

    以上是生活随笔為你收集整理的stm32 HardFault_Handler调试及问题查找方法——飞思卡尔的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 最新中文字幕一区 | 国产精品18久久久久久无码 | 精品久久久久久亚洲 | 国产精品成人一区二区 | 中文字幕av久久 | 91网站大全 | 自拍视频第一页 | 中文字幕第一页在线播放 | 超碰干| 亚洲aav| 超在线视频 | 成人免费高清在线播放 | 最好看的2019年中文视频 | 国内福利视频 | 午夜生活片 | 九九视屏 | 日本少妇18p | 日韩三级理论 | 红桃成人网| www.com国产| 91精品一区二区 | 成人激情四射网 | 日韩久久免费视频 | 日韩一区二区三免费高清在线观看 | 青青久视频 | 91精品国产综合久久久蜜臀 | 神马影院一区二区三区 | 国产亚洲欧美精品久久久www | 成人影视在线播放 | 国产视频在线观看免费 | 亚洲国产精品成人综合色在线婷婷 | 一区二区三区四区精品视频 | 不卡一区在线观看 | 成人免费视频免费观看 | 天天做夜夜爽 | 免费观看的av网站 | 自拍偷拍欧美日韩 | 国产三级一区二区三区 | 黑人巨大精品欧美一区免费视频 | 国产精品无码毛片 | 亚洲欧美自拍另类 | 久久精品97 | 久久视频网 | 欧美日韩精| 午夜av导航 | av网天堂 | 久久人人爽人人爽人人片av高清 | 第一页在线视频 | 少妇在军营h文高辣 | 秋霞7777鲁丝伊人久久影院 | 99国产精品99久久久久久 | 免费观看亚洲 | 亚洲一区二区视频在线观看 | 久久久久综合网 | 国产一区日韩一区 | 午夜视频色 | 日本午夜大片 | 国产成人精品一区在线播放 | 国产美女www| 无法忍受在线观看 | 特大黑人巨交吊性xxxxhd | 欧美一二三区视频 | 成人毛片网站 | 亚洲欧美亚洲 | 我想看一级黄色片 | 欧美成人免费 | 亚洲中文字幕无码爆乳av | 亚日韩在线 | 国产a√| 欧美三区在线观看 | 欧美拍拍 | 国产情侣免费视频 | 公肉吊粗大爽色翁浪妇视频 | 日韩欧美日韩 | 噜噜av| 女人被狂躁c到高潮喷水电影 | 中文字幕少妇 | 国产麻豆剧果冻传媒白晶晶 | 亚洲色偷偷色噜噜狠狠99网 | 亚洲av成人无码久久精品老人 | 黄视频网站在线看 | 午夜看片在线 | 亚洲av日韩av不卡在线观看 | 国产精品丝袜在线观看 | 中文字幕国产日韩 | 男人激烈吮乳吃奶爽文 | 高清无码一区二区在线观看吞精 | 国产精品视频你懂的 | 精品久久久久久无码中文野结衣 | 亚洲色图88| 香蕉视频污在线观看 | 黄色裸体片 | 骚婷婷| 亚洲成人 av | 日韩高清一区 | 人人爱国产 | 色女综合 | 男男做的视频 | 国产无码精品久久久 |