棧回溯--在棧里挑出返回地址

?

GNU Arm Embedded Toolchain project files : GNU Arm Embedded Toolchain

arm-none-eabi-addr2line -e F103_Moduel.axf -a -f 08000350 08001d94 0800260c?

匯編中:?

;HardFault_Handler
;                PROC
;                EXPORT  HardFault_Handler          [WEAK]
;                B       .
;                ENDPIMPORT rt_hw_hard_fault_exceptionEXPORT HardFault_Handler
HardFault_Handler    PROC; get current contextTST     lr, #0x04               ; if(!EXC_RETURN[2])ITE     EQMRSEQ   r0, msp                 ; [2]=0 ==> Z=1, get fault context from handler.MRSNE   r0, psp                 ; [2]=1 ==> Z=0, get fault context from thread.STMFD   r0!, {r4 - r11}         ; push r4 - r11 registerSTMFD   r0!, {lr}               ; push exec_return registerTST     lr, #0x04               ; if(!EXC_RETURN[2])ITE     EQMSREQ   msp, r0                 ; [2]=0 ==> Z=1, update stack pointer to MSP.MSRNE   psp, r0                 ; [2]=1 ==> Z=0, update stack pointer to PSP.PUSH    {lr}BL      rt_hw_hard_fault_exceptionPOP     {lr}ORR     lr, lr, #0x04BX      lrENDP

rt_hw_hard_fault_exception代碼 :

#define rt_uint32_t unsigned int
#define uint16_t    unsigned short
struct exception_info
{rt_uint32_t exc_return;rt_uint32_t r4;rt_uint32_t r5;rt_uint32_t r6;rt_uint32_t r7;rt_uint32_t r8;rt_uint32_t r9;rt_uint32_t r10;rt_uint32_t r11;rt_uint32_t r0;rt_uint32_t r1;rt_uint32_t r2;rt_uint32_t r3;rt_uint32_t r12;rt_uint32_t lr;rt_uint32_t pc;rt_uint32_t psr;
};/* check the disassembly instruction is 'BL' or 'BLX' */
static int disassembly_ins_is_bl_blx(rt_uint32_t addr) {uint16_t ins1 = *((uint16_t *)addr);uint16_t ins2 = *((uint16_t *)(addr + 2));#define BL_INS_MASK         0xF800
#define BL_INS_HIGH         0xF800
#define BL_INS_LOW          0xF000
#define BLX_INX_MASK        0xFF00
#define BLX_INX             0x4700if ((ins2 & BL_INS_MASK) == BL_INS_HIGH && (ins1 & BL_INS_MASK) == BL_INS_LOW) {return 1;} else if ((ins2 & BLX_INX_MASK) == BLX_INX) {return 1;} else {return 0;}
}static int is_in_text(unsigned int addr)
{extern int * Image$$ER_IROM1$$Base;extern int * Image$$ER_IROM1$$Length;unsigned int text_start = (unsigned int)&Image$$ER_IROM1$$Base;unsigned int text_len = (unsigned int)&Image$$ER_IROM1$$Length;if ((addr >= text_start) && (addr < text_start + text_len))return 1;elsereturn 0;
}/** fault exception handler*/
void rt_hw_hard_fault_exception(struct exception_info * exception_info)
{unsigned int *app_sp;unsigned int lr;unsigned int pc;int i;app_sp = (unsigned int *)(exception_info + 1);  /* context + 16*4 */printf("psr: 0x%08x\r\n", exception_info->psr);printf("r00: 0x%08x\r\n", exception_info->r0);printf("r01: 0x%08x\r\n", exception_info->r1);printf("r02: 0x%08x\r\n", exception_info->r2);printf("r03: 0x%08x\r\n", exception_info->r3);printf("r04: 0x%08x\r\n", exception_info->r4);printf("r05: 0x%08x\r\n", exception_info->r5);printf("r06: 0x%08x\r\n", exception_info->r6);printf("r07: 0x%08x\r\n", exception_info->r7);printf("r08: 0x%08x\r\n", exception_info->r8);printf("r09: 0x%08x\r\n", exception_info->r9);printf("r10: 0x%08x\r\n", exception_info->r10);printf("r11: 0x%08x\r\n", exception_info->r11);printf("r12: 0x%08x\r\n", exception_info->r12);printf(" lr: 0x%08x\r\n", exception_info->lr);printf(" pc: 0x%08x\r\n", exception_info->pc);#if 0printf("stacks: \r\n");
#elseprintf("use the command to get callback: arm-none-eabi-addr2line -e your.axf -a -f ");printf("%08x ", exception_info->pc);printf("%08x ", exception_info->lr);
#endifi = 0;for (i = 0; i < 1024; ){
#if 0		printf("%08x ", *app_sp);		app_sp++;i++;if (i % 16 == 0)printf("\r\n");
#elselr = *app_sp;app_sp++;i++;/* lr的bit0必定是1, 表示thumb指令集 * lr必定處于代碼段*/if ((lr & 1) && is_in_text(lr)){/* 返回地址前面必定是BL或BLX指令 */pc = (lr & ~1) - 4;if (disassembly_ins_is_bl_blx(pc)){printf("%08x ", pc);}}
#endif}printf("\r\n");while (1);
}

