码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Cortex-M3如何跳出BusFault,跳过出错代码,程序往下执行


    为了方便演示如何实现该方法,采用构造触发BusFault,方便分析

    1. 首先需要对系统Handler控制及状态寄存器SHCSR.MEMFAULTENA使能
      在这里插入图片描述

    2. 往SRAM reserved写入数据,触发BusFault

    在这里插入图片描述

    如上图所示,可以看到触发BusFault前BFSR寄存器第7为高,表示BFAR寄存器有效,且BFAR与MMAR寄存器一致,都为0xE000EDF8

    在这里插入图片描述

    此时,需要注意SP指针为0x2000A208,并且存储内容为0x2000A20C,这有助于找到触发BusFault,压栈前的SP指针

    在这里插入图片描述

    进入中断前PC指针为0x77B4,这个有利于分析压栈地址正确与否

    在这里插入图片描述

    1. 进入中断,如下图所示:
      在这里插入图片描述

    可以看到BFSR寄存器为14,为不精确的数据访问违例(violation,本来应该时精确的数据访问违例,不知道为啥后来变成这样了),LR寄存器赋值解释如下

    在这里插入图片描述

    并且SP指针为0x2000A1E8(这个很重要)。根据入栈顺序以及入栈后堆栈中的内容表可反推出旧的SP位置为新的SP+32

    在这里插入图片描述
    在这里插入图片描述

    可以发现,通过新SP+32的方式找到的旧SP与原来的SP一致

    在这里插入图片描述

    此时,新的SP+24就可以得到压栈前PC指针

    在这里插入图片描述

    通过对比可以发现此时0x77B4就是进入BusFault前,PC指针

    在这里插入图片描述

    也就是说假如清除中断标志位后退出中断,或者说出栈后PC指针就是该值。但是BusFault清除中断后退出中断,PC指针指向为该地址,并不会自动+4。因此还是会再次进入BusFault。这里就解释了为什么MemMange Fault, Bus Fault, Usage Fault清除中断标记位后还是出不来的原因

    因此,只需要在该地址上,给0x77B4+4,这样清除中断标记位后,就能使程序不再进入BusFault。

    1. 但是当程序往下运行时,可以程序又执行了一次压栈,SP指针由0x2000A1E8变成0x2000A1E0,SP指针减了8,故在采用SP指针修改PC指针的时候,一定要注意压栈的次数,SP改变次数,反推进入Handler时候的SP指针 我这里一共改变了12

    在这里插入图片描述

    1. 对BFSR寄存器清空,也就是清除中断标记位 注:USFR BFSR MFSR合称 CFSR

    在这里插入图片描述

    在这里插入图片描述

    1. 获取当前SP值,并进入Handler时候的SP指针,其中 24表示压栈后PC偏移地址,+24表示找到压栈后的PC地址,4*6表示压栈前的PC指针(这里指针同地址),可以看到修改后的PC值为0x77B8。此时程序往下执行便不会再次触发BusFault,程序往下继续执行。

    在这里插入图片描述

    便不会再次触发BusFault,程序往下继续执行。
    在这里插入图片描述

    注意:采用修改PC值跳出BusFault,最好在进入BusFault后不在有程序跳转,防止PC值改变,另外程序也应该尽量简短,防止压栈出栈次数太多破坏各寄存器值。并且触发BusFault的整体函数也应该减少程序调用。总之,通过修改PC值,在代码中不是一种好的方法。

  • 相关阅读:
    【数据库数据恢复】SQL SERVER数据库MDF (NDF)或LDF损坏怎么恢复数据?
    动态内存管理(malloc calloc realloc free)--- C语言
    Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果
    C#添加缓存,删除缓存,修改缓存
    java计算机毕业设计社区养老服务管理系统源程序+mysql+系统+lw文档+远程调试
    模式也能开盲盒,”盲返“模式带动电商平台共享经济
    Java环境变量的配置
    四嗪tz修饰PbSe硒化铅量子点|TZ-PbSe QDs
    【TS】函数重载--可选参数--默认参数
    python Django实现数据权限并使用MySQL保存角色一个简单的实例,定义模型来存储用户、角色和权限信息等
  • 原文地址:https://blog.csdn.net/qq_37619128/article/details/132741991
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号