问题现象
写了个测试程序,运行2小时后出现程序陷入死循环。设备已经死机。利用没有复位的剩余价值减少代码review的范围,
基础介绍
- 保存子程序返回地址。
- 当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。
- 程序计数寄存器R15
PC 指向当前的程序地址。如果修改它的值,就能改变程序的执行流。
实现原理
查看死机时PC,LR,SP三个特殊的寄存器的值。然后通过仿真中的汇编直接查找对应的程序。
实际操作
首先需要准备好jlink和三根杜邦线链接SDO、SCK和GND。千万不要连复位引脚,因为很有可能不小心复位了,导致案发现场被破坏。 然后打开Jlink Commander软件
1、敲入以下命令:connect 根据提示选择对应芯片 2、输入h : 可以看到对应指针的值,记下这三个值。因为我的程序都在sdram里面跑,在rt1052单片机中对应的地址都是0x80000000之后的。
3、可以试下g (go继续跑) 、h (halt)看下程序是否还在跑。因为我这边PC指针一直在这个值,所以怀疑是个死循环。 4、使用mem 指令看sp压栈的内容,我们找出附近所有0x80xxxxxxx开头的地址并进行记录。这里是小端模式 所以对应的应该是xx xx xx 80。(需要根据实际单片和代码在哪里运行分析,也可能是内部ram0x20xxxxxx,也可能是0x68xxxxxx的sram,stm32芯片外部扩展地址可能与nxp不一致,所以一定要看芯片手册) 5、断电重启或者另外一台设备进行仿真 输入需要查询的地址,注意需要加上0x,例如0x80015BBF 。先查PC和LR,如果没有什么发现再去看SP指针的那一堆数据中可疑的地址。 然后定位到了对应函数。这边是因为fifo队列满了导致死循环
|