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

 

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.mzph.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…

生命周期评估(LCA)与SimaPro碳足迹分析

SimaPro提供最新的科学方法和数据库以及丰富的数据&#xff0c;使您可以收集和评估产品和流程的环境绩效。通过这种方式&#xff0c;您可以将改变公司产品生命周期的想法提交给您的同事&#xff0c;以便阐明您的业务未来。 SimaPro软件的特点和功能&#xff1a; 完全控制产品生…

【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:执行 后,马上执行

数据集笔记: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;该程序的很多…

如何通过类似于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等创意设计、视频制作和…

java springboot测试类鉴定虚拟MVC请求 返回内容与预期值是否相同

上文 java springboot测试类鉴定虚拟MVC运行值与预期值是否相同 中 我们验证了它HTTP的返回状态 简单说 校验了他 是否成功的状态 这次 我们来不对得到的内容 我们 直接改写测试类代码如下 package com.example.webdom;import org.junit.jupiter.api.Test; import org.springf…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-3:任务切换)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

使用 css 实现文字单行居右, 换行居左展示

给外层盒子设置居右展示, 子盒子设置居左。 原理是&#xff0c;如果子盒子没有换行&#xff0c;那么子盒子的长度就是内容的长度&#xff0c;它根本没有空间将字体移动居左&#xff0c;父盒子的居左样式就会生效&#xff0c;子盒子就会居左展示。 当子盒子里面的文字换行了&…

在SOLIDWORKS中如何提升保存PDF版本文件的清晰度

随着Solidworks年复一年的不断更新&#xff0c;不仅仅是整个软件的性能上的提升&#xff0c;其在输出文件的功能上也同样在精益求精。 但对于老版本的使用者和希望能让输出文件清晰度更进一步的使用者而言&#xff0c;可能目前我们所能达到的普通文件输出清晰度远远无法达到他们…

这样写Allure生成测试报告,学会直接涨薪5k

Allure是一个开源的测试报告生成框架&#xff0c;提供了测试报告定制化功能&#xff0c;相较于我们之前使用过pytest-html插件生成的html格式的测试报告&#xff0c;通过Allure生成的报告更加规范、清晰、美观。 pytest框架支持使用Allure生成测试报告&#xff0c;接下来让介绍…

SpringBoot整合knife4j生成Api文档

一、介绍 先看效果 ①&#xff1a;Swagger 介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的文档…

Doris-集群部署(四)

创建目录并拷贝编译后的文件 1&#xff09;创建目录并拷贝编译后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02&#xff09;修改可打开文件数&#xff08;每个节点&#x…

oracle数据库巡检常见脚本-系列三

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

TIDB基础

TIDB整个逻辑架构跟MYSQL类似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相当于MYSQL的数据库服务器&#xff0c;区别是MYSQL数据库服务器为单进程的&#xff0c;TIDB集群为分布式多进程的。 数据库&#xff1a;同MYSQL数据库&#xff0c;数据库属于集群&#xff0c;…