杰理可视化SDK--系统死机异常调试

杰理可视化SDK--系统死机异常调试

  • 系统异常原因
  • 杰理SDK异常调试准备工作
  • 杰理SDK系统异常定位
    • 异常代码示例1
    • 异常代码示例2

在使用杰理可视化SDK进行软件开发时,往往会遇到一些系统异常问题,系统异常是指芯片在运行代码时,由于软件或硬件状态出错,当错误状态未在硬件或软件程序设计覆盖的容错范围,就会引起系统处于未知状态的异常。异常的结果是触发了“系统复位”或者进入“系统异常中断函数”。本篇文章介绍了使用杰理SDK定位系统运行过程中出现死机异常的一些方法。

系统异常原因

常见的系统异常原因主要有以下原因:

  1. CPU内部触发的异常
    程序跑飞:CPU运行到程序非指定地址软件流程,该异常通常由一些没有正确初始化的函数指针变量引起。
    除0异常:CPU在除法运算中除数为0,就会触发除0异常。
    非对齐内存访问:CPU运行WORD字节内存访问指令时,寻址寄存器不是4对齐的值,或者运行HALF-WORD内存访问指令时,寻址寄存器不是2对齐的值,就会触发非对齐内存访问异常。
    堆栈溢出:当CPU的堆栈超出所设定的限制范围时,就会出现堆栈溢出异常,该异常通常与任务用到的堆栈大于配置的堆栈大小引起。
  2. 内存相关异常
    读写非法内存地址:当CPU读写到非法的内存地址,非法内存地址主要包括:空白地址,只读地址、程序员使用MPU保护的内存地址。该异常主要由于buff野指针引起,或者动态申请内存在free buff后,还在访问buff的数据。
  3. 外设触发的异常
    看门狗超时:系统由于长时间没有清看门狗导致的系统异常,该问题常见原因是CPU负载过高,长时间没有进idle任务,或者在某个软件流程死循环,导致系统没有清看门狗。

杰理SDK异常调试准备工作

  1. 可视化配置工具配置打印异常信息
    在“板级配置”->“调试串口”选项中打开“打印异常信息”。
    开启打印异常信息

  2. 生成lst文件
    .lst文件是由ELF (Executable and Linkable Format) 文件通过objdump工具反汇编得到的列表文件。通过objdump命令生成的.lst文件可以显示源代码对应的汇编指令,这在软件调试和死机问题定位时非常有用。
    SDK默认不会生成.lst文件,需要手动修改download的脚本代码自动调用objdump来生成lst文件,这里是修改SDK目录下download.c文件(SDK/cpu/brxx/tools),修改如下图,表示将使用sdk.elf文件生成sdk.lst文件。
    生成lst文件
    上面修改后每次编译工程代码,tools目录下会生成一个sdk.lst文件。
    lst文件路径
    lst文件它通常包含了由软件生成的各种信息的列表, 是由objdump工具反汇编得到, 它包含了比.map文件更详细的调试信息,如每条指令的地址等。 在出现问题时提供重要的调试线索。 例如通过查看栈帧结构和在.lst文件中查找特定寄存器的地址,开发者可以快速定位到问题所在。

杰理SDK系统异常定位

异常代码示例1

如下程序中在其中的一个函数中插入了一段死循环。
异常代码示例1
当程序运行到这个位置时,可以看到程序日志打印中刷屏打印timer_no_response最后死机。如下图
死机打印1-1
具体来说timer_no_response是由于某个定时器没有响应而导致。需要排查是否是程序中的某个函数运行占用了太大CPU资源没有释放导致定时器的处理没有能正常运行响应导致,从而导致系统崩溃死机。
这里我们可以借助lst文件和死机打印时的backtrace,定位到造成异常死机的位置。
死机打印1-2
这里我们看RETS和RETI寄存器
RETI(Return from Interrupt):这是中断返回指令的寄存器,它将堆栈中保存的程序计数器的地址取出并送回PC,使程序从主程序的中断处继续执行。需要注意的是RETI所在位置的指令未被执行。
RETS(Return from Subroutine):这是从子程序返回的指令,通常用在非中断的子程序调用中。它的主要作用是将堆栈中的返回地址弹出到程序计数器(PC),以便程序可以继续执行调用子程序之后的下一条指令。
根据上面RETI信息排查到代码action_a2dp_play_next()函数中出现的问题,即定位到了异常代码的位置。
定位异常位置1

异常代码示例2

如下代码中演示了空指针引用造成的系统异常。如下图代码中定义了一个指向函数的指针,并将其初始化为NULL。接下来,我们尝试通过调用ptr()来执行该空函数指针,但由于ptr是空指针,因此调用了之后会导致程序崩溃并死机。
异常代码示例2
从耳机运行日志log中发现当代码运行到这段程序的时候发生了死机。
死机打印2-1
由前面的方法查看lst文件和RETS寄存器可以定位到出问题代码发生在
action_enter_low_latency_mode()函数中。
定位异常位置2

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

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

相关文章

图简记。。

模仿&#xff1a; algorithm-journey/src/class059/Code01_CreateGraph.java at main algorithmzuo/algorithm-journey Code01_CreateGraph C语言&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAXN 11 #define MAX…

Linux 常用命令与 Shell 简介

文章目录 **Linux 常用命令与 Shell 简介****Shell 简介****什么是 Shell&#xff1f;****Shell 的工作原理****常见 Shell 类型****命令行基础****Tab 补全与通配符** **Linux 常用命令****1. 入门必备命令****1.1 寻求帮助 - man 命令****1.2 用户间切换 - su 命令****1.3 特…

