热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RTThread故障定位技术详解与应用

本文深入解析了RTThread操作系统中的HardFault_Handler机制,详细探讨了其在故障定位中的应用与实现方法,为开发者提供了有效的调试工具和策略,有助于提升系统的稳定性和可靠性。

转载:https://blog.csdn.net/suny1234/article/details/89419075

在《RTThread中HardFault_Handler分析》一文中已经分析了RTThread中对于fault中断的处理方法。接下来讲解如何根据错误输出信息对程序出现fault的位置进行定位。

rtthread_simulator_v0.1.0 工程中的main.c中的我们添加以下3行代码

void(*fp)(void) ; //1
int main(void)
{fp = 0; //2fp(); //3return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

编译后按ctrl+5进入软件仿真状态,全速运行后,UART#1窗口输出如下信息

在这里插入图片描述

由此可见运行时候发生了fault,通过《RTThread中HardFault_Handler分析》的内容我们可以知道,输出窗口中打印出来了各个


  • 寄存器的状态

    usage fault:

    psr: 0x60000000
    r00: 0x00000000
    r01: 0x20000000
    r02: 0x00000014
    r03: 0x0000000a
    r04: 0x00000000
    r05: 0xdeadbeef
    r06: 0xdeadbeef
    r07: 0xdeadbeef
    r08: 0xdeadbeef
    r09: 0xdeadbeef
    r10: 0xdeadbeef
    r11: 0xdeadbeef
    r12: 0x00000000
    lr: 0x08000151
    pc: 0x00000000

  • 出错的线程:main

    hard fault on thread: main

  • 具体的错误信息:用法 fault ,状态寄存器(UFSR) 值为 0x02 即视图切换到ARM状态

    usage fault:
    SCB_CFSR_UFSR:0x02 INVSTATE

上述寄存器信息中,lr寄存器中的值为0x08000151 ,此值为进入fault异常中断之前的lr的值。

我们知道lr为连接寄存器里面保存的是调用子程序之前的PC的值。 因为 CM3 内部 使用了指令流水线,读 PC 时返回的值是当前指令的地址+4 ,所以进入异常之前自动加载到lr的值也为调用子程序前的指令地址+4。由于PC的最低位保存ARM/Thumb 运行状态,Cortex-M3只能运行在Thumb 状态,即LSB = 1。所以我们想要找到出错误程序的指令位置, 只需要对打印出来的lr的值减去5即可。

0x08000151 减去5后为0x0800014C 说明我们程序出错位置在PC = 0x0800014C 附近。

在Disassembly窗口下,我们找到0x0800014C 指令位置

在这里插入图片描述

可以看到 0x0800014C 指令位置正好在fp()代码段内。

我们进一步分析产生错误的原因,根据打

用法 fault 状态寄存器(UFSR),地址:0xE000_ED2A

main()函数中我们将函数指针fp的值设为了0,然后去调用fp(),相当于让程序跳转到0地址处去运行。实际上真正出错的地方是0x0800014E处,这里执行了一条BLX 跳转指令,执行完将r0的值0更新到了PC,即PC=0。PC的最低位LSB被更新成了0,试图切换到ARM状态,状态寄存器(UFSR) 中的 INVSTATE 位被置位 ,因此产生了fault。


推荐阅读
  • 深入解析C语言中的大小端字节序存储机制
    在C语言中,当编译器执行“创建变量”的指令时,会为该变量在内存中分配相应的存储空间。对于整型变量,其值通常以二进制补码形式存储。此外,不同系统采用的大端或小端字节序对数据的实际存储方式有显著影响,理解这些机制有助于开发者更好地控制数据的读写过程。 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
  • 7.2 利用关系运算符与表达式进行数值对比分析
    在C语言中,关系运算符和表达式是进行数值对比分析的基础工具。本节详细介绍了真值的概念及其在编程中的应用,包括布尔类型(_Bool)的引入,以及关系运算符的优先级。通过具体示例,展示了如何在 `while` 循环中使用关系表达式来控制程序流程。这些内容对于理解和编写高效的条件判断逻辑至关重要。 ... [详细]
  • 内网渗透技术详解:PTH、PTT与PTK在域控环境中的应用及猫盘内网穿透配置
    本文深入探讨了内网渗透技术,特别是PTH、PTT与PTK在域控环境中的应用,并详细介绍了猫盘内网穿透的配置方法。通过这些技术,安全研究人员可以更有效地进行内网渗透测试,解决常见的渗透测试难题。此外,文章还提供了实用的配置示例和操作步骤,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 算术表达式分析与解析技术初探
    本文初步探讨了算术表达式的分析与解析技术,针对作者在职业转型过程中发现自身算法基础薄弱的问题,决定在接下来的三个月内,系统地学习和掌握常用数据结构与算法,以提升个人技术能力。研究内容不仅涵盖了基本的算术表达式解析方法,还深入讨论了其在实际应用中的优化策略,为相关领域的进一步研究奠定了基础。 ... [详细]
  • 本文介绍了如何利用 `boost::asio` 库实现高效的异步 TCP 编程。与传统的同步方式不同,异步编程允许程序在发起 I/O 操作后立即返回,继续执行其他任务,从而显著提高系统的响应速度和整体性能。通过具体的代码示例和详细解释,本文展示了如何在实际应用中充分利用 `boost::asio` 的强大功能,实现高效、可靠的网络通信。 ... [详细]
  • 本文深入探讨了 `const` 和 `readonly` 关键字在编程中的核心区别及其具体应用场景。`const` 主要用于声明不可变的常量,确保其值在编译时即确定且不可更改。相比之下,`readonly` 允许在构造函数中对字段进行初始化,并在对象创建后保持不变。文章详细分析了这两种关键字的语法特点、使用场景以及它们在不同编程环境下的优劣。此外,还提供了多个示例,帮助读者更好地理解和应用这些概念。 ... [详细]
  • PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化
    PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化 ... [详细]
  • 本文通过复旦大学自然语言处理课程中的一个具体案例,详细解析了中文词汇分割技术的实现方法。该案例利用Java编程语言,结合词典和算法模型,展示了如何高效地进行中文文本的词汇分割,为相关研究和应用提供了宝贵的参考。 ... [详细]
  • Android数组截取技巧及JNI数组交互在仓库构建中的应用分析
    在Android开发中,数组截取技巧和JNI数组交互在仓库构建中的应用具有重要意义。JNI提供了两种主要的数组处理方法:一是生成原生层数组的副本,二是直接通过数组指针进行操作。在进行字符串处理时,如果需要执行其他复杂操作,可以结合这两种方法以提高效率和灵活性。此外,合理利用这些技术可以显著提升应用程序的性能和稳定性。 ... [详细]
  • 深入解析MySQL Replication中的并行复制机制与实例应用【MySQL进阶教程】
    本文深入探讨了MySQL 5.6版本后引入的并行复制机制,详细解析了其工作原理及优化效果。通过具体实例,展示了如何在实际环境中配置和使用并行复制,以提高数据同步效率和系统性能。 ... [详细]
  • 谷歌工程师:TensorFlow已重获新生;网友:我还是用PyTorch
    乾明发自凹非寺量子位报道|公众号QbitAI道友留步!TensorFlow已重获新生。在“PyTorch真香”的潮流中,有人站出来为TensorFlow说话了。这次来自谷歌的工程师 ... [详细]
  • 构建Java自定义持久层框架:实现数据访问与存储的高效解决方案
    JDBC连接数据库步骤:Connection连接对象,PreparedStatement ... [详细]
  • iOS 开发深度解析:探究底层缓存机制 Cache_t 的实现细节与优化策略
    iOS 开发深度解析:探究底层缓存机制 Cache_t 的实现细节与优化策略 ... [详细]
  • SaaS(SoftwareasaService:软件即服务)SaaS是一种通过Internet提供软件的模式,用户不用再购买软件,而改用向提供商租用基于web的软件,来管理企业经营 ... [详细]
author-avatar
小湿基_517
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有