Cortex-M7进入异常中断分析

使用cmbacktrace库,其支持M3,4,7。

1、串口输出异常信息

#define cmb_println(...)    Debug_Printf(__VA_ARGS__)//cmb_println处理可变参数和格式化字符串
int Debug_Printf(const char *fmt, ...) {char buffer[DEBUG_TxBUFLEN];INT16U n;va_list args;va_start(args, fmt);int len = vsnprintf(buffer, sizeof(buffer), fmt, args);va_end(args);for ( n = 0; n < len; n++ )  WriteDebugTxBuffer( buffer[n] );return len;
}//串口查询方式发送,被cm_backtrace_fault调用
void UartDbg_CheckSend(void)
{
#if 1INT32U status;if ( DebugBuf.PtrTxHead == DebugBuf.PtrTxTail ) return;status = LPUART_GetStatusFlags( DEBUG_SIO_BASE );if ( status & kLPUART_TxDataRegEmptyFlag ){LPUART_WriteByte( DEBUG_SIO_BASE, DebugBuf.TxBuffer[ DebugBuf.PtrTxTail ] );++DebugBuf.PtrTxTail;if ( DebugBuf.PtrTxTail >= DEBUG_TxBUFLEN ) DebugBuf.PtrTxTail = 0;}
#endif
}/*** backtrace for fault* @note only call once** @param fault_handler_lr the LR register value on fault handler* @param fault_handler_sp the stack pointer on fault handler*/
void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) {uint32_t stack_pointer = fault_handler_sp, saved_regs_addr = stack_pointer, tcb_stack_pointer = 0;const char *regs_name[] = { "R0 ", "R1 ", "R2 ", "R3 ", "R12", "LR ", "PC ", "PSR" };#ifdef CMB_USING_DUMP_STACK_INFOuint32_t stack_start_addr = main_stack_start_addr;size_t stack_size = main_stack_size;
#endifCMB_ASSERT(init_ok);/* only call once */CMB_ASSERT(!on_fault);on_fault = true;cmb_println(" ");cm_backtrace_firmware_info();#ifdef CMB_USING_OS_PLATFORMon_thread_before_fault = fault_handler_lr & (1UL << 2);/* check which stack was used before (MSP or PSP) */if (on_thread_before_fault) {cmb_println(print_info[PRINT_FAULT_ON_THREAD], get_cur_thread_name() != NULL ? get_cur_thread_name() : "NO_NAME");saved_regs_addr = stack_pointer = cmb_get_psp();#ifdef CMB_USING_DUMP_STACK_INFOget_cur_thread_stack_info(&tcb_stack_pointer, &stack_start_addr, &stack_size);
#endif /* CMB_USING_DUMP_STACK_INFO */} else {cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);}
#else/* bare metal(no OS) environment */cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
#endif /* CMB_USING_OS_PLATFORM *//* delete saved R0~R3, R12, LR,PC,xPSR registers space */stack_pointer += sizeof(size_t) * 8;#if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) || \(CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M33)stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer);
#endif /* (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) */#ifdef CMB_USING_DUMP_STACK_INFO/* check stack overflow */if (stack_pointer < stack_start_addr || stack_pointer > stack_start_addr + stack_size) {cmb_println("stack_pointer: 0x%08x, stack_start_addr: 0x%08x, stack_end_addr: 0x%08x", stack_pointer, stack_start_addr,stack_start_addr + stack_size);stack_is_overflow = true;
#if (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_RTT)if (on_thread_before_fault) {/* change the stack start adder to TCB->sp when stack is overflow  */stack_pointer = tcb_stack_pointer;}
#endif}/* dump stack information */dump_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
#endif /* CMB_USING_DUMP_STACK_INFO */{/* dump register */cmb_println(print_info[PRINT_REGS_TITLE]);regs.saved.r0        = ((uint32_t *)saved_regs_addr)[0];  // Register R0regs.saved.r1        = ((uint32_t *)saved_regs_addr)[1];  // Register R1regs.saved.r2        = ((uint32_t *)saved_regs_addr)[2];  // Register R2regs.saved.r3        = ((uint32_t *)saved_regs_addr)[3];  // Register R3regs.saved.r12       = ((uint32_t *)saved_regs_addr)[4];  // Register R12regs.saved.lr        = ((uint32_t *)saved_regs_addr)[5];  // Link register LRregs.saved.pc        = ((uint32_t *)saved_regs_addr)[6];  // Program counter PCregs.saved.psr.value = ((uint32_t *)saved_regs_addr)[7];  // Program status word PSRcmb_println("  %s: %08x  %s: %08x  %s: %08x  %s: %08x", regs_name[0], regs.saved.r0,regs_name[1], regs.saved.r1,regs_name[2], regs.saved.r2,regs_name[3], regs.saved.r3);cmb_println("  %s: %08x  %s: %08x  %s: %08x  %s: %08x", regs_name[4], regs.saved.r12,regs_name[5], regs.saved.lr,regs_name[6], regs.saved.pc,regs_name[7], regs.saved.psr.value);cmb_println("==============================================================");}/* the Cortex-M0 is not support fault diagnosis */
#if (CMB_CPU_PLATFORM_TYPE != CMB_CPU_ARM_CORTEX_M0)regs.syshndctrl.value = CMB_SYSHND_CTRL;  // System Handler Control and State Registerregs.mfsr.value       = CMB_NVIC_MFSR;    // Memory Fault Status Registerregs.mmar             = CMB_NVIC_MMAR;    // Memory Management Fault Address Registerregs.bfsr.value       = CMB_NVIC_BFSR;    // Bus Fault Status Registerregs.bfar             = CMB_NVIC_BFAR;    // Bus Fault Manage Address Registerregs.ufsr.value       = CMB_NVIC_UFSR;    // Usage Fault Status Registerregs.hfsr.value       = CMB_NVIC_HFSR;    // Hard Fault Status Registerregs.dfsr.value       = CMB_NVIC_DFSR;    // Debug Fault Status Registerregs.afsr             = CMB_NVIC_AFSR;    // Auxiliary Fault Status Registerfault_diagnosis();
#endifprint_call_stack(stack_pointer);//在末尾处执行串口发送while (1){UartDbg_CheckSend();}
}

 Firmware name: CmBacktrace, hardware version: V1.00, software version: V1.00Fault on interrupt or bare metal(no OS) environment=================== Registers information ====================  R0 : 20015ca0  R1 : 00000064  R2 : 00000000  R3 : 00000001  R12: 00000001  LR : 7008fe8b  PC : 7008fdee  PSR: 01000000==============================================================Usage fault is caused by Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set)Show more call stack info by run: addr2line -e CmBacktrace.out -afpiC 7008fdee 7008fe8a 7009b45a 