main.c中

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "driver_usart.h"
#include "driver_key.h"
#include <stdio.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ring_buffer test_buffer;static void A(void);
static void B(void);
static int C(int b);static void A(void)
{printf("Enter A()\r\n");B();printf("Exit A()\r\n");
}static void B(void)
{printf("Enter B()\r\n");C(0);printf("Exit B()\r\n");
}static int C(int b)
{//printf("Enter C()\r\n");return 100/b;
}static void D(void)
{	printf("Enter D()\r\n");C(1);printf("Exit D()\r\n");
}void TestDebug(void)
{/* 100ask add *//* 使能除0錯誤* CCR(0xE000ED14)的bit4(DIV_0_TRP)設置為1*/volatile int *CCR = (volatile int *)0xE000ED14;*CCR |= (1<<4);A();D();
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART3_UART_Init();/* USER CODE BEGIN 2 */KEY_GPIO_ReInit();ring_buffer_init(&test_buffer);EnableDebugIRQ();printf("Hello World!\r\n");TestDebug();/* USER CODE END 2 *//* Init scheduler */osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */MX_FREERTOS_Init();/* Start scheduler */osKernelStart();/* We should never get here as control is now taken by the scheduler *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  Period elapsed callback in non blocking mode* @note   This function is called  when TIM8 interrupt took place, inside* HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment* a global variable "uwTick" used as application time base.* @param  htim : TIM handle* @retval None*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* USER CODE BEGIN Callback 0 *//* USER CODE END Callback 0 */if (htim->Instance == TIM8) {HAL_IncTick();}/* USER CODE BEGIN Callback 1 *//* USER CODE END Callback 1 */
}/*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163436.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神命令tree的魅力你get到了嗎?

背景 日常工作中&#xff0c;有時候為了明確表達自己的意思&#xff0c;往往需要輸出對應的目錄層級結構&#xff0c;手動一個個輸入往往顯得不那么高級&#xff0c;效率相對較低&#xff0c;這時候擁有可以一鍵輸出目錄結構并且可以快速轉化為文本的工具就比較方便&#xff0…

工業I/O模塊的功能和應用介紹

在工業領域中&#xff0c;不同的設備常常適配不同的通信協議&#xff0c;不同的協議之間無法直接互通&#xff0c;導致現場實施過程中困難重重。工業io模塊可以將各種現場信號轉化為數字信號&#xff0c;然后傳輸給控制器進行處理&#xff0c;實現不同設備之間的互通&#xff0…

抖音直播招聘報白企業或者人力資源公司怎么做?

抖音直播招聘報白是指進入抖音的白名單&#xff0c;允許在直播間或小視頻中發布招聘或找工作等關鍵詞。否則會斷播、不推流、限流。抖音已成為短視頻流量最大的平臺&#xff0c;但招聘企業數量較少。抖音招聘的優勢在于職位以視頻、直播方式展示&#xff0c;留存聯系方式更加精…

生命周期評估(LCA)與SimaPro碳足跡分析

SimaPro提供最新的科學方法和數據庫以及豐富的數據&#xff0c;使您可以收集和評估產品和流程的環境績效。通過這種方式&#xff0c;您可以將改變公司產品生命周期的想法提交給您的同事&#xff0c;以便闡明您的業務未來。 SimaPro軟件的特點和功能&#xff1a; 完全控制產品生…

delete archivelog all 無法徹底刪除歸檔日志?

1、演示環境 SQL> select * from v$version where rownum<2;BANNER ---------------------------------------------------------------- Oracle Database 10g Release 10.2.0.3.0 - 64bit ProductionSQL> select inst_id,instance_name from gv$instance; -->兩節…

【matlab程序】南海土臺風畫法

【matlab程序】南海土臺風畫法 圖片 往期推薦 圖片 【python海洋專題一】查看數據nc文件的屬性并輸出屬性到txt文件 【python海洋專題二】讀取水深nc文件并水深地形圖 【python海洋專題三】圖像修飾之畫布和坐標軸 【Python海洋專題四】之水深地圖圖像修飾 【Python海洋專…

2020年09月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 執行下面程序,屏幕上最多會看到多少個蘋果? A:10個 B:11個 C:1個 D:無法確定 答案:B 第2題 關于下面程序,說法正確的是 ? A:執行 后,馬上執行

機器學習時候必須要分為訓練集、驗證集和測試集嘛

在機器學習中&#xff0c;為了準確評估模型的性能和找到最佳的超參數配置&#xff0c;通常將數據集劃分為訓練集、驗證集和測試集。在這種情況下&#xff0c;驗證集用于調參和模型選擇&#xff0c;而測試集則用于最終的模型評估。 具體流程如下&#xff1a; 劃分數據集&#x…

python分段函數

在Python中&#xff0c;你可以使用if-else語句來實現分段函數。以下是一個簡單的例子&#xff1a; def piecewise_function(x):if x < 0:return 0elif 0 < x < 2:return x ** 2else:return 4這個函數定義了一個分段函數&#xff0c;當x小于0時&#xff0c;函數值為0&…

數據集筆記:Pems 自行下載數據+python處理

以下載District 4的各station每5分鐘的車速為例 1 PEMS網站下載數據 點擊紅色的 選擇需要的station和區域&#xff0c;點擊search&#xff0c;就是對應的數據&#xff0c;點擊數據即可下載 &#xff08;這個是station每5分鐘的速度數據&#xff09; 2 pems 速度數據 2.1 每一…

DLL劫持漏洞

以下是自己學習時做的一些筆記&#xff0c;希望對各位有所幫助 DLL劫持漏洞 為什么程序中會有dll的存在 對于 Windows 操作系統&#xff0c;操作系統的大部分功能都由 DLL 提供。 另外&#xff0c;當您在這些 Windows 操作系統之一上運行某一程序時&#xff0c;該程序的很多…

paddle ocr開啟mkldnn加速后圖片識別精度下降

背景 使用ocr_system調用微調模型時發現部分圖片在設置enable_mkldnnTrue后出現識別精度下降問題 環境&#xff1a; paddle2.5.1 paddlehub2.3.1 python3.8.6 解決方案 tools\infer\utility.py文件中 line 269行左右&#xff0c; 在代碼config.delete_pass("matmul_t…

【華為OD題庫-035】數據最節約的備份方法-java

題目 有若干個文件&#xff0c;使用刻錄光盤的方式進行備份&#xff0c;假設每張光盤的容量是500MB.求使用光盤最少的文件分布方式。所有文件的大小都是整數MB&#xff0c;且不超過500MB:文件不能分割、分卷打包 輸入描述: 一組文件大小的數據 輸出描述: 使用光盤的數量 補充說…

如何通過類似于Android adb install apk 命令安裝三方Harmony Hap包

安裝命令 hdc install xxx.hapOpenHarmony設備安裝Hap應用的五種方式 https://www.51cto.com/article/762223.htmlhttps://www.51cto.com/article/762223.html DevEco Studio 3.1為例新建個項目&#xff0c;點擊File->Project Structure 進入簽名頁面然后點擊Sign in登錄華…

Adobe 家族系列download

adobe 前言 Adobe公司的產品線中擁有多個家族桶&#xff0c;下面是Adobe全家桶產品的功能介紹&#xff1a; Creative Cloud&#xff08;創意云&#xff09;&#xff1a;包含Photoshop、Illustrator、InDesign、Premiere Pro、After Effects、Lightroom等創意設計、視頻制作和…

計算機體系結構習題及解答

Exercise For the 5-stage pipeline (RR and RW take half a cycle) For the following pairs of instructions, how many stalls will the 2nd instruction experience (with and without bypassing)? 1. ADD R3 ?R1R2 ADD R5 ? R3R4 Answer&#xff1a;0 stall wi…

java springboot測試類鑒定虛擬MVC請求 返回內容與預期值是否相同

上文 java springboot測試類鑒定虛擬MVC運行值與預期值是否相同 中 我們驗證了它HTTP的返回狀態 簡單說 校驗了他 是否成功的狀態 這次 我們來不對得到的內容 我們 直接改寫測試類代碼如下 package com.example.webdom;import org.junit.jupiter.api.Test; import org.springf…

【實驗筆記】C語言實驗——超長正整數的減法運算

[問題描述] 編寫程序實現兩個超長正整數(每個最長80位數字)的減法運算。 [輸入形式] 從鍵盤讀入兩個整數&#xff0c;要考慮輸入高位可能為0的情況(如00083) 1.第一行是超長正整數A; 2.第二行是超長正整數B; [輸出形式] 輸出只有一行&#xff0c;是長整數A減去長整數B的運…

FreeRTOS學習之路,以STM32F103C8T6為實驗MCU(2-3:任務切換)

學習之路主要為FreeRTOS操作系統在STM32F103&#xff08;STM32F103C8T6&#xff09;上的運用&#xff0c;采用的是標準庫編程的方式&#xff0c;使用的IDE為KEIL5。 注意&#xff01;&#xff01;&#xff01;本學習之路可以通過購買STM32最小系統板以及部分配件的方式進行學習…