基于51单片机的超声波智能避障小车仿真

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;超声波实时测量小车与障碍物间的距离&#xff0c;并用LCD1602显示。 &#xff08;2&#xff09;当测得的距离超过50时&#xff0c;前进电机转动&#xff08;模拟后轮&#…

AIGC工具平台-GPT-SoVITS-v4-TTS音频推理克隆

声音克隆与语音合成的结合&#xff0c;是近年来生成式AI在多模态方向上的重要落地场景之一。随着预训练模型能力的增强&#xff0c;结合语音识别、音素映射与TTS合成的端到端系统成为初学者可以上手实践的全流程方案。 围绕 GPT-SoVITS-v4-TTS 模块&#xff0c;介绍了其在整合…

Android7 Input(十)View 处理Input事件pipeline

概述: 本文主要描述View对InputEvent事件pipeline处理过程。 本文涉及的源码路径 frameworks/base/core/java/android/view/ViewRootImpl.java InputEvent事件处理 View处理input事件是调用doProcessInputEvents方法&#xff0c;如下所示: void doProcessInputEvents() {//…

Neo4j 完全指南:从入门到精通

第1章&#xff1a;Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…

网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件

目录 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件网心云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…

摄像机ISP处理流程

1.Bayer&#xff1a;生成raw图&#xff0c;添加色彩数据&#xff08;RGB&#xff09;&#xff0c;一般会将G的占比设置为R和B的和&#xff0c;实例&#xff1a; 2.黑电平矫正&#xff1a;减去暗电流造成的误差&#xff1b; 3.镜头矫正&#xff1a;对四周的亮度进行矫正&#x…

【后端架构师的发展路线】

后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程&#xff0c;需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型&#xff1a; 一、职业发展阶梯‌ 初级工程师&#xff08;1-3年&#xff09;‌ 核心能力‌&#xff1a;掌…

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili

RabbitMQ如何保证消息可靠性

RabbitMQ是一个流行的开源消息代理&#xff0c;它提供了可靠的消息传递机制&#xff0c;广泛应用于分布式系统和微服务架构中。在现代应用中&#xff0c;确保消息的可靠性至关重要&#xff0c;以防止消息丢失和重复处理。本文将详细探讨RabbitMQ如何通过多种机制保证消息的可靠…

批量图片管理软件介绍

软件介绍 本文介绍一款功能全面的图片处理软件 - FastStone Image Viewer。 软件功能概述 FastStone Image Viewer不仅支持图片查看&#xff0c;还具备编辑、批量重命名和批量转换等多种实用功能。 用户授权说明 该软件对个人用户完全免费&#xff0c;企业用户只需输入用户…

Playwright 测试框架 - Java

🚀【Playwright + Java 实战教程】从零到一掌握自动化测试利器! 🔧 本文专为 Java 开发者量身打造,通过详尽示例带你快速掌握 Playwright 自动化测试。涵盖基础操作、表单交互、测试框架集成、高阶功能及常见实战技巧,适用于企业 UI 测试与 CI/CD 场景。 🛠️ 一、环境…

nvidia系列教程-Usb otg模式修改为host模式

目录 前言 一、了解 USB OTG 模式与 Host 模式 二、host模式切换 总结 前言 在 NVIDIA 设备的使用过程中,有时我们需要将 USB OTG(On-The-Go)模式切换为 Host 模式,以满足连接外部设备(如 U 盘、鼠标、键盘等)的需求。本文将详细介绍如何在 NVIDIA 设备上进行这一模式…

二叉树-104.二叉树的最大深度-力扣(LeetCode)

一、题目解析 这里需要注意根节点的深度是1&#xff0c;也就是说计算深度的是从1开始计算的 二、算法原理 解法1&#xff1a;广度搜索&#xff0c;使用队列 解法2&#xff1a;深度搜索&#xff0c;使用递归 当计算出左子树的深度l&#xff0c;与右子树的深度r时&#xff0c;…

Calendar类日期设置进位问题

背景 报表需求&#xff0c;需要传递每组数据中最小的日期&#xff0c;后台根据传递的最小日期&#xff0c;向前取参数传递的月份的上个月为结束时间的近五个月数据 例&#xff1a;参数传:2025/02&#xff0c;则需返回2025/01, 2024/12, 2024/11, 2024/10, 2024/09这五个年月数据…

编程笔记---问题小计

编程笔记 qml ProgressBar 为什么valuemodel.progress / 100 在QML中&#xff0c;ProgressBar的value属性用于表示进度条的当前进度值&#xff0c;其范围通常为0到1&#xff08;或0%到100%&#xff09;。当使用model.progress / 100来设置value时&#xff0c;这样做的原因是为…

【STL】函数对象+常用算法

文章目录 STL- 函数对象函数对象函数对象使用 谓词一元谓词二元谓词内建函数对象算术仿函数关系仿函数 STL- 常用算法常用遍历算法for_eachtransform 常用查找算法findfind_ifadjacent_findbinary_searchcountcount_if 常用排序算法sortrandom_shufflemergereverse 常用拷贝和替…

[JVM] JVM内存调优

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】

上一篇&#xff1a;《Spring Boot 从Socket 到Netty网络编程&#xff08;上&#xff09;&#xff1a;SOCKET 基本开发&#xff08;BIO&#xff09;与改进(NIO)》 前言 前文中我们简单介绍了基于Socket的BIO&#xff08;阻塞式&#xff09;与NIO&#xff08;非阻塞式&#xff0…