2、ddr2line解析地址,解析出来函数名和行数,准确解析了trigger_hardfault_by_div0函数115行出错

0x7008fe8b
MainFunction
E:\tfs\12.5\Equipment\firmware\Smartsafe\MC\Source\User_5200N\UserIAR\MiddleControl/Main_Mid.c:171
0x7008fdee
trigger_hardfault_by_div0
E:\tfs\12.5\Equipment\firmware\Smartsafe\MC\Source\User_5200N\UserIAR\MiddleControl/Main_Mid.c:115
PS F:\CmBacktrace\tools\addr2line\win64> 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何管理间接需求?团队实践分享

管理间接需求的核心方法包括明确需求识别流程、建立规范的需求管理体系、实施有效的需求沟通机制。 其中&#xff0c;明确需求识别流程最为关键。企业在实际业务中&#xff0c;往往会遇到大量的间接需求&#xff0c;如非直接生产性的采购需求、服务类需求等。这些需求往往隐蔽性…

与Aspose.pdf类似的jar库分享

如果你在寻找类似于 Aspose.PDF 的 JAR 库&#xff0c;这些库通常用于处理 PDF 文档的创建、编辑、转换、合并等功能。以下是一些类似的 Java 库&#xff0c;它们提供 PDF 处理的功能&#xff0c;其中一些是收费的&#xff0c;但也有开源选项&#xff1a; 1. iText (iText PDF…

2-2 MATLAB鮣鱼优化算法ROA优化CNN超参数回归预测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 目录 0.引言 1.ROA优化CNN 2.主程序调用 3.结语 0.引言 在博客【ROA优化LSTM超参数回归】中&#xff0c;我们采用ROA对LSTM的学习率、迭代次数…

企业入驻成都国际数字影像产业园,可享150多项专业服务

企业入驻成都国际数字影像产业园&#xff0c;可享150多项专业服务 全方位赋能&#xff0c;助力影像企业腾飞 入驻成都国际数字影像产业园&#xff0c;企业将获得一个涵盖超过150项专业服务的全周期、一站式支持体系&#xff0c;旨在精准解决企业发展各阶段的核心需求&#xf…

线路板元器件介绍及选型指南:提高电路设计效率

电路板&#xff08;PCB&#xff09;是现代电子设备的核心&#xff0c;其上安装了各类电子元器件&#xff0c;这些元器件通过PCB的导电线路彼此连接&#xff0c;实现信号传输与功能执行。 元器件的选择与安装直接决定了电子产品的性能与稳定性。本文将为大家详细介绍电路板上的…

探究 Arm Compiler for Embedded 6 的 Clang 版本

