在芯片测试的时候,我们有时候会碰到Bus Error的情况,这种情况下程序会进到bus error的中断中,中断返回的时候,再次回到原来位置,访问地址的时候再次进入中断,这样就造成程序不停进中断,导致正常测试被打断。为了避免这种情况的发生,我们需要修改程序返回的地址,这里面涉及的东西就有点复杂了,这里简单记录一下。

问题分析

上面例子中,我们访问了一个非法的地址产生中断,程序会将必要的寄存器压栈之后跳转到中断中执行,中断执行完毕之后,从栈中取出之前的程序指针继续执行。

这个流程比较简单,其实问题的解决方法也在这个流程里面,因为中断返回之后还是回到出问题的地址,再次运行引发连续中断,所以我们只需要将程序返回到的地址加一个偏移,直接让他到下一条指令就好了(暂时先不管16位和32位指令,统一认为是32位的指令,即使是16位指令,我们可以直接跳过两条指令)。如果想维持程序运行完整性,可以在预期出现中断的指令后面加若干NOP指令。

代码实现

因为牵扯到对程序栈的操作,所以一般的C语言是搞不定的,这里我们就必须通过汇编实现:

typedef struct {uint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12;uint32_t lr;uint32_t pc;uint32_t psr;
} hw_stackframe_t;
void default_isr(void)
{// set up arguments and call _hardfault_israsm("mov    r0, lr\n"       // arg 0"mrs    r1, psp\n"      // arg 1"mrs    r2, msp\n"      // arg 2"b      _default_isr\n");
}
static void _default_isr(uint32_t lr, void *psp, void *msp) __attribute__((used));
static void _default_isr(uint32_t lr, void *psp, void *msp)
{#define VECTORNUM                     (*(volatile uint8_t*)(0xE000ED04))hw_stackframe_t *frame;// Find the active stack pointer (MSP or PSP)if(lr & 0x4)frame = psp;elseframe = msp;printf("\r\n** HARD FAULT **\r\n\tpc=0x%x\r\n\tmsp=0x%p\r\n\tpsp=0x%p\r\n",frame->pc, msp, psp);printf("\r\n****default_isr entered on vector %d*****\r\n",VECTORNUM);// add PC by 4frame->pc += 4;return;
}

上述代码中的结构体就是描述了一个堆栈信息,汇编中会直接将lrpspmsp存入r0~2作为参数,然后跳转到_default_isr中实现参数调用,这样lrpspmsp就直接成为C函数的参数,我们也就可以很方便的使用里面的内容了,得到这几个寄存器的值之后我们判断当前用到的堆栈指针地址,并让我们定义的结构体指针指向这个地址,之后就可以通过结构体实现对堆栈中内容进行读写操作了。

这里我们就是简单的把PC加4就可以了。

ARM中Bus Error的测试相关推荐

  1. pve远程连接 spcie_PVE相关 篇一:解决CX341a PVE 中报错PCIe Bus Error

    PVE相关 篇一:解决CX341a PVE 中报错PCIe Bus Error 2020-07-19 16:18:39 1点赞 0收藏 0评论 最近入了一块洋垃圾cx341a,用的x4转接板插在x16 ...

  2. C 总线错误 (bus error) - 段错误 (segmentation fault)

    C 总线错误 (bus error) - 段错误 (segmentation fault) 两个常见的运行时错误: bus error (core dumped) - 总线错误 (信息已转储) seg ...

  3. 前端开发中的Error以及异常捕获

    本文首发于公众号:符合预期的CoyPan 写在前面 在前端项目中,由于JavaScript本身是一个弱类型语言,加上浏览器环境的复杂性,网络问题等等,很容易发生错误.做好网页错误监控,不断优化代码,提 ...

  4. 基于python渗透测试_Python中基于属性的测试简介

    基于python渗透测试 by Shashi Kumar Raja 由Shashi Kumar Raja Python中基于属性的测试简介 (Intro to property-based testi ...

  5. python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  6. 二维中的OBB相交测试

    二维中的OBB相交测试 置顶2013年10月23日 21:05:53 阅读数:2087 1. 背景知识 OBB全称oriented bounding box,比AABB(axis-aligned bo ...

  7. 关于在ARM中的函数调用问题

    本人菜鸟一只,最近在学习arm汇编,做一个关于函数调用的笔记,如果有出错的地方希望大牛们指出. 以下汇编代码均为MDK5所生成的 首先看一个简单的例子 int main(void) { int a=1 ...

  8. pytorch报错“RuntimeError: DataLoader worker (pid 83709) is killed by signal: Bus error. It is .......“

    在docker容器里运行pytorch写的代码,报错:"RuntimeError: DataLoader worker (pid 83709) is killed by signal: Bu ...

  9. GameBench企业版中关于FPS的测试项分析

    GameBench企业版中关于FPS的测试项分析 本文是基于GameBench提供的企业版的英文文档再加自己的理解把FPS的相关测试项进行了分析,如有版权问题请联系我及时删除. 前记 GameBenc ...

最新文章

  1. 线上出现死锁怎么解决?
  2. 从科幻灵感开始的一场数据存储基础设施实验之旅
  3. H5的学习从0到1-H5的实体(14)
  4. go标准库的学习-fmt
  5. c语言辗转相除法求最大公约数_趣味探究:妙法求“最大公因数”,比书上难一点,你敢挑战吗?(适合56年级)...
  6. 20 张图揭开内存管理的迷雾,瞬间豁然开朗
  7. Windows下Subversion配置管理员指南
  8. [译]用javascript实现一门编程语言-语言构想
  9. 基于增量更新的协同过滤
  10. [2019杭电多校第五场][hdu6630]permutation 2
  11. mapxtreme2008 7.0错误
  12. MV178——我的心灵家园
  13. 读书笔记《松本行弘的程序世界》
  14. 计算机程序文献类别代码,论文参考文献类型代码参考
  15. PHP 生成 ppt,php在线编辑器fckedìtor应用.ppt
  16. 利用猜根法求解三阶行列式的特征值
  17. 10_微信小程序-BLE低功耗蓝牙开发-连接设备
  18. 计算机语言有几进制,一个字节由几个二进制位组成(计算机系统有什么两部分组成)...
  19. 编程求解丢番图方程的原理
  20. 什么是连连一键开店?连连一键开店是怎么操作的?

热门文章

  1. linux系统切换用户
  2. 将字符串中的URL 解析,获取内容
  3. [No000053]我25岁了,是应该继续挣钱,还是选择自己的爱好?--正好庆祝自己25岁生日...
  4. nodejs async
  5. [转]WF4.0 基础篇 (一)开始使用WF
  6. php图片去噪,python 图片去噪的方法示例
  7. 用共振频率去进行图片分类的尝试
  8. linux条件表达式例子,Linux的Iptables命令的基本知识(三)-常用匹配条件示例和执行动作...
  9. 3.8 Anchor Boxes-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  10. 8.5 特征选择-机器学习笔记-斯坦福吴恩达教授