原创标题&#xff1a;Arm Compiler for Embedded 6 的 Clang 版本 原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创日期&#xff1a;20250218&#xff08;首发日期20250326&#xff09; 原创连接&#xff1a;https://blog.csdn.net/liigo/article/details/14653…

RedHat7.6_x86_x64服务器(最小化安装)搭建使用记录(二)

PostgreSQL数据库部署管理 1.rpm方式安装 挂载系统安装镜像&#xff1a; [rootlocalhost ~]# mount /dev/cdrom /mnt 进入安装包路径&#xff1a; [rootlocalhost ~]# cd /mnt/Packages 依次安装如下程序包&#xff1a; [rootlocalhost Packages]# rpm -ihv postgresql-libs-9…

浏览器存储 IndexedDB

IndexedDB 1. 什么是 IndexedDB&#xff1f; IndexedDB 是一种 基于浏览器的 NoSQL 数据库&#xff0c;用于存储大量的结构化数据&#xff0c;包括文件和二进制数据。它比 localStorage 和 sessionStorage 更强大&#xff0c;支持索引查询、事务等特性。 IndexedDB 主要特点…

panda3d 渲染

目录 安装 设置渲染宽高&#xff1a; 渲染3d 安装 pip install Panda3D 设置渲染宽高&#xff1a; import panda3d.core as pdmargin 100 screen Tk().winfo_screenwidth() - margin, Tk().winfo_screenheight() - margin width, height (screen[0], int(screen[0] / 1…

Node.js 包管理工具 - NPM 与 PNPM 清理缓存

NPM 清理缓存 1、基本介绍 npm 缓存是 npm 用来存储已下载包的地方&#xff0c;以加快后续安装速度 但是&#xff0c;有时缓存可能会损坏或占用过多磁盘空间&#xff0c;这时可以清理 npm 缓存 2、清理操作 执行如下指令&#xff0c;清理 npm 缓存 npm cache clean --for…

STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调

导言 GPIO设置输入模式后&#xff0c;一般会用轮询的方式去查看GPIO的电平状态。比如&#xff0c;最常用的案例是用于检测按钮的当前状态&#xff08;是按下还是没按下&#xff09;。中断的使用一般用于计算脉冲的频率与计算脉冲的数量。 项目地址&#xff1a;https://github.…

【C++进阶二】string的模拟实现

【C进阶二】string的模拟实现 1.构造函数和C_strC_str: 2.operator[]3.拷贝构造3.1浅拷贝3.2深拷贝 4.赋值5.迭代器6.比较ascll码值的大小7.reverse扩容8.push_back尾插和append尾插9.10.insert10.1在pos位置前插入字符ch10.2在pos位置前插入字符串str 11.resize12.erase12.1从…

wokwi arduino mega 2560 - 点亮LED案例

截图&#xff1a; 点亮LED案例仿真截图 代码&#xff1a; unsigned long t[20]; // 定义一个数组t&#xff0c;用于存储20个LED的上次状态切换时间&#xff08;单位&#xff1a;毫秒&#xff09;void setup() {pinMode(13, OUTPUT); // 将引脚13设置为输出模式&#xff08;此…

vue3项目使用 python +flask 打包成桌面应用

server.py import os import sys from flask import Flask, send_from_directory# 获取静态文件路径 if getattr(sys, "frozen", False):# 如果是打包后的可执行文件base_dir sys._MEIPASS else:# 如果是开发环境base_dir os.path.dirname(os.path.abspath(__file…

后端学习day1-Spring(八股)--还剩9个没看

一、Spring 1.请你说说Spring的核心是什么 参考答案 Spring框架包含众多模块&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能&#xff0c;…

LeetCode 第34、35题

LeetCode 第34题&#xff1a;在排序数组中查找元素的第一个和最后一个位置 题目描述 给你一个按照非递减顺序排列的整数数组nums&#xff0c;和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target&#xff0c;返回[-1,1]。你必须…

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…

第十四届蓝桥杯真题

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…

《基于机器学习发电数据电量预测》开题报告

个人主页&#xff1a;大数据蟒行探索者 目录 一、选题背景、研究意义及文献综述 &#xff08;一&#xff09;选题背景 &#xff08;二&#xff09;选题意义 &#xff08;三&#xff09;文献综述 1. 国内外研究现状 2. 未来方向展望 二、研究的基本内容&#xff0c;拟解…

UWP程序用多页面实现应用实例多开

Windows 10 IoT ARM64平台下&#xff0c;UWP应用和MFC程序不一样&#xff0c;同时只能打开一个应用实例。以串口程序为例&#xff0c;如果用户希望同时打开多个应用实例&#xff0c;一个应用实例打开串口1&#xff0c;一个应用实例打开串口2&#xff0c;那么我们可以加载多个页…